diff --git a/make-linux.mk b/make-linux.mk index 9e0bb2268..0264f229d 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -317,7 +317,7 @@ ifeq (${ZT_OTEL},1) OTEL_INSTALL_DIR=ext/opentelemetry-cpp-${OTEL_VERSION}/localinstall DEFS+=-DZT_OPENTELEMETRY_ENABLED=1 INCLUDES+=-I${OTEL_INSTALL_DIR}/include - LDLIBS+=-L${OTEL_INSTALL_DIR}/lib -lopentelemetry_common -lopentelemetry_resources -lopentelemetry_otlp_recordable -lopentelemetry_exporter_in_memory_metric -lopentelemetry_exporter_in_memory -lopentelemetry_exporter_ostream_logs -lopentelemetry_exporter_ostream_metrics -lopentelemetry_exporter_ostream_span -lopentelemetry_exporter_otlp_grpc -lopentelemetry_exporter_otlp_grpc_client -lopentelemetry_exporter_otlp_grpc_log -lopentelemetry_exporter_otlp_grpc_metrics -lopentelemetry_trace -lopentelemetry_common -lopentelemetry_resources -lopentelemetry_logs -lopentelemetry_metrics -lopentelemetry_version + LDLIBS+=-L${OTEL_INSTALL_DIR}/lib -lopentelemetry_exporter_in_memory_metric -lopentelemetry_exporter_in_memory -lopentelemetry_exporter_ostream_logs -lopentelemetry_exporter_ostream_metrics -lopentelemetry_exporter_ostream_span -lopentelemetry_exporter_otlp_grpc -lopentelemetry_exporter_otlp_grpc_client -lopentelemetry_exporter_otlp_grpc_log -lopentelemetry_exporter_otlp_grpc_metrics -lopentelemetry_otlp_recordable -lopentelemetry_common -lopentelemetry_trace -lopentelemetry_common -lopentelemetry_resources -lopentelemetry_logs -lopentelemetry_metrics -lopentelemetry_proto -lopentelemetry_proto_grpc -lopentelemetry_version -lprotobuf -lgrpc++ else OTEL_INSTALL_DIR=ext/opentelemetry-cpp-api-only INCLUDES+=-I${OTEL_INSTALL_DIR}/include @@ -343,7 +343,7 @@ endif ifeq ($(ZT_CONTROLLER),1) override CXXFLAGS+=-Wall -Wno-deprecated -std=c++17 -pthread $(INCLUDES) -DNDEBUG $(DEFS) override LDLIBS+=-Lext/libpqxx-7.7.3/install/ubuntu22.04/$(EXT_ARCH)/lib -lpqxx -lpq ext/hiredis-1.0.2/lib/ubuntu22.04/$(EXT_ARCH)/libhiredis.a ext/redis-plus-plus-1.3.3/install/ubuntu22.04/$(EXT_ARCH)/lib/libredis++.a -lssl -lcrypto - override DEFS+=-DZT_CONTROLLER_USE_LIBPQ -DZT_NO_PEER_METRICS -DZT_OTEL_EXPORTER + override DEFS+=-DZT_CONTROLLER_USE_LIBPQ -DZT_NO_PEER_METRICS -DZT_OPENTELEMETRY_ENABLED override INCLUDES+=-I/usr/include/postgresql -Iext/libpqxx-7.7.3/install/ubuntu22.04/$(EXT_ARCH)/include -Iext/hiredis-1.0.2/include/ -Iext/redis-plus-plus-1.3.3/install/ubuntu22.04/$(EXT_ARCH)/include/sw/ ifeq ($(ZT_DEBUG),1) override LDLIBS+=rustybits/target/debug/libsmeeclient.a @@ -430,7 +430,7 @@ doc: manpages ifeq (${ZT_OTEL},1) otel: - cd ext/opentelemetry-cpp-1.21.0 && mkdir -p localinstall && cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(shell pwd)/ext/opentelemetry-cpp-1.21.0/localinstall -DBUILD_TESTING=OFF -DOPENTELEMETRY_INSTALL=ON -DWITH_BENCHMARK=OFF -DWITH_EXAMPLES=OFF -DWITH_FUNC_TESTS=OFF -DUSE_THIRDPARTY_LIBRARIES=ON -DWITH_OTLP_GRPC=ON -DWITH_OTLP_HTTP=OFF -DWITH_PROMETHEUS=OFF + cd ext/opentelemetry-cpp-1.21.0 && mkdir -p localinstall && cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(shell pwd)/ext/opentelemetry-cpp-1.21.0/localinstall -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TESTING=OFF -DOPENTELEMETRY_INSTALL=ON -DWITH_BENCHMARK=OFF -DWITH_EXAMPLES=OFF -DWITH_FUNC_TESTS=OFF -DUSE_THIRDPARTY_LIBRARIES=ON -DWITH_OTLP_GRPC=ON -DWITH_OTLP_HTTP=OFF -DWITH_PROMETHEUS=OFF cd ext/opentelemetry-cpp-1.21.0/build && make -j4 install else otel: @@ -460,7 +460,7 @@ _buildx: @echo docker buildx inspect --bootstrap central-controller: FORCE - make ZT_OTEL=1 otel && make -j4 ZT_CONTROLLER=1 ZT_OTEL=1 one + make ZT_OTEL=1 otel && ZT_OTEL=1 make -j4 ZT_CONTROLLER=1 one central-controller-docker: _buildx FORCE docker buildx build --platform linux/amd64,linux/arm64 --no-cache -t registry.zerotier.com/zerotier-central/ztcentral-controller:${TIMESTAMP} -f ext/central-controller-docker/Dockerfile --build-arg git_branch=`git name-rev --name-only HEAD` . --push diff --git a/service/OneService.cpp b/service/OneService.cpp index a20da13bf..0c7035d3b 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -10,6 +10,7 @@ * of this software will be governed by version 2.0 of the Apache License. */ /****/ +#define ZT_OPENTELEMETRY_ENABLED 1 #include #include @@ -59,12 +60,32 @@ #include -#ifdef ZT_OTEL_EXPORTER +#ifdef ZT_OPENTELEMETRY_ENABLED #include "opentelemetry/exporters/otlp/otlp_grpc_exporter.h" +#include "opentelemetry/exporters/otlp/otlp_grpc_log_record_exporter.h" +#include "opentelemetry/exporters/otlp/otlp_grpc_metric_exporter.h" +#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h" +#include "opentelemetry/sdk/metrics/meter_provider.h" +#include "opentelemetry/sdk/metrics/metric_reader.h" +#include "opentelemetry/sdk/metrics/provider.h" #include "opentelemetry/sdk/resource/resource.h" -#endif +#include "opentelemetry/sdk/trace/processor.h" +#include "opentelemetry/sdk/trace/provider.h" +#include "opentelemetry/sdk/trace/samplers/trace_id_ratio.h" +#include "opentelemetry/sdk/trace/simple_processor.h" +#include "opentelemetry/sdk/trace/tracer.h" +#include "opentelemetry/sdk/trace/tracer_context.h" +#include "opentelemetry/sdk/trace/tracer_provider.h" +namespace sdktrace = opentelemetry::v1::sdk::trace; +namespace sdkmetrics = opentelemetry::v1::sdk::metrics; +namespace sdklogs = opentelemetry::v1::sdk::logs; +namespace sdkresource = opentelemetry::v1::sdk::resource; +#else +#include "opentelemetry/logs/logger.h" +#include "opentelemetry/metrics/provider.h" #include "opentelemetry/trace/provider.h" +#endif #if ZT_SSO_ENABLED #include @@ -920,7 +941,8 @@ class OneServiceImpl : public OneService { std::string _ssoRedirectURL; #ifdef ZT_OPENTELEMETRY_ENABLED - nostd::shared_ptr _traceProvider; + + opentelemetry::nostd::shared_ptr _traceProvider; std::string _exporterEndpoint; double _exporterSampleRate; #endif @@ -1041,25 +1063,25 @@ class OneServiceImpl : public OneService { { if (! _exporterEndpoint.empty() && _exporterSampleRate > 0.0) { // Set up OpenTelemetry exporter and tracer provider - opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts; + opentelemetry::v1::exporter::otlp::OtlpGrpcExporterOptions opts; opts.endpoint = _exporterEndpoint + "/v1/traces"; auto exporter = std::unique_ptr(new opentelemetry::exporter::otlp::OtlpGrpcExporter(opts)); - auto processor = std::unique_ptr(new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(exporter))); - - char buf[16]; + auto processor = std::unique_ptr(new sdktrace::SimpleSpanProcessor(std::move(exporter))); + auto processors = std::vector >(); + processors.push_back(std::move(processor)); + char buf[256]; auto versionString = std::stringstream(); versionString << ZEROTIER_ONE_VERSION_MAJOR << "." << ZEROTIER_ONE_VERSION_MINOR << "." << ZEROTIER_ONE_VERSION_REVISION; - auto resource_attributes = opentelemetry::sdk::resource::ResourceAttributes { { "service.name", "zerotier-one" }, - { "service.version", versionString.str() }, - { "service.node_id", _node->identity().address().toString(buf) }, - { "service.namespace", "com.zerotier.zerotier-one" } }; - auto resource = std::unique_ptr(new opentelemetry::sdk::resource::Resource(resource_attributes)); - auto sampler = std::unique_ptr(new sdktrace::TraceIdRatioBasedSampler(_exporterSampleRate)); - auto tracer_context = std::make_shared(std::move(processor), resource, std::move(sampler)); - _traceProvider = nostd::shared_ptr(new sdktrace::TracerProvider(tracer_context)); + auto resource_attributes = sdkresource::ResourceAttributes { { "service.name", "zerotier-one" }, + { "service.version", versionString.str() }, + { "service.node_id", _node->identity().address().toString(buf) }, + { "service.namespace", "com.zerotier.zerotier-one" } }; - opentelemetry::trace::Provider::SetTracerProvider(_traceProvider); - opentelemetry::trace::Provider:: + auto resource = sdkresource::Resource::Create(resource_attributes); + auto sampler = std::unique_ptr(new sdktrace::TraceIdRatioBasedSampler(_exporterSampleRate)); + auto tracer_context = std::make_unique(std::move(processors), resource, std::move(sampler)); + _traceProvider = opentelemetry::nostd::shared_ptr(new sdktrace::TracerProvider(std::move(tracer_context))); + sdktrace::Provider::SetTracerProvider(_traceProvider); } } @@ -1067,12 +1089,12 @@ class OneServiceImpl : public OneService { { if (! _exporterEndpoint.empty()) { // Set up OpenTelemetry metrics exporter - opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts; - opts.endpoint = _exporterEndpoint + "/v1/metrics"; - auto exporter = std::unique_ptr(new opentelemetry::exporter::otlp::OtlpGrpcExporter(opts)); - auto processor = std::unique_ptr(new opentelemetry::sdk::metrics::PeriodicExportingMetricReader(std::move(exporter), std::chrono::seconds(5))); - auto meter_provider = nostd::shared_ptr(new sdkmetrics::MeterProvider(std::move(processor))); - opentelemetry::metrics::Provider::SetMeterProvider(meter_provider); + // opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts; + // opts.endpoint = _exporterEndpoint + "/v1/metrics"; + // auto exporter = std::unique_ptr(new opentelemetry::exporter::otlp::OtlpGrpcExporter(opts)); + // auto processor = std::unique_ptr(new sdkmetrics::PeriodicExportingMetricReader(std::move(exporter))); + // auto meter_provider = opentelemetry::v1::nostd::shared_ptr(new sdkmetrics::MeterProvider(std::move(processor))); + // sdkmetrics::Provider::SetMeterProvider(meter_provider); } } @@ -1080,12 +1102,12 @@ class OneServiceImpl : public OneService { { if (! _exporterEndpoint.empty()) { // Set up OpenTelemetry logging exporter - opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts; - opts.endpoint = _exporterEndpoint + "/v1/logs"; - auto exporter = std::unique_ptr(new opentelemetry::exporter::otlp::OtlpGrpcExporter(opts)); - auto processor = std::unique_ptr(new opentelemetry::sdk::logs::SimpleLogRecordProcessor(std::move(exporter))); - auto logger_provider = nostd::shared_ptr(new sdklogs::LoggerProvider(std::move(processor))); - opentelemetry::logs::Provider::SetLoggerProvider(logger_provider); + // opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts; + // opts.endpoint = _exporterEndpoint + "/v1/logs"; + // auto exporter = std::unique_ptr(new opentelemetry::exporter::otlp::OtlpGrpcExporter(opts)); + // auto processor = std::unique_ptr(new opentelemetry::v1::sdk::logs::SimpleLogRecordProcessor(std::move(exporter))); + // auto logger_provider = opentelemetry::nostd::shared_ptr(new opentelemetry::v1::sdk::logs::LoggerProvider(std::move(processor))); + // opentelemetry::logs::Provider::SetLoggerProvider(logger_provider); } } #endif