Skip to content

Commit

Permalink
Add Tracestate into the SamplingResult struct
Browse files Browse the repository at this point in the history
Add `trace.Tracestate` field into the SDK `trace.SamplingResult` struct.

Use ParentContext from SamplingParameters to return Tracestate in
`traceIDRatioSampler`, `alwaysOnSampler` and `alwaysOffSampler`.

Add a new test to check that Tracestate is passed.
  • Loading branch information
ozerovandrei committed Jan 6, 2021
1 parent fe9d1f7 commit ee4f28c
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 5 deletions.
23 changes: 18 additions & 5 deletions sdk/trace/sampling.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,11 @@ const (
RecordAndSample
)

// SamplingResult conveys a SamplingDecision and a set of Attributes.
// SamplingResult conveys a SamplingDecision, set of Attributes and a Tracestate.
type SamplingResult struct {
Decision SamplingDecision
Attributes []label.KeyValue
Tracestate trace.TraceState
}

type traceIDRatioSampler struct {
Expand All @@ -70,9 +71,15 @@ type traceIDRatioSampler struct {
func (ts traceIDRatioSampler) ShouldSample(p SamplingParameters) SamplingResult {
x := binary.BigEndian.Uint64(p.TraceID[0:8]) >> 1
if x < ts.traceIDUpperBound {
return SamplingResult{Decision: RecordAndSample}
return SamplingResult{
Decision: RecordAndSample,
Tracestate: p.ParentContext.TraceState,
}
}
return SamplingResult{
Decision: Drop,
Tracestate: p.ParentContext.TraceState,
}
return SamplingResult{Decision: Drop}
}

func (ts traceIDRatioSampler) Description() string {
Expand Down Expand Up @@ -102,7 +109,10 @@ func TraceIDRatioBased(fraction float64) Sampler {
type alwaysOnSampler struct{}

func (as alwaysOnSampler) ShouldSample(p SamplingParameters) SamplingResult {
return SamplingResult{Decision: RecordAndSample}
return SamplingResult{
Decision: RecordAndSample,
Tracestate: p.ParentContext.TraceState,
}
}

func (as alwaysOnSampler) Description() string {
Expand All @@ -120,7 +130,10 @@ func AlwaysSample() Sampler {
type alwaysOffSampler struct{}

func (as alwaysOffSampler) ShouldSample(p SamplingParameters) SamplingResult {
return SamplingResult{Decision: Drop}
return SamplingResult{
Decision: Drop,
Tracestate: p.ParentContext.TraceState,
}
}

func (as alwaysOffSampler) Description() string {
Expand Down
45 changes: 45 additions & 0 deletions sdk/trace/sampling_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (

"github.com/stretchr/testify/require"

"go.opentelemetry.io/otel/label"
"go.opentelemetry.io/otel/trace"
)

Expand Down Expand Up @@ -189,3 +190,47 @@ func TestTraceIdRatioSamplesInclusively(t *testing.T) {
}
}
}

func TestTracestateIsPassed(t *testing.T) {
testCases := []struct {
name string
sampler Sampler
}{
{
"notSampled",
NeverSample(),
},
{
"sampled",
AlwaysSample(),
},
{
"parentSampled",
ParentBased(AlwaysSample()),
},
{
"parentNotSampled",
ParentBased(NeverSample()),
},
{
"traceIDRatioSampler",
TraceIDRatioBased(.5),
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
traceState, err := trace.TraceStateFromKeyValues(label.String("k", "v"))
if err != nil {
t.Error(err)
}

parentCtx := trace.SpanContext{
TraceState: traceState,
}
params := SamplingParameters{ParentContext: parentCtx}

require.Equal(t, traceState, tc.sampler.ShouldSample(params).Tracestate, "traceState is not equal")
})
}
}

0 comments on commit ee4f28c

Please sign in to comment.