Skip to content

Commit

Permalink
Only consider exception span events for ETS
Browse files Browse the repository at this point in the history
  • Loading branch information
Guillaume-Barrier committed Oct 18, 2024
1 parent e908828 commit a097126
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 48 deletions.
33 changes: 19 additions & 14 deletions pkg/trace/agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ func (a *Agent) errorSampling(now time.Time, ts *info.TagStats, pt *traceutil.Pr
numEvents = len(a.getAnalyzedEvents(pt, ts))
if sampled {
for _, span := range pt.TraceChunk.Spans {
if spanIsError(span) {
if span.Error != 0 || spanContainsExceptionSpanEvent(span) {
span.Meta["_dd.error_tracking_backend_standalone.error"] = "true"
} else {
span.Meta["_dd.error_tracking_backend_standalone.error"] = "false"
Expand All @@ -630,14 +630,30 @@ func (a *Agent) errorSampling(now time.Time, ts *info.TagStats, pt *traceutil.Pr
return sampled, numEvents
}

func spanContainsExceptionSpanEvent(span *pb.Span) bool {
if hasExceptionSpanEvents, ok := span.Meta["_dd.span_events.has_exception"]; ok && hasExceptionSpanEvents == "true" {
return true
}
return false
}

// runErrorSampler runs the agent's configured ErrorSampler if pt contains errors and returns the sampling decision.
func (a *Agent) runErrorSampler(now time.Time, pt traceutil.ProcessedTrace) (keep bool) {
if traceContainsError(pt.TraceChunk.Spans) {
if traceContainsErrorOrExceptionSpanEvent(pt.TraceChunk.Spans) {
return a.ErrorsSampler.Sample(now, pt.TraceChunk.Spans, pt.Root, pt.TracerEnv)
}
return false
}

func traceContainsErrorOrExceptionSpanEvent(trace pb.Trace) bool {
for _, span := range trace {
if span.Error != 0 || spanContainsExceptionSpanEvent(span) {
return true
}
}
return false
}

// traceSampling reports whether the chunk should be kept as a trace, setting "DroppedTrace" on the chunk
func (a *Agent) traceSampling(now time.Time, ts *info.TagStats, pt *traceutil.ProcessedTrace) (keep bool, checkAnalyticsEvents bool) {
sampled, check := a.runSamplers(now, ts, *pt)
Expand Down Expand Up @@ -719,24 +735,13 @@ func (a *Agent) runSamplers(now time.Time, ts *info.TagStats, pt traceutil.Proce

func traceContainsError(trace pb.Trace) bool {
for _, span := range trace {
if spanIsError(span) {
if span.Error != 0 {
return true
}
}
return false
}

func spanIsError(span *pb.Span) bool {
return span.Error != 0 || spanContainsExceptionSpanEvent(span)
}

func spanContainsExceptionSpanEvent(span *pb.Span) bool {
if hasExceptionSpanEvents, ok := span.Meta["_dd.span_events.has_exception"]; ok && hasExceptionSpanEvents == "true" {
return true
}
return false
}

func filteredByTags(root *pb.Span, require, reject []*config.Tag, requireRegex, rejectRegex []*config.TagRegex) bool {
for _, tag := range reject {
if v, ok := root.Meta[tag.K]; ok && (tag.V == "" || v == tag.V) {
Expand Down
29 changes: 8 additions & 21 deletions pkg/trace/agent/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1276,7 +1276,7 @@ func TestSampling(t *testing.T) {
func TestSampleTrace(t *testing.T) {
now := time.Now()
cfg := &config.AgentConfig{TargetTPS: 5, ErrorTPS: 1000, Features: make(map[string]struct{})}
genSpan := func(decisionMaker string, priority sampler.SamplingPriority, err int32, exceptionInSpanEvent bool) traceutil.ProcessedTrace {
genSpan := func(decisionMaker string, priority sampler.SamplingPriority, err int32) traceutil.ProcessedTrace {
root := &pb.Span{
Service: "serv1",
Start: now.UnixNano(),
Expand All @@ -1285,9 +1285,6 @@ func TestSampleTrace(t *testing.T) {
Error: err, // If 1, the Error Sampler will keep the trace, if 0, it will not be sampled
Meta: map[string]string{},
}
if exceptionInSpanEvent {
root.Meta["_dd.span_events.has_exception"] = "true" // the Error Sampler will keep the trace
}
chunk := testutil.TraceChunkWithSpan(root)
if decisionMaker != "" {
chunk.Tags["_dd.p.dm"] = decisionMaker
Expand All @@ -1303,42 +1300,37 @@ func TestSampleTrace(t *testing.T) {
keepWithFeature bool
}{
"userdrop-error-no-dm-sampled": {
trace: genSpan("", sampler.PriorityUserDrop, 1, false),
trace: genSpan("", sampler.PriorityUserDrop, 1),
keep: false,
keepWithFeature: true,
},
"userdrop-error-manual-dm-unsampled": {
trace: genSpan("-4", sampler.PriorityUserDrop, 1, false),
trace: genSpan("-4", sampler.PriorityUserDrop, 1),
keep: false,
keepWithFeature: false,
},
"userdrop-error-agent-dm-sampled": {
trace: genSpan("-1", sampler.PriorityUserDrop, 1, false),
trace: genSpan("-1", sampler.PriorityUserDrop, 1),
keep: false,
keepWithFeature: true,
},
"userkeep-error-no-dm-sampled": {
trace: genSpan("", sampler.PriorityUserKeep, 1, false),
trace: genSpan("", sampler.PriorityUserKeep, 1),
keep: true,
keepWithFeature: true,
},
"userkeep-error-agent-dm-sampled": {
trace: genSpan("-1", sampler.PriorityUserKeep, 1, false),
trace: genSpan("-1", sampler.PriorityUserKeep, 1),
keep: true,
keepWithFeature: true,
},
"autodrop-error-sampled": {
trace: genSpan("", sampler.PriorityAutoDrop, 1, false),
keep: true,
keepWithFeature: true,
},
"autodrop-errorspanevent-sampled": {
trace: genSpan("", sampler.PriorityAutoDrop, 0, true),
trace: genSpan("", sampler.PriorityAutoDrop, 1),
keep: true,
keepWithFeature: true,
},
"autodrop-not-sampled": {
trace: genSpan("", sampler.PriorityAutoDrop, 0, false),
trace: genSpan("", sampler.PriorityAutoDrop, 0),
keep: false,
keepWithFeature: false,
},
Expand Down Expand Up @@ -1415,11 +1407,6 @@ func TestSample(t *testing.T) {
keep: true,
keepWithFeature: true,
},
"autodrop-errorspanevent-sampled": {
trace: genSpan("", sampler.PriorityAutoDrop, 0, true),
keep: true,
keepWithFeature: true,
},
"autodrop-not-sampled": {
trace: genSpan("", sampler.PriorityAutoDrop, 0, false),
keep: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@
features:
- |
Introducing the Error Tracking Standalone config option. Only span chunks
that contain errors are taken into consideration by sampling.
that contain errors or exception OpenTelemetry span events are taken into
consideration by sampling.

This file was deleted.

0 comments on commit a097126

Please sign in to comment.