From c50d3e6ceaca89bdec3ca30fa8fb2a88828930a7 Mon Sep 17 00:00:00 2001 From: jonny rhea Date: Sun, 4 Jan 2026 19:18:12 -0600 Subject: [PATCH] fix issue where span status wasn't properly passed to parents --- rpc/handler.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rpc/handler.go b/rpc/handler.go index 5522a2502a..2b03888614 100644 --- a/rpc/handler.go +++ b/rpc/handler.go @@ -32,6 +32,7 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" + sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.24.0" "go.opentelemetry.io/otel/trace" ) @@ -614,11 +615,18 @@ func (h *handler) startSpan(ctx context.Context, msg *jsonrpcMessage, spanName s // Define the function to end the span and handle error recording spanEnd := func(err *error) { + ro, _ := span.(sdktrace.ReadOnlySpan) if *err != nil { + // Error occurred, record it and set status on span and parent span.RecordError(*err) span.SetStatus(codes.Error, (*err).Error()) parentSpan.SetStatus(codes.Error, (*err).Error()) - } else { + } else if ro.Status().Code == codes.Error { + // Span's child had an error, propagate it to parent + // Note: Span's status was already set in the child + parentSpan.SetStatus(codes.Error, ro.Status().Description) + } else if ro.Status().Code == codes.Unset { + // No error and no status set, mark as success span.SetStatus(codes.Ok, "") } span.End()