NVIDIA DeepStream SDK API Reference

9.2 Release
9.2/includes/opentelemetry/trace/propagation/jaeger.h
Go to the documentation of this file.
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #pragma once
5 
6 #include "detail/hex.h"
7 #include "detail/string.h"
8 #include "opentelemetry/context/propagation/text_map_propagator.h"
9 #include "opentelemetry/trace/context.h"
10 #include "opentelemetry/trace/default_span.h"
11 
13 namespace trace
14 {
15 namespace propagation
16 {
17 
18 static const nostd::string_view kJaegerTraceHeader = "uber-trace-id";
19 
21 {
22 public:
24  const context::Context &context) noexcept override
25  {
26  SpanContext span_context = trace::GetSpan(context)->GetContext();
27  if (!span_context.IsValid())
28  {
29  return;
30  }
31 
32  const size_t trace_id_length = 32;
33  const size_t span_id_length = 16;
34 
35  // trace-id(32):span-id(16):0:debug(2)
36  char trace_identity[trace_id_length + span_id_length + 6];
37  span_context.trace_id().ToLowerBase16(
38  nostd::span<char, 2 * TraceId::kSize>{&trace_identity[0], trace_id_length});
39  trace_identity[trace_id_length] = ':';
40  span_context.span_id().ToLowerBase16(
41  nostd::span<char, 2 * SpanId::kSize>{&trace_identity[trace_id_length + 1], span_id_length});
42  trace_identity[trace_id_length + span_id_length + 1] = ':';
43  trace_identity[trace_id_length + span_id_length + 2] = '0';
44  trace_identity[trace_id_length + span_id_length + 3] = ':';
45  trace_identity[trace_id_length + span_id_length + 4] = '0';
46  trace_identity[trace_id_length + span_id_length + 5] = span_context.IsSampled() ? '1' : '0';
47 
48  carrier.Set(kJaegerTraceHeader, nostd::string_view(trace_identity, sizeof(trace_identity)));
49  }
50 
52  context::Context &context) noexcept override
53  {
54  SpanContext span_context = ExtractImpl(carrier);
55  nostd::shared_ptr<Span> sp{new DefaultSpan(span_context)};
56  if (span_context.IsValid())
57  {
58  return trace::SetSpan(context, sp);
59  }
60  else
61  {
62  return context;
63  }
64  }
65 
66  bool Fields(nostd::function_ref<bool(nostd::string_view)> callback) const noexcept override
67  {
68  return callback(kJaegerTraceHeader);
69  }
70 
71 private:
72  static constexpr uint8_t kIsSampled = 0x01;
73 
74  static TraceFlags GetTraceFlags(uint8_t jaeger_flags)
75  {
76  uint8_t sampled = jaeger_flags & kIsSampled;
77  return TraceFlags(sampled);
78  }
79 
80  static SpanContext ExtractImpl(const context::propagation::TextMapCarrier &carrier)
81  {
82  nostd::string_view trace_identity = carrier.Get(kJaegerTraceHeader);
83 
84  const size_t trace_field_count = 4;
85  nostd::string_view trace_fields[trace_field_count];
86 
87  if (detail::SplitString(trace_identity, ':', trace_fields, trace_field_count) !=
88  trace_field_count)
89  {
90  return SpanContext::GetInvalid();
91  }
92 
93  nostd::string_view trace_id_hex = trace_fields[0];
94  nostd::string_view span_id_hex = trace_fields[1];
95  nostd::string_view flags_hex = trace_fields[3];
96 
97  if (!detail::IsValidHex(trace_id_hex) || !detail::IsValidHex(span_id_hex) ||
98  !detail::IsValidHex(flags_hex))
99  {
100  return SpanContext::GetInvalid();
101  }
102 
103  uint8_t trace_id[16];
104  if (!detail::HexToBinary(trace_id_hex, trace_id, sizeof(trace_id)))
105  {
106  return SpanContext::GetInvalid();
107  }
108 
109  uint8_t span_id[8];
110  if (!detail::HexToBinary(span_id_hex, span_id, sizeof(span_id)))
111  {
112  return SpanContext::GetInvalid();
113  }
114 
115  uint8_t flags;
116  if (!detail::HexToBinary(flags_hex, &flags, sizeof(flags)))
117  {
118  return SpanContext::GetInvalid();
119  }
120 
121  return SpanContext(TraceId(trace_id), SpanId(span_id), GetTraceFlags(flags), true);
122  }
123 };
124 
125 } // namespace propagation
126 } // namespace trace
trace::SetSpan
context::Context SetSpan(context::Context &context, const nostd::shared_ptr< Span > &span) noexcept
Definition: includes/opentelemetry/trace/context.h:37
nostd::function_ref
Definition: includes/opentelemetry/nostd/function_ref.h:17
trace
Definition: includes/opentelemetry/context/context_value.h:18
trace::propagation::JaegerPropagator
Definition: includes/opentelemetry/trace/propagation/jaeger.h:20
trace::SpanContext::trace_id
const trace::TraceId & trace_id() const noexcept
Definition: includes/opentelemetry/trace/span_context.h:63
trace::SpanContext::IsSampled
bool IsSampled() const noexcept
Definition: includes/opentelemetry/trace/span_context.h:88
trace::SpanContext
Definition: includes/opentelemetry/trace/span_context.h:24
trace::TraceId::ToLowerBase16
void ToLowerBase16(nostd::span< char, 2 *kSize > buffer) const noexcept
Definition: includes/opentelemetry/trace/trace_id.h:35
trace::DefaultSpan
DefaultSpan provides a non-operational Span that propagates the tracer context by wrapping it inside ...
Definition: includes/opentelemetry/trace/default_span.h:21
trace::propagation::kJaegerTraceHeader
static const nostd::string_view kJaegerTraceHeader
Definition: includes/opentelemetry/trace/propagation/jaeger.h:18
nostd::shared_ptr
Provide a type-erased version of std::shared_ptr that has ABI stability.
Definition: includes/opentelemetry/nostd/shared_ptr.h:28
OPENTELEMETRY_BEGIN_NAMESPACE
#define OPENTELEMETRY_BEGIN_NAMESPACE
Definition: includes/opentelemetry/version.h:21
nostd::span
Back port of std::span.
Definition: includes/opentelemetry/nostd/span.h:51
trace::propagation::JaegerPropagator::Extract
context::Context Extract(const context::propagation::TextMapCarrier &carrier, context::Context &context) noexcept override
Definition: 9.2/includes/opentelemetry/trace/propagation/jaeger.h:51
trace::propagation::JaegerPropagator::Inject
void Inject(context::propagation::TextMapCarrier &carrier, const context::Context &context) noexcept override
Definition: 9.2/includes/opentelemetry/trace/propagation/jaeger.h:23
trace::propagation::detail::SplitString
size_t SplitString(nostd::string_view s, char separator, nostd::string_view *results, size_t count)
Splits a string by separator, up to given buffer count words.
Definition: includes/opentelemetry/trace/propagation/detail/string.h:23
context
Definition: includes/opentelemetry/context/context.h:16
context::propagation::TextMapPropagator
Definition: includes/opentelemetry/context/propagation/text_map_propagator.h:42
trace::GetSpan
nostd::shared_ptr< Span > GetSpan(const context::Context &context) noexcept
Definition: includes/opentelemetry/trace/context.h:16
OPENTELEMETRY_END_NAMESPACE
#define OPENTELEMETRY_END_NAMESPACE
Definition: includes/opentelemetry/version.h:24
trace::propagation::detail::IsValidHex
bool IsValidHex(nostd::string_view s)
Definition: includes/opentelemetry/trace/propagation/detail/hex.h:42
trace::SpanId::ToLowerBase16
void ToLowerBase16(nostd::span< char, 2 *kSize > buffer) const noexcept
Definition: includes/opentelemetry/trace/span_id.h:29
trace::SpanContext::IsValid
bool IsValid() const noexcept
Definition: includes/opentelemetry/trace/span_context.h:57
trace::SpanContext::span_id
const trace::SpanId & span_id() const noexcept
Definition: includes/opentelemetry/trace/span_context.h:66
context::Context
Definition: includes/opentelemetry/context/context.h:23
context::propagation::TextMapCarrier
Definition: includes/opentelemetry/context/propagation/text_map_propagator.h:18
context::propagation::TextMapCarrier::Get
virtual nostd::string_view Get(nostd::string_view key) const noexcept=0
trace::propagation::JaegerPropagator::Fields
bool Fields(nostd::function_ref< bool(nostd::string_view)> callback) const noexcept override
Definition: 9.2/includes/opentelemetry/trace/propagation/jaeger.h:66
trace::propagation::detail::HexToBinary
bool HexToBinary(nostd::string_view hex, uint8_t *buffer, size_t buffer_size)
Converts a hexadecimal to binary format if the hex string will fit the buffer.
Definition: includes/opentelemetry/trace/propagation/detail/hex.h:51
trace::TraceFlags
Definition: includes/opentelemetry/trace/trace_flags.h:18
trace::SpanContext::GetInvalid
static SpanContext GetInvalid() noexcept
Definition: includes/opentelemetry/trace/span_context.h:86
nostd::string_view
Back port of std::string_view to work with pre-cpp-17 compilers.
Definition: includes/opentelemetry/nostd/string_view.h:37