diff --git a/sdk/include/opentelemetry/sdk/trace/tracer.h b/sdk/include/opentelemetry/sdk/trace/tracer.h index 577785878a..2d0afde498 100644 --- a/sdk/include/opentelemetry/sdk/trace/tracer.h +++ b/sdk/include/opentelemetry/sdk/trace/tracer.h @@ -2,6 +2,7 @@ #include "opentelemetry/sdk/common/atomic_shared_ptr.h" #include "opentelemetry/sdk/trace/processor.h" +#include "opentelemetry/sdk/trace/samplers/always_on.h" #include "opentelemetry/trace/tracer.h" #include "opentelemetry/version.h" @@ -20,7 +21,8 @@ class Tracer final : public trace_api::Tracer, public std::enable_shared_from_th * @param processor The span processor for this tracer. This must not be a * nullptr. */ - explicit Tracer(std::shared_ptr processor) noexcept : processor_{processor} {} + explicit Tracer(std::shared_ptr processor, + std::shared_ptr sampler = std::make_shared()) noexcept; /** * Set the span processor associated with this tracer. @@ -35,6 +37,12 @@ class Tracer final : public trace_api::Tracer, public std::enable_shared_from_th */ std::shared_ptr GetProcessor() const noexcept; + /** + * Obtain the sampler associated with this tracer. + * @return The sampler for this tracer. + */ + std::shared_ptr GetSampler() const noexcept; + nostd::unique_ptr StartSpan( nostd::string_view name, const trace_api::KeyValueIterable &attributes, @@ -46,6 +54,7 @@ class Tracer final : public trace_api::Tracer, public std::enable_shared_from_th private: opentelemetry::sdk::AtomicSharedPtr processor_; + const std::shared_ptr sampler_; }; } // namespace trace } // namespace sdk diff --git a/sdk/include/opentelemetry/sdk/trace/tracer_provider.h b/sdk/include/opentelemetry/sdk/trace/tracer_provider.h index d78fed02fc..6581ad46be 100644 --- a/sdk/include/opentelemetry/sdk/trace/tracer_provider.h +++ b/sdk/include/opentelemetry/sdk/trace/tracer_provider.h @@ -6,6 +6,7 @@ #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/sdk/trace/processor.h" +#include "opentelemetry/sdk/trace/samplers/always_on.h" #include "opentelemetry/sdk/trace/tracer.h" #include "opentelemetry/trace/tracer_provider.h" @@ -18,11 +19,15 @@ class TracerProvider final : public opentelemetry::trace::TracerProvider { public: /** - * Initialize a new tracer provider. + * Initialize a new tracer provider with a specified sampler * @param processor The span processor for this tracer provider. This must * not be a nullptr. + * @param sampler The sampler for this tracer provider. This must + * not be a nullptr. */ - explicit TracerProvider(std::shared_ptr processor) noexcept; + explicit TracerProvider( + std::shared_ptr processor, + std::shared_ptr sampler = std::make_shared()) noexcept; opentelemetry::nostd::shared_ptr GetTracer( nostd::string_view library_name, @@ -41,9 +46,16 @@ class TracerProvider final : public opentelemetry::trace::TracerProvider */ std::shared_ptr GetProcessor() const noexcept; + /** + * Obtain the sampler associated with this tracer provider. + * @return The span processor for this tracer provider. + */ + std::shared_ptr GetSampler() const noexcept; + private: opentelemetry::sdk::AtomicSharedPtr processor_; std::shared_ptr tracer_; + const std::shared_ptr sampler_; }; } // namespace trace } // namespace sdk diff --git a/sdk/src/trace/tracer.cc b/sdk/src/trace/tracer.cc index 311459060b..959fa35259 100644 --- a/sdk/src/trace/tracer.cc +++ b/sdk/src/trace/tracer.cc @@ -9,6 +9,10 @@ namespace sdk { namespace trace { +Tracer::Tracer(std::shared_ptr processor, std::shared_ptr sampler) noexcept + : processor_{processor}, sampler_{sampler} +{} + void Tracer::SetProcessor(std::shared_ptr processor) noexcept { processor_.store(processor); @@ -19,6 +23,11 @@ std::shared_ptr Tracer::GetProcessor() const noexcept return processor_.load(); } +std::shared_ptr Tracer::GetSampler() const noexcept +{ + return sampler_; +} + nostd::unique_ptr Tracer::StartSpan( nostd::string_view name, const trace_api::KeyValueIterable &attributes, diff --git a/sdk/src/trace/tracer_provider.cc b/sdk/src/trace/tracer_provider.cc index 3268207510..32144c4c6b 100644 --- a/sdk/src/trace/tracer_provider.cc +++ b/sdk/src/trace/tracer_provider.cc @@ -5,8 +5,9 @@ namespace sdk { namespace trace { -TracerProvider::TracerProvider(std::shared_ptr processor) noexcept - : processor_{processor}, tracer_(new Tracer(std::move(processor))) +TracerProvider::TracerProvider(std::shared_ptr processor, + std::shared_ptr sampler) noexcept + : processor_{processor}, tracer_(new Tracer(std::move(processor))), sampler_(sampler) {} opentelemetry::nostd::shared_ptr TracerProvider::GetTracer( @@ -28,6 +29,11 @@ std::shared_ptr TracerProvider::GetProcessor() const noexcept { return processor_.load(); } + +std::shared_ptr TracerProvider::GetSampler() const noexcept +{ + return sampler_; +} } // namespace trace } // namespace sdk OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/test/trace/tracer_provider_test.cc b/sdk/test/trace/tracer_provider_test.cc index 90dbe7c747..399ea6d453 100644 --- a/sdk/test/trace/tracer_provider_test.cc +++ b/sdk/test/trace/tracer_provider_test.cc @@ -1,4 +1,6 @@ #include "opentelemetry/sdk/trace/tracer_provider.h" +#include "opentelemetry/sdk/trace/samplers/always_off.h" +#include "opentelemetry/sdk/trace/samplers/always_on.h" #include "opentelemetry/sdk/trace/simple_processor.h" #include "opentelemetry/sdk/trace/tracer.h" @@ -27,3 +29,28 @@ TEST(TracerProvider, GetTracer) ASSERT_NE(nullptr, sdkTracer); ASSERT_EQ(processor, sdkTracer->GetProcessor()); } + +TEST(TracerProvider, GetSampler) +{ + std::shared_ptr processor1(new SimpleSpanProcessor(nullptr)); + + // Create a TracerProvicer with a default AlwaysOnSampler. + TracerProvider tf1(processor1); + auto t1 = tf1.GetSampler(); + auto t2 = tf1.GetSampler(); + ASSERT_NE(nullptr, t1); + ASSERT_NE(nullptr, t2); + + // Should return the same sampler each time. + ASSERT_EQ(t1, t2); + + // Should be AlwaysOnSampler + ASSERT_EQ("AlwaysOnSampler", t2->GetDescription()); + + // Create a TracerProvicer with a custom AlwaysOffSampler. + std::shared_ptr processor2(new SimpleSpanProcessor(nullptr)); + TracerProvider tf2(processor2, std::make_shared()); + auto t3 = tf2.GetSampler(); + + ASSERT_EQ("AlwaysOffSampler", t3->GetDescription()); +} diff --git a/sdk/test/trace/tracer_test.cc b/sdk/test/trace/tracer_test.cc index 056227aa8d..2c6b891818 100644 --- a/sdk/test/trace/tracer_test.cc +++ b/sdk/test/trace/tracer_test.cc @@ -1,5 +1,7 @@ #include "opentelemetry/sdk/trace/tracer.h" #include "opentelemetry/sdk/trace/simple_processor.h" +#include "opentelemetry/sdk/trace/samplers/always_on.h" +#include "opentelemetry/sdk/trace/samplers/always_off.h" #include "opentelemetry/sdk/trace/span_data.h" #include @@ -139,3 +141,21 @@ TEST(Tracer, StartSpanWithAttributes) ASSERT_EQ(1, span_data2->GetAttributes().size()); ASSERT_EQ(3.0, nostd::get(span_data2->GetAttributes().at("attr3"))); } + + +TEST(Tracer, GetSampler) +{ + // Create a Tracer with a default AlwaysOnSampler + std::shared_ptr processor_1(new SimpleSpanProcessor(nullptr)); + std::shared_ptr tracer_on(new Tracer(std::move(processor_1))); + + auto t1 = tracer_on->GetSampler(); + ASSERT_EQ("AlwaysOnSampler", t1->GetDescription()); + + // Create a Tracer with a AlwaysOffSampler + std::shared_ptr processor_2(new SimpleSpanProcessor(nullptr)); + std::shared_ptr tracer_off(new Tracer(std::move(processor_2), std::make_shared())); + + auto t2 = tracer_off->GetSampler(); + ASSERT_EQ("AlwaysOffSampler", t2->GetDescription()); +}