Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
* [ENHANCEMENT] Distributor: Deduplicate metric metadata when converting PRW 2.0 requests. PRW 2.0 attaches metadata to every series, so a metric family was previously expanded into one `MetricMetadata` per series. #7760
* [ENHANCEMENT] Querier: Use non-pointer HistogramBucket slice in response codec. #7809
* [ENHANCEMENT] Update build image and Go version to 1.27.0. #7814
* [BUGFIX] SpanLogger: Set span error tag when `SpanLogger.Log()` is called with `level=error`, so errors logged through SpanLogger are visible as errors in tracing UIs. #3016
* [BUGFIX] Querier: Fix queryWithRetry and labelsWithRetry returning (nil, nil) on cancelled context by propagating ctx.Err(). #7370
* [BUGFIX] Metrics Helper: Fix non-deterministic bucket order in merged histograms by sorting buckets after map iteration, matching Prometheus client library behavior. #7380
* [BUGFIX] Distributor: Return HTTP 401 Unauthorized when tenant ID resolution fails in the Prometheus Remote Write 2.0 path. #7389
Expand Down
9 changes: 9 additions & 0 deletions pkg/util/spanlogger/spanlogger.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,15 @@ func (s *SpanLogger) Log(kvps ...any) error {
return err
}
s.LogFields(fields...)
// Mirror level=error onto the span's error tag so tracing UIs surface it.
for i := 0; i+1 < len(kvps); i += 2 {
if k, ok := kvps[i].(string); ok && k == "level" {
if v, ok := kvps[i+1].(string); ok && v == "error" {
ext.Error.Set(s.Span, true)
}
break
}
}
return nil
}

Expand Down
16 changes: 16 additions & 0 deletions pkg/util/spanlogger/spanlogger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,22 @@ func TestSpanCreatedWithoutTenantTag(t *testing.T) {
require.False(t, exist)
}

func TestSpanLogger_Log_SetsErrorTagOnErrorLevel(t *testing.T) {
mockTracer := mocktracer.New()
opentracing.SetGlobalTracer(mockTracer)

logger, _ := New(context.Background(), "test")
mockSpan := logger.Span.(*mocktracer.MockSpan)

// Non-error level should NOT set the error tag.
_ = logger.Log("level", "info", "msg", "hello")
require.Nil(t, mockSpan.Tag("error"))

// level=error SHOULD set the span error tag.
_ = logger.Log("level", "error", "msg", "something failed")
require.Equal(t, true, mockSpan.Tag("error"))
}

func createSpan(ctx context.Context) *mocktracer.MockSpan {
mockTracer := mocktracer.New()
opentracing.SetGlobalTracer(mockTracer)
Expand Down