]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/examples/http/tracer_common.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / examples / http / tracer_common.h
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3
4 #pragma once
5 #include "opentelemetry/exporters/ostream/span_exporter.h"
6 #include "opentelemetry/sdk/trace/simple_processor.h"
7 #include "opentelemetry/sdk/trace/tracer_provider.h"
8 #include "opentelemetry/trace/provider.h"
9
10 #include "opentelemetry/context/propagation/global_propagator.h"
11 #include "opentelemetry/context/propagation/text_map_propagator.h"
12 #include "opentelemetry/trace/propagation/http_trace_context.h"
13
14 #include <cstring>
15 #include <iostream>
16 #include <vector>
17 #include "opentelemetry/ext/http/client/http_client.h"
18 #include "opentelemetry/nostd/shared_ptr.h"
19
20 namespace
21 {
22
23 template <typename T>
24 class HttpTextMapCarrier : public opentelemetry::context::propagation::TextMapCarrier
25 {
26 public:
27 HttpTextMapCarrier<T>(T &headers) : headers_(headers) {}
28 HttpTextMapCarrier() = default;
29 virtual opentelemetry::nostd::string_view Get(
30 opentelemetry::nostd::string_view key) const noexcept override
31 {
32 std::string key_to_compare = key.data();
33 // Header's first letter seems to be automatically capitaliazed by our test http-server, so
34 // compare accordingly.
35 if (key == opentelemetry::trace::propagation::kTraceParent)
36 {
37 key_to_compare = "Traceparent";
38 }
39 else if (key == opentelemetry::trace::propagation::kTraceState)
40 {
41 key_to_compare = "Tracestate";
42 }
43 auto it = headers_.find(key_to_compare);
44 if (it != headers_.end())
45 {
46 return it->second;
47 }
48 return "";
49 }
50
51 virtual void Set(opentelemetry::nostd::string_view key,
52 opentelemetry::nostd::string_view value) noexcept override
53 {
54 headers_.insert(std::pair<std::string, std::string>(std::string(key), std::string(value)));
55 }
56
57 T headers_;
58 };
59
60 void initTracer()
61 {
62 auto exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(
63 new opentelemetry::exporter::trace::OStreamSpanExporter);
64 auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(
65 new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(exporter)));
66 std::vector<std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>> processors;
67 processors.push_back(std::move(processor));
68 // Default is an always-on sampler.
69 auto context = std::make_shared<opentelemetry::sdk::trace::TracerContext>(std::move(processors));
70 auto provider = opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider>(
71 new opentelemetry::sdk::trace::TracerProvider(context));
72 // Set the global trace provider
73 opentelemetry::trace::Provider::SetTracerProvider(provider);
74
75 // set global propagator
76 opentelemetry::context::propagation::GlobalTextMapPropagator::SetGlobalPropagator(
77 opentelemetry::nostd::shared_ptr<opentelemetry::context::propagation::TextMapPropagator>(
78 new opentelemetry::trace::propagation::HttpTraceContext()));
79 }
80
81 opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> get_tracer(std::string tracer_name)
82 {
83 auto provider = opentelemetry::trace::Provider::GetTracerProvider();
84 return provider->GetTracer(tracer_name);
85 }
86
87 } // namespace