diff --git a/core/src/tracing/span.cpp b/core/src/tracing/span.cpp index 8540a8d44381..548c8b3ddcab 100644 --- a/core/src/tracing/span.cpp +++ b/core/src/tracing/span.cpp @@ -68,6 +68,56 @@ std::string GenerateSpanId() { return utils::encoding::ToHex(&random_value, 8); } +struct EventAttributeWriteVisitor { + explicit EventAttributeWriteVisitor(formats::json::StringBuilder& builder) : builder{builder} {} + + template + void operator()(const T& value) { + if constexpr (std::is_same_v) { + builder.WriteString(value); + } else if constexpr (std::is_integral_v && std::is_unsigned_v) { + builder.WriteUInt64(value); + } else if constexpr (std::is_integral_v) { + builder.WriteInt64(value); + } else if constexpr (std::is_floating_point_v) { + builder.WriteDouble(value); + } + } + + formats::json::StringBuilder& builder; +}; + +void HandleEventAttributes(const Span::Event& events, formats::json::StringBuilder& builder) { + builder.Key("attributes"); + const formats::json::StringBuilder::ObjectGuard attributes_guard(builder); + + for (const auto& [key, value] : events.attributes) { + builder.Key(key); + EventAttributeWriteVisitor write_visitor(builder); + std::visit(write_visitor, value); + } +} + +std::string MakeTagFromEvents(const std::vector& events) { + formats::json::StringBuilder builder; + { + const formats::json::StringBuilder::ArrayGuard array_guard(builder); + + for (const auto& event : events) { + const formats::json::StringBuilder::ObjectGuard guard(builder); + + builder.Key("name"); + builder.WriteString(event.name); + builder.Key("time_unix_nano"); + builder.WriteUInt64(event.time_unix_nano); + + HandleEventAttributes(event, builder); + } + } + + return builder.GetString(); +} + } // namespace Span::Impl::Impl( @@ -149,6 +199,11 @@ void Span::Impl::PutIntoLogger(logging::impl::TagWriter writer) && { } writer.PutLogExtra(log_extra_inheritable_); + if (!events_.empty()) { + const auto events_tag = MakeTagFromEvents(events_); + writer.PutTag("events", events_tag); + } + LogOpenTracing(); } diff --git a/core/src/tracing/span_opentracing.cpp b/core/src/tracing/span_opentracing.cpp index ea3d457dae23..5c6af3759473 100644 --- a/core/src/tracing/span_opentracing.cpp +++ b/core/src/tracing/span_opentracing.cpp @@ -48,25 +48,6 @@ struct LogExtraValueVisitor { void operator()(int val) { string_value = std::to_string(val); } }; -struct EventAttributeWriteVisitor { - explicit EventAttributeWriteVisitor(formats::json::StringBuilder& builder) : builder{builder} {} - - template - void operator()(const T& value) { - if constexpr (std::is_same_v) { - builder.WriteString(value); - } else if constexpr (std::is_integral_v && std::is_unsigned_v) { - builder.WriteUInt64(value); - } else if constexpr (std::is_integral_v) { - builder.WriteInt64(value); - } else if constexpr (std::is_floating_point_v) { - builder.WriteDouble(value); - } - } - - formats::json::StringBuilder& builder; -}; - void GetTagObject( formats::json::StringBuilder& builder, std::string_view key, @@ -87,37 +68,6 @@ void GetTagObject( builder.WriteString(key); } -void HandleEventAttributes(const Span::Event& events, formats::json::StringBuilder& builder) { - builder.Key("attributes"); - const formats::json::StringBuilder::ObjectGuard attributes_guard(builder); - - for (const auto& [key, value] : events.attributes) { - builder.Key(key); - EventAttributeWriteVisitor write_visitor(builder); - std::visit(write_visitor, value); - } -} - -std::string MakeTagFromEvents(const std::vector& events) { - formats::json::StringBuilder builder; - { - const formats::json::StringBuilder::ArrayGuard array_guard(builder); - - for (const auto& event : events) { - const formats::json::StringBuilder::ObjectGuard guard(builder); - - builder.Key("name"); - builder.WriteString(event.name); - builder.Key("time_unix_nano"); - builder.WriteUInt64(event.time_unix_nano); - - HandleEventAttributes(event, builder); - } - } - - return builder.GetString(); -} - constexpr std::string_view kOperationName = "operation_name"; constexpr std::string_view kTraceId = "trace_id"; constexpr std::string_view kParentId = "parent_id"; @@ -129,7 +79,6 @@ constexpr std::string_view kStartTimeMillis = "start_time_millis"; constexpr std::string_view kDuration = "duration"; constexpr std::string_view kTags = "tags"; -constexpr std::string_view kEvents = "events"; } // namespace jaeger @@ -175,11 +124,6 @@ void Span::Impl::DoLogOpenTracing(logging::impl::TagWriter writer) const { } } writer.PutTag(jaeger::kTags, tags.GetStringView()); - - if (!events_.empty()) { - const auto events_tag = jaeger::MakeTagFromEvents(events_); - writer.PutTag(jaeger::kEvents, events_tag); - } } void Span::Impl::AddOpentracingTags(formats::json::StringBuilder& output, const logging::LogExtra& input) { diff --git a/core/src/tracing/span_test.cpp b/core/src/tracing/span_test.cpp index f8e505a4de2f..c71c8805a09d 100644 --- a/core/src/tracing/span_test.cpp +++ b/core/src/tracing/span_test.cpp @@ -699,21 +699,21 @@ UTEST_F(Span, MakeSpanWithParentIdTraceIdLinkWithExisting) { } } -UTEST_F(OpentracingSpan, MakeSpanEvent) { +UTEST_F(Span, MakeSpanEvent) { { tracing::Span root_span("root_span"); root_span.AddEvent("important_event"); } - FlushOpentracing(); + logging::LogFlush(); - const auto logs_raw = GetOtStreamString(); + const auto logs_raw = GetStreamString(); EXPECT_THAT(logs_raw, HasSubstr("events=[{\"name\":\"important_event\"")); EXPECT_THAT(logs_raw, HasSubstr("root_span")); } -UTEST_F(OpentracingSpan, MakeSpanEventWithAttributes) { +UTEST_F(Span, MakeSpanEventWithAttributes) { { tracing::Span root_span("root_span"); root_span.AddEvent({"important_event_0", {{"int", 42}}}); @@ -728,9 +728,9 @@ UTEST_F(OpentracingSpan, MakeSpanEventWithAttributes) { ); } - FlushOpentracing(); + logging::LogFlush(); - const auto logs_raw = GetOtStreamString(); + const auto logs_raw = GetStreamString(); EXPECT_THAT(logs_raw, HasSubstr("events=[{\"name\":\"important_event_0\",\"time_unix_nano\"")); EXPECT_THAT(logs_raw, HasSubstr("{\"name\":\"important_event_1\",\"time_unix_nano\""));