diff --git a/api/envoy/extensions/tracers/opentelemetry/samplers/v3/dynatrace_sampler.proto b/api/envoy/extensions/tracers/opentelemetry/samplers/v3/dynatrace_sampler.proto index e4d64e24eb07..6d072c6984b1 100644 --- a/api/envoy/extensions/tracers/opentelemetry/samplers/v3/dynatrace_sampler.proto +++ b/api/envoy/extensions/tracers/opentelemetry/samplers/v3/dynatrace_sampler.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package envoy.extensions.tracers.opentelemetry.samplers.v3; -import "envoy/config/core/v3/http_uri.proto"; +import "envoy/config/core/v3/http_service.proto"; import "udpa/annotations/status.proto"; @@ -15,8 +15,6 @@ option (udpa.annotations.file_status).package_version_status = ACTIVE; // [#protodoc-title: Dynatrace Sampler config] // Configuration for the Dynatrace Sampler extension. // [#extension: envoy.tracers.opentelemetry.samplers.dynatrace] - -// [#next-free-field: 6] message DynatraceSamplerConfig { // The Dynatrace tenant. // @@ -28,19 +26,20 @@ message DynatraceSamplerConfig { // The value can be obtained from the Envoy deployment page in Dynatrace. int32 cluster_id = 2; - // The HTTP URI to fetch the sampler configuration (root spans per minute). For example: + // The HTTP service to fetch the sampler configuration from the Dynatrace API (root spans per minute). For example: // // .. code-block:: yaml - // - // http_uri: - // uri: .dev.dynatracelabs.com/api/v2/samplingConfiguration - // cluster: dynatrace - // timeout: 10s - // - config.core.v3.HttpUri http_uri = 3; - - // The access token to fetch the sampling configuration from the Dynatrace API - string token = 4; + // http_service: + // http_uri: + // cluster: dynatrace + // uri: .dev.dynatracelabs.com/api/v2/samplingConfiguration + // timeout: 10s + // request_headers_to_add: + // - header: + // key : "authorization" + // value: "Api-Token dt..." + // + config.core.v3.HttpService http_service = 3; // Default number of root spans per minute, used when the value can't be obtained from the Dynatrace API. // @@ -49,5 +48,5 @@ message DynatraceSamplerConfig { // - ``root_spans_per_minute`` is unset // - ``root_spans_per_minute`` is set to 0 // - uint32 root_spans_per_minute = 5; + uint32 root_spans_per_minute = 4; } diff --git a/source/extensions/tracers/opentelemetry/samplers/dynatrace/BUILD b/source/extensions/tracers/opentelemetry/samplers/dynatrace/BUILD index 629674856083..5f83e3414835 100644 --- a/source/extensions/tracers/opentelemetry/samplers/dynatrace/BUILD +++ b/source/extensions/tracers/opentelemetry/samplers/dynatrace/BUILD @@ -41,6 +41,7 @@ envoy_cc_library( "//source/common/config:datasource_lib", "//source/extensions/tracers/opentelemetry:opentelemetry_tracer_lib", "//source/extensions/tracers/opentelemetry/samplers:sampler_lib", + "@envoy_api//envoy/config/core/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/tracers/opentelemetry/samplers/v3:pkg_cc_proto", ], ) diff --git a/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.cc b/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.cc index badc4458c131..0734ccf31536 100644 --- a/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.cc +++ b/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.cc @@ -35,9 +35,12 @@ SamplerConfigProviderImpl::SamplerConfigProviderImpl( Server::Configuration::TracerFactoryContext& context, const envoy::extensions::tracers::opentelemetry::samplers::v3::DynatraceSamplerConfig& config) : cluster_manager_(context.serverFactoryContext().clusterManager()), - http_uri_(config.http_uri()), - authorization_header_value_(absl::StrCat("Api-Token ", config.token())), - sampler_config_(config.root_spans_per_minute()) { + http_uri_(config.http_service().http_uri()), sampler_config_(config.root_spans_per_minute()) { + + for (const auto& header_value_option : config.http_service().request_headers_to_add()) { + parsed_headers_to_add_.push_back({Http::LowerCaseString(header_value_option.header().key()), + header_value_option.header().value()}); + } timer_ = context.serverFactoryContext().mainThreadDispatcher().createTimer([this]() -> void { const auto thread_local_cluster = cluster_manager_.getThreadLocalCluster(http_uri_.cluster()); @@ -47,8 +50,9 @@ SamplerConfigProviderImpl::SamplerConfigProviderImpl( } else { Http::RequestMessagePtr message = Http::Utility::prepareHeaders(http_uri_); message->headers().setReferenceMethod(Http::Headers::get().MethodValues.Get); - message->headers().setReference(Http::CustomHeaders::get().Authorization, - authorization_header_value_); + for (const auto& header_pair : parsed_headers_to_add_) { + message->headers().setReference(header_pair.first, header_pair.second); + } active_request_ = thread_local_cluster->httpAsyncClient().send( std::move(message), *this, Http::AsyncClient::RequestOptions().setTimeout(std::chrono::milliseconds( diff --git a/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.h b/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.h index ddb42ac5fb6a..5257912c7286 100644 --- a/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.h +++ b/source/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider.h @@ -4,6 +4,8 @@ #include #include +#include "envoy/config/core/v3/http_service.pb.h" +#include "envoy/config/core/v3/http_uri.pb.h" #include "envoy/extensions/tracers/opentelemetry/samplers/v3/dynatrace_sampler.pb.h" #include "envoy/http/async_client.h" #include "envoy/http/message.h" @@ -65,7 +67,7 @@ class SamplerConfigProviderImpl : public SamplerConfigProvider, Event::TimerPtr timer_; Upstream::ClusterManager& cluster_manager_; envoy::config::core::v3::HttpUri http_uri_; - const std::string authorization_header_value_; + std::vector> parsed_headers_to_add_; Http::AsyncClient::Request* active_request_{}; SamplerConfig sampler_config_; }; diff --git a/test/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider_test.cc b/test/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider_test.cc index bdc0add55955..a2a7f573174f 100644 --- a/test/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider_test.cc +++ b/test/extensions/tracers/opentelemetry/samplers/dynatrace/sampler_config_provider_test.cc @@ -31,11 +31,15 @@ class SamplerConfigProviderTest : public testing::Test { const std::string yaml_string = R"EOF( tenant: "abc12345" cluster_id: -1743916452 - token: "tokenval" - http_uri: - cluster: "cluster_name" - uri: "https://testhost.com/api/v2/samplingConfiguration" - timeout: 0.250s + http_service: + http_uri: + cluster: "cluster_name" + uri: "https://testhost.com/api/v2/samplingConfiguration" + timeout: 0.250s + request_headers_to_add: + - header: + key: "authorization" + value: "Api-Token tokenval" root_spans_per_minute: 1000 )EOF"; TestUtility::loadFromYaml(yaml_string, proto_config_); @@ -58,7 +62,6 @@ class SamplerConfigProviderTest : public testing::Test { }; MATCHER_P(MessageMatcher, unusedArg, "") { - // prefix 'Api-Token' should be added to 'tokenval' set via SamplerConfigProvider constructor return (arg->headers() .get(Http::CustomHeaders::get().Authorization)[0] ->value() @@ -206,11 +209,11 @@ TEST_F(SamplerConfigProviderTest, TestValueConfigured) { const std::string yaml_string = R"EOF( tenant: "abc12345" cluster_id: -1743916452 - token: "tokenval" - http_uri: - cluster: "cluster_name" - uri: "https://testhost.com/otlp/v1/traces" - timeout: 0.250s + http_service: + http_uri: + cluster: "cluster_name" + uri: "https://testhost.com/otlp/v1/traces" + timeout: 0.250s root_spans_per_minute: 3456 )EOF"; @@ -226,11 +229,11 @@ TEST_F(SamplerConfigProviderTest, TestNoValueConfigured) { const std::string yaml_string = R"EOF( tenant: "abc12345" cluster_id: -1743916452 - token: "tokenval" - http_uri: - cluster: "cluster_name" - uri: "https://testhost.com/otlp/v1/traces" - timeout: 500s + http_service: + http_uri: + cluster: "cluster_name" + uri: "https://testhost.com/otlp/v1/traces" + timeout: 500s )EOF"; envoy::extensions::tracers::opentelemetry::samplers::v3::DynatraceSamplerConfig proto_config; @@ -246,11 +249,11 @@ TEST_F(SamplerConfigProviderTest, TestValueZeroConfigured) { const std::string yaml_string = R"EOF( tenant: "abc12345" cluster_id: -1743916452 - token: "tokenval" - http_uri: - cluster: "cluster_name" - uri: "https://testhost.com/otlp/v1/traces" - timeout: 0.250s + http_service: + http_uri: + cluster: "cluster_name" + uri: "https://testhost.com/otlp/v1/traces" + timeout: 0.250s root_spans_per_minute: 0 )EOF";