1
#include "source/extensions/tracers/opentelemetry/samplers/parent_based/parent_based_sampler.h"
2

            
3
#include <memory>
4
#include <sstream>
5
#include <string>
6

            
7
#include "source/extensions/tracers/opentelemetry/span_context.h"
8

            
9
namespace Envoy {
10
namespace Extensions {
11
namespace Tracers {
12
namespace OpenTelemetry {
13

            
14
SamplingResult ParentBasedSampler::shouldSample(const StreamInfo::StreamInfo& stream_info,
15
                                                const absl::optional<SpanContext> parent_context,
16
                                                const std::string& trace_id,
17
                                                const std::string& name, OTelSpanKind kind,
18
                                                OptRef<const Tracing::TraceContext> trace_context,
19
121
                                                const std::vector<SpanContext>& links) {
20
121
  if (!parent_context.has_value() || parent_context->traceId().empty()) {
21
100
    return wrapped_sampler_->shouldSample(stream_info, parent_context, trace_id, name, kind,
22
100
                                          trace_context, links);
23
100
  }
24

            
25
21
  SamplingResult result;
26
21
  result.tracestate = parent_context.value().tracestate();
27
21
  if (parent_context->sampled()) {
28
10
    result.decision = Decision::RecordAndSample;
29
11
  } else {
30
11
    result.decision = Decision::Drop;
31
11
  }
32
21
  return result;
33
121
}
34

            
35
1
std::string ParentBasedSampler::getDescription() const { return "ParentBasedSampler"; }
36

            
37
} // namespace OpenTelemetry
38
} // namespace Tracers
39
} // namespace Extensions
40
} // namespace Envoy