Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 8ccb084

Browse files
authoredNov 8, 2024··
Fix sampling rate (#180)
1 parent 820763a commit 8ccb084

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed
 

‎internal/extension/extension.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,17 @@ func (em *ExtensionManager) SendEndInvocationRequest(ctx context.Context, functi
164164
req.Header.Set(string(DdSamplingPriority), samplingPriority)
165165
}
166166
} else {
167-
req.Header.Set(string(DdTraceId), fmt.Sprint(functionExecutionSpan.Context().TraceID()))
168-
req.Header.Set(string(DdSpanId), fmt.Sprint(functionExecutionSpan.Context().SpanID()))
167+
spanContext := functionExecutionSpan.Context()
168+
req.Header.Set(string(DdTraceId), fmt.Sprint(spanContext.TraceID()))
169+
req.Header.Set(string(DdSpanId), fmt.Sprint(spanContext.SpanID()))
170+
171+
// Try to get sampling priority
172+
// Check if the context implements SamplingPriority method
173+
if pc, ok := spanContext.(interface{ SamplingPriority() (int, bool) }); ok && pc != nil {
174+
if priority, ok := pc.SamplingPriority(); ok {
175+
req.Header.Set(string(DdSamplingPriority), fmt.Sprint(priority))
176+
}
177+
}
169178
}
170179

171180
resp, err := em.httpClient.Do(req)

‎internal/extension/extension_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,34 @@ func TestExtensionEndInvocationError(t *testing.T) {
223223
assert.Contains(t, logOutput, "could not send end invocation payload to the extension")
224224
}
225225

226+
type mockSpanContext struct {
227+
ddtrace.SpanContext
228+
}
229+
230+
func (m mockSpanContext) TraceID() uint64 { return 123 }
231+
func (m mockSpanContext) SpanID() uint64 { return 456 }
232+
func (m mockSpanContext) SamplingPriority() (int, bool) { return -1, true }
233+
234+
type mockSpan struct{ ddtrace.Span }
235+
236+
func (m mockSpan) Context() ddtrace.SpanContext { return mockSpanContext{} }
237+
238+
func TestExtensionEndInvocationSamplingPriority(t *testing.T) {
239+
headers := http.Header{}
240+
em := &ExtensionManager{httpClient: capturingClient{hdr: headers}}
241+
span := &mockSpan{}
242+
243+
// When priority in context, use that value
244+
ctx := context.WithValue(context.Background(), DdTraceId, "123")
245+
ctx = context.WithValue(ctx, DdSamplingPriority, "2")
246+
em.SendEndInvocationRequest(ctx, span, ddtrace.FinishConfig{})
247+
assert.Equal(t, "2", headers.Get("X-Datadog-Sampling-Priority"))
248+
249+
// When no context, get priority from span
250+
em.SendEndInvocationRequest(context.Background(), span, ddtrace.FinishConfig{})
251+
assert.Equal(t, "-1", headers.Get("X-Datadog-Sampling-Priority"))
252+
}
253+
226254
type capturingClient struct {
227255
hdr http.Header
228256
}

0 commit comments

Comments
 (0)
Please sign in to comment.