diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 782f20d18e..327f067121 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -8,6 +8,9 @@ endif() if(WITH_JAEGER) add_subdirectory(jaeger) endif() +if(WITH_ZIPKIN) + add_subdirectory(zipkin) +endif() add_subdirectory(plugin) add_subdirectory(simple) add_subdirectory(batch) diff --git a/examples/zipkin/CMakeLists.txt b/examples/zipkin/CMakeLists.txt new file mode 100644 index 0000000000..40affab413 --- /dev/null +++ b/examples/zipkin/CMakeLists.txt @@ -0,0 +1,10 @@ +include_directories(${CMAKE_SOURCE_DIR}/exporters/zipkin/include) + +add_library(zipkin_foo_library foo_library/foo_library.cc) +target_link_libraries(zipkin_foo_library ${CMAKE_THREAD_LIBS_INIT} + opentelemetry_api) + +add_executable(example_zipkin main.cc) +target_link_libraries( + example_zipkin ${CMAKE_THREAD_LIBS_INIT} zipkin_foo_library + opentelemetry_trace opentelemetry_exporter_zipkin_trace) diff --git a/examples/zipkin/README.md b/examples/zipkin/README.md new file mode 100644 index 0000000000..a07480213d --- /dev/null +++ b/examples/zipkin/README.md @@ -0,0 +1,31 @@ +# Zipkin Exporter Example + +This is an example of how to use the Zipkin exporter. + +The application in `main.cc` initializes an `ZipkinExporter` instance and uses it to +register a tracer provider from the [OpenTelemetry SDK](https://github.com/open-telemetry/opentelemetry-cpp). +The application then calls a `foo_library` which has been instrumented using the [OpenTelemetry +API](https://github.com/open-telemetry/opentelemetry-cpp/tree/main/api). + +Resulting spans are exported to the Zipkin server using the Zipkin exporter. + +Note that the Zipkin exporter connects to the server at `localhost:9411` by +default. + +## Running Zipkin server locally + +The quick way to run the Zipkin server is using Docker container : + +``console + +$ docker run -d -p 9411:9411 openzipkin/zipkin + +`` + +## Running Zipkin example + +Build this example using instructions in [INSTALL.md](../../INSTALL.md). + +## Viewing the traces + +Please visit the Zipkin UI endpoint `http://localhost:9411` diff --git a/examples/zipkin/foo_library/foo_library.cc b/examples/zipkin/foo_library/foo_library.cc new file mode 100644 index 0000000000..a0dec3c766 --- /dev/null +++ b/examples/zipkin/foo_library/foo_library.cc @@ -0,0 +1,37 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "opentelemetry/sdk/version/version.h" +#include "opentelemetry/trace/provider.h" + +namespace trace = opentelemetry::trace; +namespace nostd = opentelemetry::nostd; + +namespace +{ +nostd::shared_ptr get_tracer() +{ + auto provider = trace::Provider::GetTracerProvider(); + return provider->GetTracer("foo_library", OPENTELEMETRY_SDK_VERSION); +} + +void f1() +{ + auto scoped_span = trace::Scope(get_tracer()->StartSpan("f1")); +} + +void f2() +{ + auto scoped_span = trace::Scope(get_tracer()->StartSpan("f2")); + + f1(); + f1(); +} +} // namespace + +void foo_library() +{ + auto scoped_span = trace::Scope(get_tracer()->StartSpan("library")); + + f2(); +} diff --git a/examples/zipkin/foo_library/foo_library.h b/examples/zipkin/foo_library/foo_library.h new file mode 100644 index 0000000000..daebb2603f --- /dev/null +++ b/examples/zipkin/foo_library/foo_library.h @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +void foo_library(); diff --git a/examples/zipkin/main.cc b/examples/zipkin/main.cc new file mode 100644 index 0000000000..3ae7539cda --- /dev/null +++ b/examples/zipkin/main.cc @@ -0,0 +1,45 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "opentelemetry/exporters/zipkin/zipkin_exporter.h" +#include "opentelemetry/sdk/trace/simple_processor.h" +#include "opentelemetry/sdk/trace/tracer_provider.h" +#include "opentelemetry/trace/provider.h" + +#include "foo_library/foo_library.h" + +namespace trace = opentelemetry::trace; +namespace nostd = opentelemetry::nostd; +namespace sdktrace = opentelemetry::sdk::trace; +namespace zipkin = opentelemetry::exporter::zipkin; + +namespace +{ +opentelemetry::exporter::zipkin::ZipkinExporterOptions opts; +void InitTracer() +{ + // Create zipkin exporter instance + opentelemetry::sdk::resource::ResourceAttributes attributes = { + {"service.name", "zipkin_demo_service"}}; + auto resource = opentelemetry::sdk::resource::Resource::Create(attributes); + auto exporter = std::unique_ptr(new zipkin::ZipkinExporter(opts)); + auto processor = std::unique_ptr( + new sdktrace::SimpleSpanProcessor(std::move(exporter))); + auto provider = nostd::shared_ptr( + new sdktrace::TracerProvider(std::move(processor), resource)); + // Set the global trace provider + trace::Provider::SetTracerProvider(provider); +} +} // namespace + +int main(int argc, char *argv[]) +{ + if (argc == 2) + { + opts.endpoint = argv[1]; + } + // Removing this line will leave the default noop TracerProvider in place. + InitTracer(); + + foo_library(); +}