Skip to content

Commit 6b44e01

Browse files
committed
feat: add traces to ofrep endpoint
Signed-off-by: Simon Schrottner <[email protected]>
1 parent 779e8f9 commit 6b44e01

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

flagd/pkg/service/flag-evaluation/ofrep/handler.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ package ofrep
33
import (
44
"encoding/json"
55
"fmt"
6+
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
7+
"go.opentelemetry.io/otel"
8+
"go.opentelemetry.io/otel/attribute"
9+
"go.opentelemetry.io/otel/trace"
610
"net/http"
711

812
"github.com/gorilla/mux"
@@ -23,25 +27,29 @@ type handler struct {
2327
Logger *logger.Logger
2428
evaluator evaluator.IEvaluator
2529
contextValues map[string]any
30+
tracer trace.Tracer
2631
}
2732

2833
func NewOfrepHandler(logger *logger.Logger, evaluator evaluator.IEvaluator, contextValues map[string]any) http.Handler {
2934
h := handler{
3035
Logger: logger,
3136
evaluator: evaluator,
3237
contextValues: contextValues,
38+
tracer: otel.Tracer("flagd.ofrep.v1"),
3339
}
3440

3541
router := mux.NewRouter()
3642
router.HandleFunc(singleEvaluation, h.HandleFlagEvaluation).Methods("POST")
3743
router.HandleFunc(bulkEvaluation, h.HandleBulkEvaluation).Methods("POST")
38-
return router
44+
return otelhttp.NewHandler(router, "flagd.ofrep")
3945
}
4046

4147
func (h *handler) HandleFlagEvaluation(w http.ResponseWriter, r *http.Request) {
4248
requestID := xid.New().String()
4349
defer h.Logger.ClearFields(requestID)
4450

51+
rCtx, span := h.tracer.Start(r.Context(), "flagEvaluation", trace.WithSpanKind(trace.SpanKindServer))
52+
defer span.End()
4553
// obtain flag key
4654
vars := mux.Vars(r)
4755
if vars == nil {
@@ -57,9 +65,10 @@ func (h *handler) HandleFlagEvaluation(w http.ResponseWriter, r *http.Request) {
5765
h.writeJSONToResponse(http.StatusBadRequest, ofrep.ContextErrorResponseFrom(flagKey), w)
5866
return
5967
}
60-
6168
context := flagdContext(h.Logger, requestID, request, h.contextValues)
62-
evaluation := h.evaluator.ResolveAsAnyValue(r.Context(), requestID, flagKey, context)
69+
evaluation := h.evaluator.ResolveAsAnyValue(rCtx, requestID, flagKey, context)
70+
span.SetAttributes(attribute.String("feature_flag.key", evaluation.FlagKey))
71+
span.SetAttributes(attribute.String("feature_flag.variant", evaluation.Variant))
6372
if evaluation.Error != nil {
6473
status, evaluationError := ofrep.EvaluationErrorResponseFrom(evaluation)
6574
h.writeJSONToResponse(status, evaluationError, w)
@@ -72,21 +81,24 @@ func (h *handler) HandleBulkEvaluation(w http.ResponseWriter, r *http.Request) {
7281
requestID := xid.New().String()
7382
defer h.Logger.ClearFields(requestID)
7483

84+
rCtx, span := h.tracer.Start(r.Context(), "bulkEvaluation", trace.WithSpanKind(trace.SpanKindServer))
85+
defer span.End()
7586
request, err := extractOfrepRequest(r)
7687
if err != nil {
7788
h.writeJSONToResponse(http.StatusBadRequest, ofrep.BulkEvaluationContextError(), w)
7889
return
7990
}
8091

8192
context := flagdContext(h.Logger, requestID, request, h.contextValues)
82-
evaluations, metadata, err := h.evaluator.ResolveAllValues(r.Context(), requestID, context)
93+
evaluations, metadata, err := h.evaluator.ResolveAllValues(rCtx, requestID, context)
8394
if err != nil {
8495
h.Logger.WarnWithID(requestID, fmt.Sprintf("error from resolver: %v", err))
8596

8697
res := ofrep.BulkEvaluationContextErrorFrom(model.GeneralErrorCode,
8798
fmt.Sprintf("Bulk evaluation failed. Tracking ID: %s", requestID))
8899
h.writeJSONToResponse(http.StatusInternalServerError, res, w)
89100
} else {
101+
span.SetAttributes(attribute.Int("feature_flag.count", len(evaluations)))
90102
h.writeJSONToResponse(http.StatusOK, ofrep.BulkEvaluationResponseFrom(evaluations, metadata), w)
91103
}
92104
}

0 commit comments

Comments
 (0)