aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/diag/otlphttp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenserver/diag/otlphttp.cpp')
-rw-r--r--src/zenserver/diag/otlphttp.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/zenserver/diag/otlphttp.cpp b/src/zenserver/diag/otlphttp.cpp
new file mode 100644
index 000000000..d62ccccb6
--- /dev/null
+++ b/src/zenserver/diag/otlphttp.cpp
@@ -0,0 +1,83 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "otlphttp.h"
+
+#include <zencore/config.h>
+#include <zencore/process.h>
+#include <zencore/session.h>
+#include <zencore/system.h>
+#include <zentelemetry/otlpencoder.h>
+#include <protozero/buffer_string.hpp>
+#include <protozero/pbf_builder.hpp>
+
+#if ZEN_WITH_OTEL
+
+namespace zen::logging {
+
+//////////////////////////////////////////////////////////////////////////
+
+OtelHttpProtobufSink::OtelHttpProtobufSink(const std::string_view& Uri) : m_OtelHttp(Uri)
+{
+ m_Encoder.AddResourceAttribute("service.name", "zenserver");
+ m_Encoder.AddResourceAttribute("service.instance.id", GetSessionIdString());
+ m_Encoder.AddResourceAttribute("service.namespace", "zen");
+ m_Encoder.AddResourceAttribute("service.version", ZEN_CFG_VERSION);
+ m_Encoder.AddResourceAttribute("host.name", GetMachineName());
+ m_Encoder.AddResourceAttribute("session.id", GetSessionIdString());
+ m_Encoder.AddResourceAttribute("process.id", zen::GetCurrentProcessId());
+
+ m_TraceRecorder = new TraceRecorder(this);
+ otel::SetTraceRecorder(m_TraceRecorder);
+}
+
+OtelHttpProtobufSink::~OtelHttpProtobufSink()
+{
+ otel::SetTraceRecorder({});
+}
+
+void
+OtelHttpProtobufSink::RecordSpans(zen::otel::TraceId Trace, std::span<const zen::otel::Span*> Spans)
+{
+ std::string Data = m_Encoder.FormatOtelTrace(Trace, Spans);
+
+ IoBuffer Payload{IoBuffer::Wrap, Data.data(), Data.size()};
+ Payload.SetContentType(ZenContentType::kProtobuf);
+
+ auto Result = m_OtelHttp.Post("/v1/traces", Payload);
+}
+
+void
+OtelHttpProtobufSink::TraceRecorder::RecordSpans(zen::otel::TraceId Trace, std::span<const zen::otel::Span*> Spans)
+{
+ m_Sink->RecordSpans(Trace, Spans);
+}
+
+void
+OtelHttpProtobufSink::log(const spdlog::details::log_msg& Msg)
+{
+ {
+ std::string Data = m_Encoder.FormatOtelProtobuf(Msg);
+
+ IoBuffer Payload{IoBuffer::Wrap, Data.data(), Data.size()};
+ Payload.SetContentType(ZenContentType::kProtobuf);
+
+ auto Result = m_OtelHttp.Post("/v1/logs", Payload);
+ }
+
+ {
+ std::string Data = m_Encoder.FormatOtelMetrics();
+
+ IoBuffer Payload{IoBuffer::Wrap, Data.data(), Data.size()};
+ Payload.SetContentType(ZenContentType::kProtobuf);
+
+ auto Result = m_OtelHttp.Post("/v1/metrics", Payload);
+ }
+}
+void
+OtelHttpProtobufSink::flush()
+{
+}
+
+} // namespace zen::logging
+
+#endif