Skip to content

Commit 4554be1

Browse files
authored
OTLP gRPC log exporter (#1048)
1 parent 8ddf9d3 commit 4554be1

File tree

14 files changed

+549
-38
lines changed

14 files changed

+549
-38
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Increment the:
1515

1616
## [Unreleased]
1717

18+
* [EXPORTER] Add OTLP/gRPC Log Exporter ([#1048](https://github.com/open-telemetry/opentelemetry-cpp/pull/1048))
1819
* [EXPORTER] Prometheus Exporter ([#1031](https://github.com/open-telemetry/opentelemetry-cpp/pull/1031))
1920
* [EXPORTER] Add OTLP/HTTP Log Exporter ([#1030](https://github.com/open-telemetry/opentelemetry-cpp/pull/1030))
2021

cmake/opentelemetry-cpp-config.cmake.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
# opentelemetry-cpp::in_memory_span_exporter - Imported target of opentelemetry-cpp::in_memory_span_exporter
3232
# opentelemetry-cpp::otlp_recordable - Imported target of opentelemetry-cpp::otlp_recordable
3333
# opentelemetry-cpp::otlp_grpc_exporter - Imported target of opentelemetry-cpp::otlp_grpc_exporter
34+
# opentelemetry-cpp::otlp_grpc_log_exporter - Imported target of opentelemetry-cpp::otlp_grpc_log_exporter
3435
# opentelemetry-cpp::otlp_http_client - Imported target of opentelemetry-cpp::otlp_http_client
3536
# opentelemetry-cpp::otlp_http_exporter - Imported target of opentelemetry-cpp::otlp_http_exporter
3637
# opentelemetry-cpp::otlp_http_log_exporter - Imported target of opentelemetry-cpp::otlp_http_log_exporter

cmake/opentelemetry-proto.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ add_library(
164164
${TRACE_SERVICE_PB_CPP_FILE}
165165
${TRACE_SERVICE_GRPC_PB_CPP_FILE}
166166
${LOGS_SERVICE_PB_CPP_FILE}
167-
${LOGS_SERVICE_GRPCPB_CPP_FILE}
167+
${LOGS_SERVICE_GRPC_PB_CPP_FILE}
168168
${METRICS_SERVICE_PB_CPP_FILE}
169169
${METRICS_SERVICE_GRPC_PB_CPP_FILE})
170170

examples/otlp/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ OpenTelemetry Collector with an OTLP receiver by running:
3232
- On Unix based systems use:
3333

3434
```console
35-
docker run --rm -it -p 4317:4317 -p 4318:4318 -v $(pwd)/examples/otlp:/cfg otel/opentelemetry-collector:0.37.0 --config=/cfg/opentelemetry-collector-config/config.dev.yaml
35+
docker run --rm -it -p 4317:4317 -p 4318:4318 -v $(pwd)/examples/otlp:/cfg otel/opentelemetry-collector:0.38.0 --config=/cfg/opentelemetry-collector-config/config.dev.yaml
3636
```
3737

3838
- On Windows use:
3939

4040
```console
41-
docker run --rm -it -p 4317:4317 -p 4318:4318 -v "%cd%/examples/otlp":/cfg otel/opentelemetry-collector:0.37.0 --config=/cfg/opentelemetry-collector-config/config.dev.yaml
41+
docker run --rm -it -p 4317:4317 -p 4318:4318 -v "%cd%/examples/otlp":/cfg otel/opentelemetry-collector:0.38.0 --config=/cfg/opentelemetry-collector-config/config.dev.yaml
4242
```
4343

4444
Note that the OTLP gRPC and HTTP exporters connects to the Collector at `localhost:4317` and `localhost:4318/v1/traces` respectively. This can be changed with first argument from command-line, for example:

examples/otlp/opentelemetry-collector-config/config.dev.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ receivers:
77
grpc:
88
endpoint: 0.0.0.0:4317
99
http:
10-
endpoint: "0.0.0.0:4318"
10+
endpoint: 0.0.0.0:4318
1111
cors_allowed_origins:
1212
- '*'
1313
service:
@@ -17,3 +17,8 @@ service:
1717
- otlp
1818
exporters:
1919
- logging
20+
logs:
21+
receivers:
22+
- otlp
23+
exporters:
24+
- logging

exporters/otlp/BUILD

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ cc_library(
4848
hdrs = [
4949
"include/opentelemetry/exporters/otlp/otlp_environment.h",
5050
"include/opentelemetry/exporters/otlp/otlp_grpc_exporter.h",
51+
"include/opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h",
5152
"include/opentelemetry/exporters/otlp/protobuf_include_prefix.h",
5253
"include/opentelemetry/exporters/otlp/protobuf_include_suffix.h",
5354
],
@@ -129,8 +130,32 @@ cc_library(
129130
deps = [
130131
":otlp_http_client",
131132
":otlp_recordable",
132-
"//sdk/src/trace",
133-
"@com_github_opentelemetry_proto//:trace_service_proto_cc",
133+
"//sdk/src/logs",
134+
"@com_github_opentelemetry_proto//:logs_service_proto_cc",
135+
],
136+
)
137+
138+
cc_library(
139+
name = "otlp_grpc_log_exporter",
140+
srcs = [
141+
"src/otlp_grpc_log_exporter.cc",
142+
],
143+
hdrs = [
144+
"include/opentelemetry/exporters/otlp/otlp_environment.h",
145+
"include/opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h",
146+
"include/opentelemetry/exporters/otlp/otlp_grpc_log_exporter.h",
147+
"include/opentelemetry/exporters/otlp/protobuf_include_prefix.h",
148+
"include/opentelemetry/exporters/otlp/protobuf_include_suffix.h",
149+
],
150+
strip_include_prefix = "include",
151+
deps = [
152+
":otlp_recordable",
153+
"//ext:headers",
154+
"//sdk/src/logs",
155+
"@com_github_opentelemetry_proto//:logs_service_proto_cc",
156+
# For gRPC
157+
"@com_github_opentelemetry_proto//:logs_service_grpc_cc",
158+
"@com_github_grpc_grpc//:grpc++",
134159
],
135160
)
136161

@@ -173,6 +198,17 @@ cc_test(
173198
],
174199
)
175200

201+
cc_test(
202+
name = "otlp_grpc_log_exporter_test",
203+
srcs = ["test/otlp_grpc_log_exporter_test.cc"],
204+
deps = [
205+
":otlp_grpc_log_exporter",
206+
"//api",
207+
"//sdk/src/logs",
208+
"@com_google_googletest//:gtest_main",
209+
],
210+
)
211+
176212
otel_cc_benchmark(
177213
name = "otlp_grpc_exporter_benchmark",
178214
srcs = ["test/otlp_grpc_exporter_benchmark.cc"],

exporters/otlp/CMakeLists.txt

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,21 @@ if(WITH_OTLP_GRPC)
2222
set_target_properties(opentelemetry_exporter_otlp_grpc
2323
PROPERTIES EXPORT_NAME otlp_grpc_exporter)
2424

25-
target_link_libraries(
26-
opentelemetry_exporter_otlp_grpc PUBLIC opentelemetry_otlp_recordable
27-
protobuf::libprotobuf gRPC::grpc++)
25+
target_link_libraries(opentelemetry_exporter_otlp_grpc
26+
PUBLIC opentelemetry_otlp_recordable gRPC::grpc++)
2827

2928
list(APPEND OPENTELEMETRY_OTLP_TARGETS opentelemetry_exporter_otlp_grpc)
29+
30+
add_library(opentelemetry_exporter_otlp_grpc_log
31+
src/otlp_grpc_log_exporter.cc)
32+
33+
set_target_properties(opentelemetry_exporter_otlp_grpc_log
34+
PROPERTIES EXPORT_NAME otlp_grpc_log_exporter)
35+
36+
target_link_libraries(opentelemetry_exporter_otlp_grpc_log
37+
PUBLIC opentelemetry_otlp_recordable gRPC::grpc++)
38+
39+
list(APPEND OPENTELEMETRY_OTLP_TARGETS opentelemetry_exporter_otlp_grpc_log)
3040
endif()
3141

3242
if(WITH_OTLP_HTTP)
@@ -71,6 +81,7 @@ if(WITH_OTLP_HTTP)
7181
opentelemetry_exporter_otlp_http_client)
7282

7383
list(APPEND OPENTELEMETRY_OTLP_TARGETS opentelemetry_exporter_otlp_http_log)
84+
7485
endif()
7586
endif()
7687

@@ -124,6 +135,19 @@ if(BUILD_TESTING)
124135
TARGET otlp_grpc_exporter_test
125136
TEST_PREFIX exporter.otlp.
126137
TEST_LIST otlp_grpc_exporter_test)
138+
139+
if(WITH_LOGS_PREVIEW)
140+
add_executable(otlp_grpc_log_exporter_test
141+
test/otlp_grpc_log_exporter_test.cc)
142+
target_link_libraries(
143+
otlp_grpc_log_exporter_test ${GTEST_BOTH_LIBRARIES}
144+
${CMAKE_THREAD_LIBS_INIT} ${GMOCK_LIB}
145+
opentelemetry_exporter_otlp_grpc_log opentelemetry_logs)
146+
gtest_add_tests(
147+
TARGET otlp_grpc_log_exporter_test
148+
TEST_PREFIX exporter.otlp.
149+
TEST_LIST otlp_grpc_log_exporter_test)
150+
endif()
127151
endif()
128152

129153
if(WITH_OTLP_HTTP)

exporters/otlp/include/opentelemetry/exporters/otlp/otlp_grpc_exporter.h

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,14 @@
1414
#include "opentelemetry/sdk/trace/exporter.h"
1515

1616
#include "opentelemetry/exporters/otlp/otlp_environment.h"
17+
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
1718

1819
OPENTELEMETRY_BEGIN_NAMESPACE
1920
namespace exporter
2021
{
2122
namespace otlp
2223
{
2324

24-
/**
25-
* Struct to hold OTLP exporter options.
26-
*/
27-
struct OtlpGrpcExporterOptions
28-
{
29-
// The endpoint to export to. By default the OpenTelemetry Collector's default endpoint.
30-
std::string endpoint = GetOtlpDefaultGrpcEndpoint();
31-
// By default when false, uses grpc::InsecureChannelCredentials(); If true,
32-
// uses ssl_credentials_cacert_path if non-empty, else uses ssl_credentials_cacert_as_string
33-
bool use_ssl_credentials = GetOtlpDefaultIsSslEnable();
34-
// ssl_credentials_cacert_path specifies path to .pem file to be used for SSL encryption.
35-
std::string ssl_credentials_cacert_path = GetOtlpDefaultSslCertificatePath();
36-
// ssl_credentials_cacert_as_string in-memory string representation of .pem file to be used for
37-
// SSL encryption.
38-
std::string ssl_credentials_cacert_as_string = GetOtlpDefaultSslCertificateString();
39-
// Timeout for grpc deadline
40-
std::chrono::system_clock::duration timeout = GetOtlpDefaultTimeout();
41-
// Additional HTTP headers
42-
OtlpHeaders metadata = GetOtlpDefaultHeaders();
43-
};
44-
4525
/**
4626
* The OTLP exporter exports span data in OpenTelemetry Protocol (OTLP) format.
4727
*/
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/exporters/otlp/otlp_environment.h"
7+
8+
#include <memory>
9+
10+
OPENTELEMETRY_BEGIN_NAMESPACE
11+
namespace exporter
12+
{
13+
namespace otlp
14+
{
15+
16+
/**
17+
* Struct to hold OTLP exporter options.
18+
*/
19+
struct OtlpGrpcExporterOptions
20+
{
21+
// The endpoint to export to. By default the OpenTelemetry Collector's default endpoint.
22+
std::string endpoint = GetOtlpDefaultGrpcEndpoint();
23+
// By default when false, uses grpc::InsecureChannelCredentials(); If true,
24+
// uses ssl_credentials_cacert_path if non-empty, else uses ssl_credentials_cacert_as_string
25+
bool use_ssl_credentials = GetOtlpDefaultIsSslEnable();
26+
// ssl_credentials_cacert_path specifies path to .pem file to be used for SSL encryption.
27+
std::string ssl_credentials_cacert_path = GetOtlpDefaultSslCertificatePath();
28+
// ssl_credentials_cacert_as_string in-memory string representation of .pem file to be used for
29+
// SSL encryption.
30+
std::string ssl_credentials_cacert_as_string = GetOtlpDefaultSslCertificateString();
31+
// Timeout for grpc deadline
32+
std::chrono::system_clock::duration timeout = GetOtlpDefaultTimeout();
33+
// Additional HTTP headers
34+
OtlpHeaders metadata = GetOtlpDefaultHeaders();
35+
};
36+
37+
} // namespace otlp
38+
} // namespace exporter
39+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
#ifdef ENABLE_LOGS_PREVIEW
6+
7+
// clang-format off
8+
9+
# include "opentelemetry/exporters/otlp/protobuf_include_prefix.h"
10+
# include "opentelemetry/proto/collector/logs/v1/logs_service.grpc.pb.h"
11+
# include "opentelemetry/exporters/otlp/protobuf_include_suffix.h"
12+
13+
// clang-format on
14+
15+
# include "opentelemetry/exporters/otlp/otlp_environment.h"
16+
# include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
17+
# include "opentelemetry/sdk/logs/exporter.h"
18+
19+
OPENTELEMETRY_BEGIN_NAMESPACE
20+
namespace exporter
21+
{
22+
namespace otlp
23+
{
24+
25+
/**
26+
* The OTLP exporter exports log data in OpenTelemetry Protocol (OTLP) format in gRPC.
27+
*/
28+
class OtlpGrpcLogExporter : public opentelemetry::sdk::logs::LogExporter
29+
{
30+
/**
31+
* Create an OtlpGrpcLogExporter with default exporter options.
32+
*/
33+
OtlpGrpcLogExporter();
34+
35+
/**
36+
* Create an OtlpGrpcLogExporter with user specified options.
37+
* @param options An object containing the user's configuration options.
38+
*/
39+
OtlpGrpcLogExporter(const OtlpGrpcExporterOptions &options);
40+
41+
/**
42+
* Creates a recordable that stores the data in protobuf.
43+
* @return a newly initialized Recordable object.
44+
*/
45+
std::unique_ptr<opentelemetry::sdk::logs::Recordable> MakeRecordable() noexcept override;
46+
47+
/**
48+
* Exports a vector of log records to the configured gRPC endpoint. Guaranteed to return after a
49+
* timeout specified from the options passed to the constructor.
50+
* @param records A list of log records.
51+
*/
52+
opentelemetry::sdk::common::ExportResult Export(
53+
const nostd::span<std::unique_ptr<opentelemetry::sdk::logs::Recordable>> &records) noexcept
54+
override;
55+
56+
/**
57+
* Shutdown this exporter.
58+
* @param timeout The maximum time to wait for the shutdown method to return.
59+
*/
60+
bool Shutdown(std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept override
61+
{
62+
return true;
63+
}
64+
65+
private:
66+
// Configuration options for the exporter
67+
const OtlpGrpcExporterOptions options_;
68+
69+
// For testing
70+
friend class OtlpGrpcLogExporterTestPeer;
71+
72+
// Store service stub internally. Useful for testing.
73+
std::unique_ptr<proto::collector::logs::v1::LogsService::StubInterface> log_service_stub_;
74+
75+
/**
76+
* Create an OtlpGrpcLogExporter using the specified service stub.
77+
* Only tests can call this constructor directly.
78+
* @param stub the service stub to be used for exporting
79+
*/
80+
OtlpGrpcLogExporter(std::unique_ptr<proto::collector::logs::v1::LogsService::StubInterface> stub);
81+
};
82+
83+
} // namespace otlp
84+
} // namespace exporter
85+
OPENTELEMETRY_END_NAMESPACE
86+
87+
#endif

0 commit comments

Comments
 (0)