diff options
| author | Stefan Boberg <[email protected]> | 2025-12-11 16:12:02 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-12-11 16:12:02 +0100 |
| commit | 567293ab1baa8cb0eca843977c520e5b8f400b4d (patch) | |
| tree | 1f54f12d3fb19b91695bbfea33fa9abd8de49f69 /src/zentelemetry/otlptrace.cpp | |
| parent | 5.7.14 (diff) | |
| download | zen-567293ab1baa8cb0eca843977c520e5b8f400b4d.tar.xz zen-567293ab1baa8cb0eca843977c520e5b8f400b4d.zip | |
add otel instrumentation (#581)
this change adds OTEL tracing to a few places
* Top-level application lifecycle (config/init/cleanup, main loop)
* http.sys requests
it also brings some otlptrace optimizations and dynamic configuration of tracing. OTLP tracing is currently always disabled
Diffstat (limited to 'src/zentelemetry/otlptrace.cpp')
| -rw-r--r-- | src/zentelemetry/otlptrace.cpp | 60 |
1 files changed, 37 insertions, 23 deletions
diff --git a/src/zentelemetry/otlptrace.cpp b/src/zentelemetry/otlptrace.cpp index b634eacf6..f987afcfe 100644 --- a/src/zentelemetry/otlptrace.cpp +++ b/src/zentelemetry/otlptrace.cpp @@ -7,6 +7,7 @@ # include <zencore/endian.h> # include <zencore/memory/memoryarena.h> +# include <zencore/scopeguard.h> # include <zencore/session.h> # include <zencore/testing.h> # include <zencore/uid.h> @@ -106,16 +107,15 @@ Span::~Span() void Span::End() { - if (m_Ended) + if (m_EndTime) { return; } - ZEN_ASSERT(t_TraceState.ActiveSpan == this); + ZEN_ASSERT_SLOW(t_TraceState.ActiveSpan == this); - m_Ended = true; - t_TraceState.ActiveSpan = m_ParentSpan; m_EndTime = NowInNanoseconds(); + t_TraceState.ActiveSpan = m_ParentSpan; } Span* @@ -127,10 +127,10 @@ Span::GetCurrentSpan() SpanId Span::GetCurrentSpanId(TraceId& OutTraceId) { - if (t_TraceState.ActiveSpan) + if (const auto& State = t_TraceState; State.ActiveSpan) { - OutTraceId = t_TraceState.CurrentTraceId; - return t_TraceState.ActiveSpan->m_SpanId; + OutTraceId = State.CurrentTraceId; + return State.ActiveSpan->m_SpanId; } else { @@ -271,6 +271,14 @@ IsRecording() ////////////////////////////////////////////////////////////////////////// +std::atomic<bool> g_OtlpTraceEnabled{false}; + +inline bool +IsOtlpTraceEnabled() +{ + return g_OtlpTraceEnabled.load(); +} + thread_local Tracer* t_Tracer; struct Tracer::Impl @@ -325,22 +333,19 @@ Tracer::GetTracer() ScopedSpan Tracer::CreateSpan(std::string_view Name) { - Tracer* TracerPtr = GetTracer(); - - Impl* const ImplPtr = TracerPtr->m_Impl; - - Span* NewSpan = new (ImplPtr->m_Arena) Span(ImplPtr->m_Arena, Name, ImplPtr->m_SpanChain); - - ImplPtr->m_SpanChain = NewSpan; - ImplPtr->m_SpanCount.fetch_add(1); - - return ScopedSpan(NewSpan, TracerPtr); + return ScopedSpan(Name); } ////////////////////////////////////////////////////////////////////////// ScopedSpan::ScopedSpan(std::string_view Name) { + if (!IsOtlpTraceEnabled()) + { + // m_Tracer and m_Span remain null + return; + } + Tracer* TracerPtr = Tracer::GetTracer(); Tracer::Impl* const ImplPtr = TracerPtr->m_Impl; @@ -379,15 +384,24 @@ otlptrace_forcelink() TEST_CASE("otlp.trace") { + // Enable OTLP tracing for the duration of this test + auto _ = MakeGuard([PreviousState = zen::otel::g_OtlpTraceEnabled.load()]() { zen::otel::g_OtlpTraceEnabled.store(PreviousState); }); + zen::otel::g_OtlpTraceEnabled.store(true); + { - ScopedSpan Span = Tracer::CreateSpan("span0"); - Span->AddEvent("TestEvent1"sv); - Span->AddEvent("TestEvent2"sv); + ScopedSpan Span0("span0", [](Span& S) { + S.AddAttribute("attr1"sv, "value1"sv); + S.AddAttribute("attr2"sv, 42ULL); + S.AddEvent("TestEvent1"sv); + S.AddEvent("TestEvent2"sv); + }); { - ScopedSpan Span2 = Tracer::CreateSpan("span1"); - Span2->AddEvent("TestEvent3"sv); - Span2->AddEvent("TestEvent4"sv); + ScopedSpan Span1 = Tracer::CreateSpan("span1"); + Span1.WithSpan([](Span& S) { + S.AddEvent("TestEvent3"sv); + S.AddEvent("TestEvent4"sv); + }); } } } |