]>
Commit | Line | Data |
---|---|---|
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- | |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #include "common/ceph_context.h" | |
5 | #include "tracer.h" | |
6 | #include "common/debug.h" | |
7 | ||
8 | #ifdef HAVE_JAEGER | |
9 | #include "opentelemetry/sdk/trace/batch_span_processor.h" | |
10 | #include "opentelemetry/sdk/trace/tracer_provider.h" | |
11 | #include "opentelemetry/exporters/jaeger/jaeger_exporter.h" | |
12 | ||
13 | #define dout_subsys ceph_subsys_trace | |
14 | #undef dout_prefix | |
15 | #define dout_prefix (*_dout << "otel_tracing: ") | |
16 | ||
17 | namespace tracing { | |
18 | ||
19 | const opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> Tracer::noop_tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer("no-op", OPENTELEMETRY_SDK_VERSION); | |
20 | const jspan_ptr Tracer::noop_span = noop_tracer->StartSpan("noop"); | |
21 | ||
22 | using bufferlist = ceph::buffer::list; | |
23 | ||
24 | void Tracer::init(CephContext* _cct, opentelemetry::nostd::string_view service_name) { | |
25 | ceph_assert(_cct); | |
26 | cct = _cct; | |
27 | if (!tracer) { | |
28 | ldout(cct, 3) << "tracer was not loaded, initializing tracing" << dendl; | |
29 | opentelemetry::exporter::jaeger::JaegerExporterOptions exporter_options; | |
30 | exporter_options.server_port = cct->_conf.get_val<int64_t>("jaeger_agent_port"); | |
31 | const opentelemetry::sdk::trace::BatchSpanProcessorOptions processor_options; | |
32 | const auto jaeger_resource = opentelemetry::sdk::resource::Resource::Create(std::move(opentelemetry::sdk::resource::ResourceAttributes{{"service.name", service_name}})); | |
33 | auto jaeger_exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(new opentelemetry::exporter::jaeger::JaegerExporter(exporter_options)); | |
34 | auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(new opentelemetry::sdk::trace::BatchSpanProcessor(std::move(jaeger_exporter), processor_options)); | |
35 | const auto provider = opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider>(new opentelemetry::sdk::trace::TracerProvider(std::move(processor), jaeger_resource)); | |
36 | opentelemetry::trace::Provider::SetTracerProvider(provider); | |
37 | tracer = provider->GetTracer(service_name, OPENTELEMETRY_SDK_VERSION); | |
38 | } | |
39 | } | |
40 | ||
41 | jspan_ptr Tracer::start_trace(opentelemetry::nostd::string_view trace_name) { | |
42 | ceph_assert(cct); | |
43 | if (is_enabled()) { | |
44 | ceph_assert(tracer); | |
45 | ldout(cct, 20) << "start trace for " << trace_name << " " << dendl; | |
46 | return tracer->StartSpan(trace_name); | |
47 | } | |
48 | return noop_span; | |
49 | } | |
50 | ||
51 | jspan_ptr Tracer::start_trace(opentelemetry::nostd::string_view trace_name, bool trace_is_enabled) { | |
52 | ceph_assert(cct); | |
53 | ldout(cct, 20) << "start trace enabled " << trace_is_enabled << " " << dendl; | |
54 | if (trace_is_enabled) { | |
55 | ceph_assert(tracer); | |
56 | ldout(cct, 20) << "start trace for " << trace_name << " " << dendl; | |
57 | return tracer->StartSpan(trace_name); | |
58 | } | |
59 | return noop_tracer->StartSpan(trace_name); | |
60 | } | |
61 | ||
62 | jspan_ptr Tracer::add_span(opentelemetry::nostd::string_view span_name, const jspan_ptr& parent_span) { | |
63 | if (is_enabled() && parent_span && parent_span->IsRecording()) { | |
64 | opentelemetry::trace::StartSpanOptions span_opts; | |
65 | span_opts.parent = parent_span->GetContext(); | |
66 | ldout(cct, 20) << "adding span " << span_name << " " << dendl; | |
67 | return tracer->StartSpan(span_name, span_opts); | |
68 | } | |
69 | return noop_span; | |
70 | } | |
71 | ||
72 | jspan_ptr Tracer::add_span(opentelemetry::nostd::string_view span_name, const jspan_context& parent_ctx) { | |
73 | if (parent_ctx.IsValid()) { | |
74 | ceph_assert(tracer); | |
75 | opentelemetry::trace::StartSpanOptions span_opts; | |
76 | span_opts.parent = parent_ctx; | |
77 | ldout(cct, 20) << "adding span " << span_name << " " << dendl; | |
78 | return tracer->StartSpan(span_name, span_opts); | |
79 | } | |
80 | return noop_span; | |
81 | } | |
82 | ||
83 | bool Tracer::is_enabled() const { | |
84 | return cct->_conf->jaeger_tracing_enable; | |
85 | } | |
86 | ||
87 | } // namespace tracing | |
88 | ||
89 | #endif // HAVE_JAEGER | |
90 |