]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
20effc67 TL |
4 | #include "common/ceph_context.h" |
5 | #include "global/global_context.h" | |
f67539c2 | 6 | #include "tracer.h" |
20effc67 TL |
7 | |
8 | #ifdef HAVE_JAEGER | |
9 | ||
10 | ||
11 | namespace tracing { | |
12 | ||
13 | const opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> Tracer::noop_tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer("no-op", OPENTELEMETRY_SDK_VERSION); | |
14 | ||
15 | using bufferlist = ceph::buffer::list; | |
16 | ||
17 | Tracer::Tracer(opentelemetry::nostd::string_view service_name) { | |
18 | init(service_name); | |
19 | } | |
20 | ||
21 | void Tracer::init(opentelemetry::nostd::string_view service_name) { | |
22 | if (!tracer) { | |
23 | const opentelemetry::exporter::jaeger::JaegerExporterOptions opts; | |
24 | auto jaeger_exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(new opentelemetry::exporter::jaeger::JaegerExporter(opts)); | |
25 | auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(jaeger_exporter))); | |
26 | const auto jaeger_resource = opentelemetry::sdk::resource::Resource::Create(std::move(opentelemetry::sdk::resource::ResourceAttributes{{"service.name", service_name}})); | |
27 | const auto provider = opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider>(new opentelemetry::sdk::trace::TracerProvider(std::move(processor), jaeger_resource)); | |
28 | tracer = provider->GetTracer(service_name, OPENTELEMETRY_SDK_VERSION); | |
f67539c2 | 29 | } |
20effc67 | 30 | } |
f67539c2 | 31 | |
20effc67 TL |
32 | void Tracer::shutdown() { |
33 | if (tracer) { | |
34 | tracer->CloseWithMicroseconds(1); | |
35 | } | |
36 | } | |
f67539c2 | 37 | |
20effc67 TL |
38 | jspan Tracer::start_trace(opentelemetry::nostd::string_view trace_name) { |
39 | if (is_enabled()) { | |
40 | return tracer->StartSpan(trace_name); | |
41 | } | |
42 | return noop_tracer->StartSpan(trace_name); | |
43 | } | |
f67539c2 | 44 | |
20effc67 TL |
45 | jspan Tracer::add_span(opentelemetry::nostd::string_view span_name, const jspan& parent_span) { |
46 | if (is_enabled() && parent_span) { | |
47 | const auto parent_ctx = parent_span->GetContext(); | |
48 | return add_span(span_name, parent_ctx); | |
f67539c2 | 49 | } |
20effc67 TL |
50 | return noop_tracer->StartSpan(span_name); |
51 | } | |
f67539c2 | 52 | |
20effc67 TL |
53 | jspan Tracer::add_span(opentelemetry::nostd::string_view span_name, const jspan_context& parent_ctx) { |
54 | if (is_enabled() && parent_ctx.IsValid()) { | |
55 | opentelemetry::trace::StartSpanOptions span_opts; | |
56 | span_opts.parent = parent_ctx; | |
57 | return tracer->StartSpan(span_name, span_opts); | |
f67539c2 | 58 | } |
20effc67 TL |
59 | return noop_tracer->StartSpan(span_name); |
60 | } | |
61 | ||
62 | bool Tracer::is_enabled() const { | |
63 | return g_ceph_context->_conf->jaeger_tracing_enable; | |
f67539c2 | 64 | } |
20effc67 TL |
65 | |
66 | void encode(const jspan_context& span_ctx, bufferlist& bl, uint64_t f) { | |
67 | ENCODE_START(1, 1, bl); | |
68 | using namespace opentelemetry; | |
69 | using namespace trace; | |
70 | auto is_valid = span_ctx.IsValid(); | |
71 | encode(is_valid, bl); | |
72 | if (is_valid) { | |
73 | encode_nohead(std::string_view(reinterpret_cast<const char*>(span_ctx.trace_id().Id().data()), TraceId::kSize), bl); | |
74 | encode_nohead(std::string_view(reinterpret_cast<const char*>(span_ctx.span_id().Id().data()), SpanId::kSize), bl); | |
75 | encode(span_ctx.trace_flags().flags(), bl); | |
76 | } | |
77 | ENCODE_FINISH(bl); | |
78 | } | |
79 | ||
80 | void decode(jspan_context& span_ctx, bufferlist::const_iterator& bl) { | |
81 | using namespace opentelemetry; | |
82 | using namespace trace; | |
83 | DECODE_START(1, bl); | |
84 | bool is_valid; | |
85 | decode(is_valid, bl); | |
86 | if (is_valid) { | |
87 | std::array<uint8_t, TraceId::kSize> trace_id; | |
88 | std::array<uint8_t, SpanId::kSize> span_id; | |
89 | uint8_t flags; | |
90 | decode(trace_id, bl); | |
91 | decode(span_id, bl); | |
92 | decode(flags, bl); | |
93 | span_ctx = SpanContext( | |
94 | TraceId(nostd::span<uint8_t, TraceId::kSize>(trace_id)), | |
95 | SpanId(nostd::span<uint8_t, SpanId::kSize>(span_id)), | |
96 | TraceFlags(flags), | |
97 | true); | |
98 | } | |
99 | DECODE_FINISH(bl); | |
100 | } | |
101 | } // namespace tracing | |
102 | ||
103 | #endif // HAVE_JAEGER |