Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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 flagd/pkg/service/flag-evaluation/ofrep/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ func (h *handler) HandleFlagEvaluation(w http.ResponseWriter, r *http.Request) {
ctx := context.WithValue(r.Context(), store.SelectorContextKey{}, selector)

evaluation := h.evaluator.ResolveAsAnyValue(ctx, requestID, flagKey, evaluationContext)
trace.SpanFromContext(ctx).SetAttributes(telemetry.SemConvFeatureFlagAttributes(flagKey, evaluation.Variant)...)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
if h.metricsRecorder != nil {
h.metricsRecorder.RecordEvaluation(
ctx, evaluation.Error, evaluation.Reason, evaluation.Variant, evaluation.FlagKey,
Expand Down
31 changes: 31 additions & 0 deletions flagd/pkg/service/flag-evaluation/ofrep/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ import (
compressmw "github.com/open-feature/flagd/flagd/pkg/service/middleware/compress"
"github.com/open-feature/flagd/flagd/pkg/service/middleware/metrics/metricstest"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/sdk/trace/tracetest"
semconv "go.opentelemetry.io/otel/semconv/v1.34.0"
"go.uber.org/mock/gomock"
)
Expand Down Expand Up @@ -620,3 +623,31 @@ func TestOfrepHTTPMetrics(t *testing.T) {
})
}
}

func TestHandlerSetsFeatureFlagSpanAttributes(t *testing.T) {
recorder := tracetest.NewSpanRecorder()
provider := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(recorder))
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
previous := otel.GetTracerProvider()
otel.SetTracerProvider(provider)
t.Cleanup(func() { otel.SetTracerProvider(previous) })

eval := mock.NewMockIEvaluator(gomock.NewController(t))
eval.EXPECT().
ResolveAsAnyValue(gomock.Any(), gomock.Any(), flagKey, gomock.Any()).
Return(successValue)
handler := NewOfrepHandler(logger.NewLogger(nil, false), eval, nil, nil, nil, "flagd", SSEConfig{}, newCompression(t))

request := httptest.NewRequest(http.MethodPost, "/ofrep/v1/evaluate/flags/"+flagKey, nil)
handler.ServeHTTP(httptest.NewRecorder(), request)

spans := recorder.Ended()
require.NotEmpty(t, spans)
attributes := map[string]string{}
for _, span := range spans {
for _, attribute := range span.Attributes() {
attributes[string(attribute.Key)] = attribute.Value.Emit()
}
}
require.Equal(t, flagKey, attributes["feature_flag.key"])
require.Equal(t, successValue.Variant, attributes["feature_flag.result.variant"])
}
Loading