| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | Getting started---------------Tracing~~~~~~~When instrumenting libraries and applications, the most simple approachrequires 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 objectthat is usually provided by the OpenTelemetry C++ SDK. It is used toprovide specific implementations for API interfaces. In case no SDK isused, 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 itsstart time to the current time. Refer to the API documentation for otheroperations 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 objectcontrols how long a span is active. The span remains active for the lifetimeof the scope object.The concept of an active span is important, as any span that is createdwithout explicitly specifying a parent is parented to the currentlyactive 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'strace 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 distributedtracing to transfer this Context across service boundary often through HTTP headers.OpenTelemetry provides a text-based approach to propagate context to remote servicesusing the W3C Trace Context HTTP headers.
 |