]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | // Copyright The OpenTelemetry Authors |
2 | // SPDX-License-Identifier: Apache-2.0 | |
3 | ||
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" | |
9 | ||
10 | // Using an exporter that simply dumps span data to stdout. | |
11 | #include "opentelemetry/exporters/ostream/span_exporter.h" | |
12 | ||
13 | #include <algorithm> | |
14 | #include <thread> | |
15 | ||
16 | namespace trace_api = opentelemetry::trace; | |
17 | namespace trace_sdk = opentelemetry::sdk::trace; | |
18 | namespace nostd = opentelemetry::nostd; | |
19 | ||
20 | namespace | |
21 | { | |
22 | void initTracer() | |
23 | { | |
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); | |
32 | } | |
33 | ||
34 | nostd::shared_ptr<trace_api::Tracer> get_tracer() | |
35 | { | |
36 | auto provider = trace_api::Provider::GetTracerProvider(); | |
37 | return provider->GetTracer("foo_library"); | |
38 | } | |
39 | } // namespace | |
40 | ||
41 | void run_threads() | |
42 | { | |
43 | auto thread_span = get_tracer()->StartSpan(__func__); | |
44 | ||
45 | std::vector<std::thread> threads; | |
46 | for (int thread_num = 0; thread_num < 5; ++thread_num) | |
47 | { | |
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); | |
52 | auto thread_span = | |
53 | get_tracer()->StartSpan(std::string("thread ") + std::to_string(thread_num)); | |
54 | })); | |
55 | } | |
56 | ||
57 | std::for_each(threads.begin(), threads.end(), [](std::thread &th) { th.join(); }); | |
58 | } | |
59 | ||
60 | int main() | |
61 | { | |
62 | initTracer(); | |
63 | ||
64 | auto root_span = get_tracer()->StartSpan(__func__); | |
65 | trace_api::Scope scope(root_span); | |
66 | ||
67 | run_threads(); | |
68 | } |