Skip to content

Commit ff372c3

Browse files
authored
fixes issue where placeholder spans were not technically valid and so weren't showing in some backends (#5)
Thanks @davidlee992 for the contribution
1 parent 7fdbf97 commit ff372c3

File tree

4 files changed

+18
-2
lines changed

4 files changed

+18
-2
lines changed

internal/ptraceutil/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/atlassian-labs/atlassian-sampling-processor/internal/ptraceutil
22

3-
go 1.23.5
3+
go 1.23.6
44

55
require (
66
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.115.0

pkg/processor/atlassiansamplingprocessor/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/atlassian-labs/atlassian-sampling-processor/pkg/processor/atlassiansamplingprocessor
22

3-
go 1.23.5
3+
go 1.23.6
44

55
require (
66
github.com/atlassian-labs/atlassian-sampling-processor/internal/ptraceutil v0.7.6

pkg/processor/atlassiansamplingprocessor/processor.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package atlassiansamplingprocessor // import "github.com/atlassian-labs/atlassia
22

33
import (
44
"context"
5+
"crypto/rand"
56
"encoding/hex"
67
"fmt"
78
"sync"
@@ -416,9 +417,11 @@ func (asp *atlassianSamplingProcessor) releaseNotSampledTrace(ctx context.Contex
416417
// Create a placeholder trace with a single span containing the decision policy name
417418
notSampledTrace := ptrace.NewTraces()
418419
rs := notSampledTrace.ResourceSpans().AppendEmpty()
420+
rs.Resource().Attributes().PutStr("service.name", "not-sampled-dummy-service")
419421
ss := rs.ScopeSpans().AppendEmpty()
420422
span := ss.Spans().AppendEmpty()
421423
span.SetTraceID(id)
424+
span.SetSpanID(generateRandomSpanID())
422425
span.SetName("TRACE NOT SAMPLED")
423426
span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(-time.Second)))
424427
span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now()))
@@ -572,3 +575,13 @@ func (asp *atlassianSamplingProcessor) reportTraceDataErr(ctx context.Context, e
572575
asp.log.Error("failed to perform operation on TraceData", fields...)
573576
asp.telemetry.ProcessorAtlassianSamplingInternalErrorDroppedSpans.Add(ctx, spanCount)
574577
}
578+
579+
// To generate a random span ID for the placeholder trace
580+
func generateRandomSpanID() pcommon.SpanID {
581+
var id [8]byte
582+
_, err := rand.Read(id[:])
583+
if err != nil {
584+
panic("failed to generate random span ID: " + err.Error())
585+
}
586+
return id
587+
}

pkg/processor/atlassiansamplingprocessor/processor_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,9 +1005,12 @@ func TestReleaseNotSampledTrace_EmitSingleSpan(t *testing.T) {
10051005
assert.Equal(t, 1, sink.SpanCount())
10061006
consumed := sink.AllTraces()
10071007
assert.Len(t, consumed, 1)
1008+
serviceName, _ := consumed[0].ResourceSpans().At(0).Resource().Attributes().Get("service.name")
10081009
consumedSpan := consumed[0].ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0)
1010+
assert.Equal(t, serviceName.Str(), "not-sampled-dummy-service")
10091011
assert.Equal(t, testTraceID, consumedSpan.TraceID())
10101012
assert.Equal(t, "TRACE NOT SAMPLED", consumedSpan.Name())
1013+
assert.NotEmpty(t, consumedSpan.SpanID())
10111014
pn, found := consumedSpan.Attributes().Get("sampling.policy")
10121015
assert.True(t, found)
10131016
assert.Equal(t, "test-policy", pn.Str())

0 commit comments

Comments
 (0)