| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- Getting started
- ---------------
- Tracing
- ~~~~~~~
- When instrumenting libraries and applications, the most simple approach
- requires three steps.
- Obtain a tracer
- ^^^^^^^^^^^^^^^
- .. code:: cpp
- auto provider = opentelemetry::trace::Provider::GetTracerProvider();
- auto tracer = provider->GetTracer("foo_library", "1.0.0");
- The ``TracerProvider`` acquired in the first step is a singleton object
- that is usually provided by the OpenTelemetry C++ SDK. It is used to
- provide specific implementations for API interfaces. In case no SDK is
- used, the API provides a default no-op implementation of a
- ``TracerProvider``.
- The ``Tracer`` acquired in the second step is needed to create and start
- ``Span``\ s.
- Start a span
- ^^^^^^^^^^^^
- .. code:: cpp
- auto span = tracer->StartSpan("HandleRequest");
- This creates a span, sets its name to ``"HandleRequest"``, and sets its
- start time to the current time. Refer to the API documentation for other
- operations that are available to enrich spans with additional data.
- Mark a span as active
- ^^^^^^^^^^^^^^^^^^^^^
- .. code:: cpp
- auto scope = tracer->WithActiveSpan(span);
- This marks a span as active and returns a ``Scope`` object. The scope object
- controls how long a span is active. The span remains active for the lifetime
- of the scope object.
- The concept of an active span is important, as any span that is created
- without explicitly specifying a parent is parented to the currently
- active span. A span without a parent is called root span.
- Create nested Spans
- ^^^^^^^^^^^^^^^^^^^
- .. code:: cpp
- auto outer_span = tracer->StartSpan("Outer operation");
- auto outer_scope = tracer->WithActiveSpan(outer_span);
- {
- auto inner_span = tracer->StartSpan("Inner operation");
- auto inner_scope = tracer->WithActiveSpan(inner_span);
- // ... perform inner operation
- inner_span->End();
- }
- // ... perform outer operation
- outer_span->End();
- Spans can be nested, and have a parent-child relationship with other spans.
- When a given span is active, the newly created span inherits the active span's
- trace ID, and other context attributes.
- Context Propagation
- ^^^^^^^^^^^^^^^^^^
- .. code:: cpp
- // set global propagator
- opentelemetry::context::propagation::GlobalTextMapPropagator::SetGlobalPropagator(
- nostd::shared_ptr<opentelemetry::context::propagation::TextMapPropagator>(
- new opentelemetry::trace::propagation::HttpTraceContext()));
- // get global propagator
- HttpTextMapCarrier<opentelemetry::ext::http::client::Headers> carrier;
- auto propagator =
- opentelemetry::context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();
- //inject context to headers
- auto current_ctx = opentelemetry::context::RuntimeContext::GetCurrent();
- propagator->Inject(carrier, current_ctx);
- //Extract headers to context
- auto current_ctx = opentelemetry::context::RuntimeContext::GetCurrent();
- auto new_context = propagator->Extract(carrier, current_ctx);
- auto remote_span = opentelemetry::trace::propagation::GetSpan(new_context);
- ``Context`` contains the meta-data of the currently active Span including Span Id,
- Trace Id, and flags. Context Propagation is an important mechanism in distributed
- tracing to transfer this Context across service boundary often through HTTP headers.
- OpenTelemetry provides a text-based approach to propagate context to remote services
- using the W3C Trace Context HTTP headers.
|