Skip to content

Commit dc710cc

Browse files
refactor the logic touching the trace ids for event spans
1 parent e1903ef commit dc710cc

2 files changed

Lines changed: 19 additions & 9 deletions

File tree

server/adkrest/controllers/debug_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func TestSessionSpansHandler(t *testing.T) {
9292
t.Run(tt.name, func(t *testing.T) {
9393
eventID := "test-event"
9494
opName := semconv.GenAIOperationNameExecuteTool.Value.AsString()
95-
testTelemetry := setupTestTelemetry()
95+
testTelemetry := setupTestTelemetry(t)
9696

9797
apiController := controllers.NewDebugAPIController(nil, nil, testTelemetry.dt)
9898
req, err := http.NewRequest(http.MethodGet, "/debug/sessions/"+tt.reqSessionID+"/spans", nil)
@@ -204,7 +204,7 @@ func TestEventSpanHandler(t *testing.T) {
204204
for _, tt := range tc {
205205
t.Run(tt.name, func(t *testing.T) {
206206
sessionID := "test-session"
207-
testTelemetry := setupTestTelemetry()
207+
testTelemetry := setupTestTelemetry(t)
208208

209209
apiController := controllers.NewDebugAPIController(nil, nil, testTelemetry.dt)
210210
req, err := http.NewRequest(http.MethodGet, "/debug/events/"+tt.reqEventID+"/span", nil)
@@ -258,8 +258,11 @@ type testTelemetry struct {
258258
lp *sdklog.LoggerProvider
259259
}
260260

261-
func setupTestTelemetry() *testTelemetry {
262-
dt := services.NewDebugTelemetry(nil)
261+
func setupTestTelemetry(t *testing.T) *testTelemetry {
262+
dt, err := services.NewDebugTelemetryWithConfig(nil)
263+
if err != nil {
264+
t.Fatalf("failed to create debug telemetry: %v", err)
265+
}
263266

264267
tp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(dt.SpanProcessor()))
265268
lp := sdklog.NewLoggerProvider(sdklog.WithProcessor(dt.LogProcessor()))

server/adkrest/internal/services/debugtelemetry.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,22 @@ func (s *spanStore) getSpansByEventID(id string) []DebugSpan {
156156
defer s.mu.RUnlock()
157157
// Create a copy of the slice to avoid race conditions.
158158
records := slices.Clone(s.recordsByEventID[id])
159-
seenTraces := make(map[string]bool)
159+
s.touchTraces(records)
160+
return convertRecords(records)
161+
}
162+
163+
// touchTraces marks traces as recently used. Required because fetching by event ID bypasses the trace LRU cache.
164+
func (s *spanStore) touchTraces(records []*spanRecord) {
165+
// touchedTraces is used to avoid touching the same trace multiple times.
166+
touchedTraces := make(map[string]bool)
160167
for _, r := range records {
161168
traceIDStr := r.Context.TraceID().String()
162-
if traceIDStr != "" && !seenTraces[traceIDStr] {
169+
if traceIDStr != "" && !touchedTraces[traceIDStr] {
170+
touchedTraces[traceIDStr] = true
171+
// Get the trace to update its access time in the LRU cache, ignore the result.
163172
s.recordsByTraceID.Get(traceIDStr)
164-
seenTraces[traceIDStr] = true
165173
}
166174
}
167-
return convertRecords(records)
168175
}
169176

170177
func (s *spanStore) getSpansBySessionID(sessionID string) []DebugSpan {
@@ -304,7 +311,7 @@ func (s *spanStore) evict(traceID string, spans []*spanRecord) {
304311
func (s *spanStore) evictRecordsByEventID(eventID string, span *spanRecord) {
305312
records := s.recordsByEventID[eventID]
306313
records = slices.DeleteFunc(records, func(r *spanRecord) bool {
307-
return r == span
314+
return r.Context.SpanID() == span.Context.SpanID()
308315
})
309316
if len(records) == 0 {
310317
delete(s.recordsByEventID, eventID)

0 commit comments

Comments
 (0)