]>
git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/examples/multithreaded/main.cc
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
4 #include "opentelemetry/sdk/resource/resource.h"
5 #include "opentelemetry/sdk/trace/simple_processor.h"
6 #include "opentelemetry/sdk/trace/tracer_provider.h"
7 #include "opentelemetry/trace/provider.h"
8 #include "opentelemetry/trace/scope.h"
10 // Using an exporter that simply dumps span data to stdout.
11 #include "opentelemetry/exporters/ostream/span_exporter.h"
16 namespace trace_api
= opentelemetry::trace
;
17 namespace trace_sdk
= opentelemetry::sdk::trace
;
18 namespace nostd
= opentelemetry::nostd
;
24 auto exporter
= std::unique_ptr
<trace_sdk::SpanExporter
>(
25 new opentelemetry::exporter::trace::OStreamSpanExporter
);
26 auto processor
= std::unique_ptr
<trace_sdk::SpanProcessor
>(
27 new trace_sdk::SimpleSpanProcessor(std::move(exporter
)));
28 auto provider
= nostd::shared_ptr
<trace_api::TracerProvider
>(new trace_sdk::TracerProvider(
29 std::move(processor
), opentelemetry::sdk::resource::Resource::Create({})));
30 // Set the global trace provider
31 trace_api::Provider::SetTracerProvider(provider
);
34 nostd::shared_ptr
<trace_api::Tracer
> get_tracer()
36 auto provider
= trace_api::Provider::GetTracerProvider();
37 return provider
->GetTracer("foo_library");
43 auto thread_span
= get_tracer()->StartSpan(__func__
);
45 std::vector
<std::thread
> threads
;
46 for (int thread_num
= 0; thread_num
< 5; ++thread_num
)
48 // This shows how one can effectively use Scope objects to correctly
49 // parent spans across threads.
50 threads
.push_back(std::thread([=] {
51 trace_api::Scope
scope(thread_span
);
53 get_tracer()->StartSpan(std::string("thread ") + std::to_string(thread_num
));
57 std::for_each(threads
.begin(), threads
.end(), [](std::thread
&th
) { th
.join(); });
64 auto root_span
= get_tracer()->StartSpan(__func__
);
65 trace_api::Scope
scope(root_span
);