Skip to content

Commit 5914160

Browse files
authored
Add Jaeger exporter (#534)
1 parent e901a36 commit 5914160

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+7190
-2
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Increment the:
1515

1616
## [Unreleased]
1717

18+
* [EXPORTER] Add Jaeger exporter ([#534](https://github.com/open-telemetry/opentelemetry-cpp/pull/534))
1819
* [SDK] Add instrumentation library and multiple tracer support ([#693](https://github.com/open-telemetry/opentelemetry-cpp/pull/693))
1920

2021
## [0.5.0] 2021-04-26

CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ option(WITH_PROMETHEUS "Whether to include the Prometheus Client in the SDK"
8282
option(WITH_ELASTICSEARCH
8383
"Whether to include the Elasticsearch Client in the SDK" OFF)
8484

85+
option(WITH_JAEGER "Whether to include the Jaeger exporter" OFF)
86+
8587
option(BUILD_TESTING "Whether to enable tests" ON)
8688
if(WIN32)
8789
option(WITH_ETW "Whether to include the ETW Exporter in the SDK" ON)

examples/CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
if(WITH_OTLP)
22
add_subdirectory(otlp)
33
endif()
4+
if(WITH_JAEGER)
5+
add_subdirectory(jaeger)
6+
endif()
47
add_subdirectory(plugin)
58
add_subdirectory(simple)
69
add_subdirectory(batch)

examples/jaeger/BUILD

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
cc_library(
2+
name = "foo_library",
3+
srcs = [
4+
"foo_library/foo_library.cc",
5+
],
6+
hdrs = [
7+
"foo_library/foo_library.h",
8+
],
9+
deps = [
10+
"//api",
11+
],
12+
)
13+
14+
# TODO: enable bazel build
15+
# cc_binary(
16+
# name = "example_jaeger",
17+
# srcs = [
18+
# "main.cc",
19+
# ],
20+
# deps = [
21+
# ":foo_library",
22+
# "//api",
23+
# "//exporters/jaeger:jaeger_exporter",
24+
# "//sdk/src/trace",
25+
# ],
26+
# )

examples/jaeger/CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
include_directories(${CMAKE_SOURCE_DIR}/exporters/jaeger/include)
2+
3+
add_library(jaeger_foo_library foo_library/foo_library.cc)
4+
target_link_libraries(jaeger_foo_library ${CMAKE_THREAD_LIBS_INIT}
5+
${CORE_RUNTIME_LIBS} opentelemetry_api)
6+
7+
add_executable(example_jaeger main.cc)
8+
target_link_libraries(
9+
example_jaeger ${CMAKE_THREAD_LIBS_INIT} jaeger_foo_library
10+
opentelemetry_trace ${CORE_RUNTIME_LIBS} jaeger_trace_exporter)

examples/jaeger/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Jaeger Exporter Example
2+
3+
This is an example of how to use the Jaeger exporter.
4+
5+
The application in `main.cc` initializes an `JaegerExporter` instance and uses it
6+
to register a tracer provider from the [OpenTelemetry
7+
SDK](https://github.com/open-telemetry/opentelemetry-cpp). The application then
8+
calls a `foo_library` which has been instrumented using the [OpenTelemetry
9+
API](https://github.com/open-telemetry/opentelemetry-cpp/tree/main/api).
10+
11+
Resulting spans are exported to the Jaeger agent using the Jaeger exporter.
12+
13+
Note that the Jaeger exporter connects to the agent at `localhost:6831` by
14+
default.
15+
16+
Once you have the Collector running, see
17+
[CONTRIBUTING.md](../../CONTRIBUTING.md) for instructions on building and
18+
running the example.
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "opentelemetry/trace/provider.h"
2+
3+
namespace trace = opentelemetry::trace;
4+
namespace nostd = opentelemetry::nostd;
5+
6+
namespace
7+
{
8+
nostd::shared_ptr<trace::Tracer> get_tracer()
9+
{
10+
auto provider = trace::Provider::GetTracerProvider();
11+
return provider->GetTracer("foo_library");
12+
}
13+
14+
void f1()
15+
{
16+
auto scoped_span = trace::Scope(get_tracer()->StartSpan("f1"));
17+
}
18+
19+
void f2()
20+
{
21+
auto scoped_span = trace::Scope(get_tracer()->StartSpan("f2"));
22+
23+
f1();
24+
f1();
25+
}
26+
} // namespace
27+
28+
void foo_library()
29+
{
30+
auto scoped_span = trace::Scope(get_tracer()->StartSpan("library"));
31+
32+
f2();
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
3+
void foo_library();

examples/jaeger/main.cc

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include "opentelemetry/exporters/jaeger/jaeger_exporter.h"
2+
#include "opentelemetry/sdk/trace/simple_processor.h"
3+
#include "opentelemetry/sdk/trace/tracer_provider.h"
4+
#include "opentelemetry/trace/provider.h"
5+
6+
#include "foo_library/foo_library.h"
7+
8+
namespace trace = opentelemetry::trace;
9+
namespace nostd = opentelemetry::nostd;
10+
namespace sdktrace = opentelemetry::sdk::trace;
11+
namespace jaeger = opentelemetry::exporter::jaeger;
12+
13+
namespace
14+
{
15+
opentelemetry::exporter::jaeger::JaegerExporterOptions opts;
16+
void InitTracer()
17+
{
18+
// Create Jaeger exporter instance
19+
auto exporter = std::unique_ptr<sdktrace::SpanExporter>(new jaeger::JaegerExporter(opts));
20+
auto processor = std::unique_ptr<sdktrace::SpanProcessor>(
21+
new sdktrace::SimpleSpanProcessor(std::move(exporter)));
22+
auto provider =
23+
nostd::shared_ptr<trace::TracerProvider>(new sdktrace::TracerProvider(std::move(processor)));
24+
// Set the global trace provider
25+
trace::Provider::SetTracerProvider(provider);
26+
}
27+
} // namespace
28+
29+
int main(int argc, char *argv[])
30+
{
31+
if (argc == 2)
32+
{
33+
opts.server_addr = argv[1];
34+
}
35+
// Removing this line will leave the default noop TracerProvider in place.
36+
InitTracer();
37+
38+
foo_library();
39+
}

exporters/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,7 @@ endif()
3434
if(WITH_ETW)
3535
add_subdirectory(etw)
3636
endif()
37+
38+
if(WITH_JAEGER)
39+
add_subdirectory(jaeger)
40+
endif()

exporters/jaeger/CMakeLists.txt

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
include_directories(include)
2+
include_directories(thrift-gen)
3+
4+
find_package(Thrift REQUIRED)
5+
6+
set(JAEGER_THRIFT_GENCPP_SOURCES
7+
thrift-gen/Agent.cpp thrift-gen/jaeger_types.cpp thrift-gen/Collector.cpp
8+
thrift-gen/zipkincore_types.cpp)
9+
10+
set(JAEGER_EXPORTER_SOURCES
11+
src/jaeger_exporter.cc src/thrift_sender.cc src/udp_transport.cc
12+
src/recordable.cc src/TUDPTransport.cc)
13+
14+
add_library(jaeger_trace_exporter ${JAEGER_EXPORTER_SOURCES}
15+
${JAEGER_THRIFT_GENCPP_SOURCES})
16+
target_link_libraries(
17+
jaeger_trace_exporter
18+
PUBLIC opentelemetry_resources
19+
PRIVATE thrift::thrift)
20+
21+
if(MSVC)
22+
target_compile_definitions(jaeger_trace_exporter PUBLIC NOMINMAX)
23+
if(NOT BUILD_SHARED_LIBS)
24+
target_compile_definitions(jaeger_trace_exporter
25+
PUBLIC THRIFT_STATIC_DEFINE)
26+
endif()
27+
endif()
28+
29+
if(BUILD_TESTING)
30+
add_executable(jaeger_recordable_test test/jaeger_recordable_test.cc)
31+
target_link_libraries(jaeger_recordable_test ${GTEST_BOTH_LIBRARIES}
32+
${CMAKE_THREAD_LIBS_INIT} jaeger_trace_exporter)
33+
34+
gtest_add_tests(
35+
TARGET jaeger_recordable_test
36+
TEST_PREFIX exporter.
37+
TEST_LIST jaeger_recordable_test)
38+
endif() # BUILD_TESTING

exporters/jaeger/README.md

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Jaeger Exporter for OpenTelemetry C++
2+
3+
## Prerequisite
4+
5+
* [Get Jaeger](https://www.jaegertracing.io/docs/getting-started/) and run
6+
Jaeger agent.
7+
8+
## Installation
9+
10+
## CMake Installation Instructions
11+
12+
Refer to install instructions
13+
[INSTALL.md](../../INSTALL.md#building-as-standalone-cmake-project). Modify step
14+
2 to create `cmake` build configuration for compiling with Jaeger exporter as
15+
below:
16+
17+
```console
18+
$ cmake -DWITH_JAEGER=ON ..
19+
-- The C compiler identification is GNU 9.3.0
20+
-- The CXX compiler identification is GNU 9.3.0
21+
...
22+
-- Configuring done
23+
-- Generating done
24+
-- Build files have been written to: /home/<user>/source/opentelemetry-cpp/build
25+
$
26+
```
27+
28+
### Bazel install Instructions
29+
30+
TODO
31+
32+
## Usage
33+
34+
Install the exporter on your application and pass the options.
35+
36+
```cpp
37+
opentelemetry::exporter::jaeger::JaegerExporterOptions options;
38+
options.server_addr = "localhost";
39+
options.server_port = 6831;
40+
options.transport_format = TransportFormat::kThriftUdpCompact;
41+
42+
auto exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(
43+
new opentelemetry::exporter::jaeger::JaegerExporter(options));
44+
auto processor = std::shared_ptr<sdktrace::SpanProcessor>(
45+
new sdktrace::SimpleSpanProcessor(std::move(exporter)));
46+
auto provider = nostd::shared_ptr<opentelemetry::trace::TracerProvider>(
47+
new sdktrace::TracerProvider(processor));
48+
49+
// Set the global trace provider
50+
opentelemetry::trace::Provider::SetTracerProvider(provider);
51+
52+
```
53+
54+
## Viewing your traces
55+
56+
Please visit the Jaeger UI endpoint <http://localhost:16686>.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Copyright 2021, OpenTelemetry Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#pragma once
16+
17+
#include <opentelemetry/sdk/trace/exporter.h>
18+
19+
OPENTELEMETRY_BEGIN_NAMESPACE
20+
namespace exporter
21+
{
22+
namespace jaeger
23+
{
24+
enum class TransportFormat
25+
{
26+
kThriftUdp,
27+
kThriftUdpCompact,
28+
kThriftHttp,
29+
kProtobufGrpc,
30+
};
31+
32+
class ThriftSender;
33+
34+
/**
35+
* Struct to hold Jaeger exporter options.
36+
*/
37+
struct JaegerExporterOptions
38+
{
39+
// The endpoint to export to.
40+
std::string server_addr = "localhost";
41+
uint16_t server_port = 6831;
42+
TransportFormat transport_format = TransportFormat::kThriftUdpCompact;
43+
};
44+
45+
namespace trace_sdk = opentelemetry::sdk::trace;
46+
namespace sdk_common = opentelemetry::sdk::common;
47+
48+
class JaegerExporter final : public trace_sdk::SpanExporter
49+
{
50+
public:
51+
/**
52+
* Create a JaegerExporter using all default options.
53+
*/
54+
JaegerExporter();
55+
56+
/**
57+
* Create a JaegerExporter using the given options.
58+
*/
59+
explicit JaegerExporter(const JaegerExporterOptions &options);
60+
61+
/**
62+
* Create a span recordable.
63+
* @return a new initialized Recordable object.
64+
*/
65+
std::unique_ptr<trace_sdk::Recordable> MakeRecordable() noexcept override;
66+
67+
/**
68+
* Export a batch of spans.
69+
* @param spans a span of unique pointers to span recordables.
70+
*/
71+
sdk_common::ExportResult Export(
72+
const nostd::span<std::unique_ptr<trace_sdk::Recordable>> &spans) noexcept override;
73+
74+
/**
75+
* Shutdown the exporter.
76+
* @param timeout an option timeout, default to max.
77+
*/
78+
bool Shutdown(
79+
std::chrono::microseconds timeout = std::chrono::microseconds::max()) noexcept override
80+
{
81+
return true;
82+
}
83+
84+
private:
85+
void InitializeEndpoint();
86+
87+
private:
88+
// The configuration options associated with this exporter.
89+
bool is_shutdown_ = false;
90+
JaegerExporterOptions options_;
91+
std::unique_ptr<ThriftSender> sender_;
92+
};
93+
94+
} // namespace jaeger
95+
} // namespace exporter
96+
OPENTELEMETRY_END_NAMESPACE

0 commit comments

Comments
 (0)