Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion sdk/include/opentelemetry/sdk/trace/sampler.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "opentelemetry/common/attribute_value.h"
#include "opentelemetry/trace/span.h"
#include "opentelemetry/trace/span_context.h"
#include "opentelemetry/trace/span_context_kv_iterable.h"
#include "opentelemetry/trace/trace_id.h"
#include "opentelemetry/version.h"

Expand Down Expand Up @@ -70,7 +71,8 @@ class Sampler
trace_api::TraceId trace_id,
nostd::string_view name,
trace_api::SpanKind span_kind,
const opentelemetry::common::KeyValueIterable &attributes) noexcept = 0;
const opentelemetry::common::KeyValueIterable &attributes,
const trace_api::SpanContextKeyValueIterable &links) noexcept = 0;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The TODO on line 64 can be removed.


/**
* Returns the sampler name or short description with the configuration.
Expand Down
3 changes: 2 additions & 1 deletion sdk/include/opentelemetry/sdk/trace/samplers/always_off.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ class AlwaysOffSampler : public Sampler
trace_api::TraceId /*trace_id*/,
nostd::string_view /*name*/,
trace_api::SpanKind /*span_kind*/,
const opentelemetry::common::KeyValueIterable & /*attributes*/) noexcept override
const opentelemetry::common::KeyValueIterable & /*attributes*/,
const trace_api::SpanContextKeyValueIterable & /*links*/) noexcept override
{
return {Decision::DROP, nullptr};
}
Expand Down
3 changes: 2 additions & 1 deletion sdk/include/opentelemetry/sdk/trace/samplers/always_on.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ class AlwaysOnSampler : public Sampler
trace_api::TraceId /*trace_id*/,
nostd::string_view /*name*/,
trace_api::SpanKind /*span_kind*/,
const opentelemetry::common::KeyValueIterable & /*attributes*/) noexcept override
const opentelemetry::common::KeyValueIterable & /*attributes*/,
const trace_api::SpanContextKeyValueIterable & /*links*/) noexcept override
{
return {Decision::RECORD_AND_SAMPLE, nullptr};
}
Expand Down
3 changes: 2 additions & 1 deletion sdk/include/opentelemetry/sdk/trace/samplers/parent.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ class ParentBasedSampler : public Sampler
trace_api::TraceId trace_id,
nostd::string_view name,
trace_api::SpanKind span_kind,
const opentelemetry::common::KeyValueIterable &attributes) noexcept override;
const opentelemetry::common::KeyValueIterable &attributes,
const trace_api::SpanContextKeyValueIterable &links) noexcept override;

/**
* @return Description MUST be ParentBased{delegate_sampler_.getDescription()}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ class TraceIdRatioBasedSampler : public Sampler
trace_api::TraceId trace_id,
nostd::string_view /*name*/,
trace_api::SpanKind /*span_kind*/,
const opentelemetry::common::KeyValueIterable & /*attributes*/) noexcept override;
const opentelemetry::common::KeyValueIterable & /*attributes*/,
const trace_api::SpanContextKeyValueIterable & /*links*/) noexcept override;

/**
* @return Description MUST be TraceIdRatioBasedSampler{0.000100}
Expand Down
6 changes: 4 additions & 2 deletions sdk/src/trace/samplers/parent.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@ SamplingResult ParentBasedSampler::ShouldSample(
trace_api::TraceId trace_id,
nostd::string_view name,
trace_api::SpanKind span_kind,
const opentelemetry::common::KeyValueIterable &attributes) noexcept
const opentelemetry::common::KeyValueIterable &attributes,
const trace_api::SpanContextKeyValueIterable &links) noexcept
{
if (!parent_context.IsValid())
{
// If no parent (root span) exists returns the result of the delegateSampler
return delegate_sampler_->ShouldSample(parent_context, trace_id, name, span_kind, attributes);
return delegate_sampler_->ShouldSample(parent_context, trace_id, name, span_kind, attributes,
links);
}

// If parent exists:
Expand Down
3 changes: 2 additions & 1 deletion sdk/src/trace/samplers/trace_id_ratio.cc
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ SamplingResult TraceIdRatioBasedSampler::ShouldSample(
trace_api::TraceId trace_id,
nostd::string_view /*name*/,
trace_api::SpanKind /*span_kind*/,
const opentelemetry::common::KeyValueIterable & /*attributes*/) noexcept
const opentelemetry::common::KeyValueIterable & /*attributes*/,
const trace_api::SpanContextKeyValueIterable & /*links*/) noexcept
{
if (threshold_ == 0)
return {Decision::DROP, nullptr};
Expand Down
3 changes: 1 addition & 2 deletions sdk/src/trace/tracer.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include "opentelemetry/sdk/trace/tracer.h"

#include "opentelemetry/context/runtime_context.h"
#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/sdk/common/atomic_shared_ptr.h"
Expand Down Expand Up @@ -60,7 +59,7 @@ nostd::shared_ptr<trace_api::Span> Tracer::StartSpan(
trace_api::SpanContext parent = GetCurrentSpanContext(options.parent);

auto sampling_result =
sampler_->ShouldSample(parent, parent.trace_id(), name, options.kind, attributes);
sampler_->ShouldSample(parent, parent.trace_id(), name, options.kind, attributes, links);
if (sampling_result.decision == Decision::DROP)
{
// Don't allocate a no-op span for every DROP decision, but use a static
Expand Down
11 changes: 8 additions & 3 deletions sdk/test/trace/always_off_sampler_test.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "opentelemetry/sdk/trace/samplers/always_off.h"

#include <gtest/gtest.h>
#include "opentelemetry/sdk/trace/samplers/always_off.h"
#include "opentelemetry/trace/span_context_kv_iterable_view.h"

using opentelemetry::sdk::trace::AlwaysOffSampler;
using opentelemetry::sdk::trace::Decision;
Expand All @@ -15,10 +15,15 @@ TEST(AlwaysOffSampler, ShouldSample)

using M = std::map<std::string, int>;
M m1 = {{}};

using L = std::vector<std::pair<SpanContext, std::map<std::string, std::string>>>;
L l1 = {{SpanContext(false, false), {}}, {SpanContext(false, false), {}}};

opentelemetry::common::KeyValueIterableView<M> view{m1};
opentelemetry::trace::SpanContextKeyValueIterableView<L> links{l1};

auto sampling_result =
sampler.ShouldSample(SpanContext::GetInvalid(), trace_id, "", span_kind, view);
sampler.ShouldSample(SpanContext::GetInvalid(), trace_id, "", span_kind, view, links);

ASSERT_EQ(Decision::DROP, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);
Expand Down
12 changes: 10 additions & 2 deletions sdk/test/trace/always_on_sampler_test.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "opentelemetry/nostd/span.h"
#include "opentelemetry/sdk/trace/samplers/always_on.h"
#include "opentelemetry/trace/span_context_kv_iterable_view.h"

#include <gtest/gtest.h>
#include <map>
Expand All @@ -19,11 +20,17 @@ TEST(AlwaysOnSampler, ShouldSample)
trace_api::TraceId trace_id_valid(buf);
std::map<std::string, int> key_value_container = {{"key", 0}};

using L = std::vector<std::pair<trace_api::SpanContext, std::map<std::string, std::string>>>;
L l1 = {{trace_api::SpanContext(false, false), {}}, {trace_api::SpanContext(false, false), {}}};

opentelemetry::trace::SpanContextKeyValueIterableView<L> links{l1};

// Test with invalid (empty) trace id and empty parent context
auto sampling_result = sampler.ShouldSample(
SpanContext::GetInvalid(), trace_id_invalid, "invalid trace id test",
trace_api::SpanKind::kServer,
opentelemetry::common::KeyValueIterableView<std::map<std::string, int>>(key_value_container));
opentelemetry::common::KeyValueIterableView<std::map<std::string, int>>(key_value_container),
links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);
Expand All @@ -32,7 +39,8 @@ TEST(AlwaysOnSampler, ShouldSample)
sampling_result = sampler.ShouldSample(
SpanContext::GetInvalid(), trace_id_valid, "valid trace id test",
trace_api::SpanKind::kServer,
opentelemetry::common::KeyValueIterableView<std::map<std::string, int>>(key_value_container));
opentelemetry::common::KeyValueIterableView<std::map<std::string, int>>(key_value_container),
links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);
Expand Down
18 changes: 12 additions & 6 deletions sdk/test/trace/parent_sampler_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "opentelemetry/sdk/trace/samplers/always_off.h"
#include "opentelemetry/sdk/trace/samplers/always_on.h"
#include "opentelemetry/sdk/trace/samplers/parent.h"
#include "opentelemetry/trace/span_context_kv_iterable_view.h"

using opentelemetry::sdk::trace::AlwaysOffSampler;
using opentelemetry::sdk::trace::AlwaysOnSampler;
Expand All @@ -24,28 +25,33 @@ TEST(ParentBasedSampler, ShouldSample)
opentelemetry::trace::SpanKind span_kind = opentelemetry::trace::SpanKind::kInternal;
using M = std::map<std::string, int>;
M m1 = {{}};

using L = std::vector<std::pair<trace_api::SpanContext, std::map<std::string, std::string>>>;
L l1 = {{trace_api::SpanContext(false, false), {}}, {trace_api::SpanContext(false, false), {}}};

opentelemetry::common::KeyValueIterableView<M> view{m1};
trace_api::SpanContextKeyValueIterableView<L> links{l1};
trace_api::SpanContext parent_context_sampled(trace_id, span_id, trace_api::TraceFlags{1}, false);
trace_api::SpanContext parent_context_nonsampled(trace_id, span_id, trace_api::TraceFlags{0},
false);

// Case 1: Parent doesn't exist. Return result of delegateSampler()
auto sampling_result =
sampler_off.ShouldSample(trace_api::SpanContext::GetInvalid(), trace_id, "", span_kind, view);
auto sampling_result2 =
sampler_on.ShouldSample(trace_api::SpanContext::GetInvalid(), trace_id, "", span_kind, view);
auto sampling_result = sampler_off.ShouldSample(trace_api::SpanContext::GetInvalid(), trace_id,
"", span_kind, view, links);
auto sampling_result2 = sampler_on.ShouldSample(trace_api::SpanContext::GetInvalid(), trace_id,
"", span_kind, view, links);

ASSERT_EQ(Decision::DROP, sampling_result.decision);
ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result2.decision);

// Case 2: Parent exists and SampledFlag is true
auto sampling_result3 =
sampler_off.ShouldSample(parent_context_sampled, trace_id, "", span_kind, view);
sampler_off.ShouldSample(parent_context_sampled, trace_id, "", span_kind, view, links);
ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result3.decision);

// Case 3: Parent exists and SampledFlag is false
auto sampling_result4 =
sampler_on.ShouldSample(parent_context_nonsampled, trace_id, "", span_kind, view);
sampler_on.ShouldSample(parent_context_nonsampled, trace_id, "", span_kind, view, links);
ASSERT_EQ(Decision::DROP, sampling_result4.decision);
}

Expand Down
8 changes: 7 additions & 1 deletion sdk/test/trace/sampler_benchmark.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,18 @@ void BenchmarkShouldSampler(Sampler &sampler, benchmark::State &state)

using M = std::map<std::string, int>;
M m1 = {{}};

using L = std::vector<std::pair<trace_api::SpanContext, std::map<std::string, std::string>>>;
L l1 = {{trace_api::SpanContext(false, false), {}}, {trace_api::SpanContext(false, false), {}}};

opentelemetry::common::KeyValueIterableView<M> view{m1};
trace_api::SpanContextKeyValueIterableView<L> links{l1};

while (state.KeepRunning())
{
auto invalid_ctx = SpanContext::GetInvalid();
benchmark::DoNotOptimize(sampler.ShouldSample(invalid_ctx, trace_id, "", span_kind, view));
benchmark::DoNotOptimize(
sampler.ShouldSample(invalid_ctx, trace_id, "", span_kind, view, links));
}
}

Expand Down
46 changes: 31 additions & 15 deletions sdk/test/trace/trace_id_ratio_sampler_test.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "opentelemetry/sdk/trace/samplers/trace_id_ratio.h"
#include "opentelemetry/trace/span_context_kv_iterable_view.h"
#include "src/common/random.h"

#include <gtest/gtest.h>
Expand Down Expand Up @@ -34,7 +35,12 @@ int RunShouldSampleCountDecision(trace_api::SpanContext &context,

using M = std::map<std::string, int>;
M m1 = {{}};

using L = std::vector<std::pair<trace_api::SpanContext, std::map<std::string, std::string>>>;
L l1 = {{trace_api::SpanContext(false, false), {}}, {trace_api::SpanContext(false, false), {}}};

opentelemetry::common::KeyValueIterableView<M> view{m1};
trace_api::SpanContextKeyValueIterableView<L> links{l1};

for (int i = 0; i < iterations; ++i)
{
Expand All @@ -43,7 +49,7 @@ int RunShouldSampleCountDecision(trace_api::SpanContext &context,

opentelemetry::trace::TraceId trace_id(buf);

auto result = sampler.ShouldSample(context, trace_id, "", span_kind, view);
auto result = sampler.ShouldSample(context, trace_id, "", span_kind, view, links);
if (result.decision == Decision::RECORD_AND_SAMPLE)
{
++actual_count;
Expand All @@ -62,45 +68,50 @@ TEST(TraceIdRatioBasedSampler, ShouldSampleWithoutContext)

using M = std::map<std::string, int>;
M m1 = {{}};

using L = std::vector<std::pair<trace_api::SpanContext, std::map<std::string, std::string>>>;
L l1 = {{trace_api::SpanContext(false, false), {}}, {trace_api::SpanContext(false, false), {}}};

opentelemetry::common::KeyValueIterableView<M> view{m1};
trace_api::SpanContextKeyValueIterableView<L> links{l1};

TraceIdRatioBasedSampler s1(0.01);

auto sampling_result =
s1.ShouldSample(trace_api::SpanContext::GetInvalid(), invalid_trace_id, "", span_kind, view);
auto sampling_result = s1.ShouldSample(trace_api::SpanContext::GetInvalid(), invalid_trace_id, "",
span_kind, view, links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);

constexpr uint8_t buf[] = {0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0, 0, 0, 0, 0, 0, 0};
opentelemetry::trace::TraceId valid_trace_id(buf);

sampling_result =
s1.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "", span_kind, view);
sampling_result = s1.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "",
span_kind, view, links);

ASSERT_EQ(Decision::DROP, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);

TraceIdRatioBasedSampler s2(0.50000001);

sampling_result =
s2.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "", span_kind, view);
sampling_result = s2.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "",
span_kind, view, links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);

TraceIdRatioBasedSampler s3(0.49999999);

sampling_result =
s3.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "", span_kind, view);
sampling_result = s3.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "",
span_kind, view, links);

ASSERT_EQ(Decision::DROP, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);

TraceIdRatioBasedSampler s4(0.50000000);

sampling_result =
s4.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "", span_kind, view);
sampling_result = s4.ShouldSample(trace_api::SpanContext::GetInvalid(), valid_trace_id, "",
span_kind, view, links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);
Expand All @@ -122,26 +133,31 @@ TEST(TraceIdRatioBasedSampler, ShouldSampleWithContext)

using M = std::map<std::string, int>;
M m1 = {{}};

using L = std::vector<std::pair<trace_api::SpanContext, std::map<std::string, std::string>>>;
L l1 = {{trace_api::SpanContext(false, false), {}}, {trace_api::SpanContext(false, false), {}}};

opentelemetry::common::KeyValueIterableView<M> view{m1};
trace_api::SpanContextKeyValueIterableView<L> links{l1};

TraceIdRatioBasedSampler s1(0.01);

auto sampling_result = s1.ShouldSample(c1, trace_id, "", span_kind, view);
auto sampling_result = s1.ShouldSample(c1, trace_id, "", span_kind, view, links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);

sampling_result = s1.ShouldSample(c2, trace_id, "", span_kind, view);
sampling_result = s1.ShouldSample(c2, trace_id, "", span_kind, view, links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);

sampling_result = s1.ShouldSample(c3, trace_id, "", span_kind, view);
sampling_result = s1.ShouldSample(c3, trace_id, "", span_kind, view, links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);

sampling_result = s1.ShouldSample(c4, trace_id, "", span_kind, view);
sampling_result = s1.ShouldSample(c4, trace_id, "", span_kind, view, links);

ASSERT_EQ(Decision::RECORD_AND_SAMPLE, sampling_result.decision);
ASSERT_EQ(nullptr, sampling_result.attributes);
Expand Down
3 changes: 2 additions & 1 deletion sdk/test/trace/tracer_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ class MockSampler final : public Sampler
trace_api::TraceId /*trace_id*/,
nostd::string_view /*name*/,
trace_api::SpanKind /*span_kind*/,
const opentelemetry::common::KeyValueIterable & /*attributes*/) noexcept override
const opentelemetry::common::KeyValueIterable & /*attributes*/,
const opentelemetry::trace::SpanContextKeyValueIterable & /*links*/) noexcept override
{
// Return two pairs of attributes. These attributes should be added to the
// span attributes
Expand Down