aboutsummaryrefslogtreecommitdiff
path: root/src/zentelemetry/otlptrace.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-12-11 16:12:02 +0100
committerGitHub Enterprise <[email protected]>2025-12-11 16:12:02 +0100
commit567293ab1baa8cb0eca843977c520e5b8f400b4d (patch)
tree1f54f12d3fb19b91695bbfea33fa9abd8de49f69 /src/zentelemetry/otlptrace.cpp
parent5.7.14 (diff)
downloadzen-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.cpp60
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);
+ });
}
}
}