1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-01-30 04:40:41 +02:00

Add Tracestate into the SamplingResult struct (#1432)

* Add Tracestate into the SamplingResult struct

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.

* Updated CHANGELOG.md for #1432 PR

Added changes description for #1432.

* Update sdk/trace/sampling_test.go

Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
This commit is contained in:
Andrei Ozerov 2021-01-06 22:09:48 +03:00 committed by GitHub
parent db06c8d1cb
commit 40f1c0039d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 5 deletions

View File

@ -26,6 +26,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- Many OTLP Exporter options became gRPC ProtocolDriver options. (#1369)
- Unify endpoint API that related to OTel exporter. (#1401)
- Metric aggregator Count() and histogram Bucket.Counts are consistently `uint64`. (1430)
- `SamplingResult` now passed a `Tracestate` from the parent `SpanContext` (#1432)
### Removed

View File

@ -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 {
@ -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 {
@ -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 {
@ -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 {

View File

@ -22,6 +22,7 @@ import (
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel/label"
"go.opentelemetry.io/otel/trace"
)
@ -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")
})
}
}