Skip to content

Commit 666c1ee

Browse files
authored
Merge branch 'main' into codeboten/otelconf-v1.0.0-rc1
2 parents e5659f0 + ea3c024 commit 666c1ee

File tree

8 files changed

+412
-78
lines changed

8 files changed

+412
-78
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1616
- Add unmarshaling and validation for `CardinalityLimits` and `SpanLimits` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8043)
1717
- Add unmarshaling and validation for `BatchLogRecordProcessor`, `BatchSpanProcessor`, and `PeriodicMetricReader` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8049)
1818
- Add unmarshaling and validation for `TextMapPropagator` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8052)
19+
- Add `jaeger.sampler.type`/`jaeger.sampler.param` attributes for adaptive sampling support and option `WithAttributesDisabled` in `go.opentelemetry.io/contrib/samplers/jaegerremote`. (#8073)
1920
- Add unmarshaling and validation for `OTLPHttpExporter`, `OTLPGrpcExporter`, `OTLPGrpcMetricExporter` and `OTLPHttpMetricExporter` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8112)
2021
- Add a `WithSpanNameFormatter` option to `go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/v2/mongo/otelmongo`. (#7986)
2122
- Add unmarshaling and validation for `AttributeType`, `AttributeNameValue`, `SimpleSpanProcessor`, `SimpleLogRecordProcessor`, `ZipkinSpanExporter`, `NameStringValuePair`, `InstrumentType`, `ExperimentalPeerInstrumentationServiceMappingElem`, `ExporterDefaultHistogramAggregation`, `PullMetricReader` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8127)

samplers/jaegerremote/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/gogo/protobuf v1.3.2
88
github.com/jaegertracing/jaeger-idl v0.6.0
99
github.com/stretchr/testify v1.11.1
10+
go.opentelemetry.io/otel v1.38.0
1011
go.opentelemetry.io/otel/sdk v1.38.0
1112
go.opentelemetry.io/otel/trace v1.38.0
1213
)
@@ -18,7 +19,6 @@ require (
1819
github.com/google/uuid v1.6.0 // indirect
1920
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
2021
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
21-
go.opentelemetry.io/otel v1.38.0 // indirect
2222
go.opentelemetry.io/otel/metric v1.38.0 // indirect
2323
golang.org/x/net v0.46.0 // indirect
2424
golang.org/x/sys v0.38.0 // indirect

samplers/jaegerremote/sampler.go

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"sync"
2525

2626
jaeger_api_v2 "github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
27+
"go.opentelemetry.io/otel/attribute"
2728
"go.opentelemetry.io/otel/sdk/trace"
2829
oteltrace "go.opentelemetry.io/otel/trace"
2930

@@ -34,25 +35,40 @@ const (
3435
defaultMaxOperations = 2000
3536
)
3637

38+
const (
39+
samplerTypeKey = "jaeger.sampler.type"
40+
samplerParamKey = "jaeger.sampler.param"
41+
samplerTypeValueProbabilistic = "probabilistic"
42+
samplerTypeValueRateLimiting = "ratelimiting"
43+
)
44+
3745
// -----------------------
3846

3947
// probabilisticSampler is a sampler that randomly samples a certain percentage
4048
// of traces.
4149
type probabilisticSampler struct {
42-
samplingRate float64
43-
sampler trace.Sampler
50+
samplingRate float64
51+
sampler trace.Sampler
52+
attributes []attribute.KeyValue
53+
attributesDisabled bool
4454
}
4555

4656
// newProbabilisticSampler creates a sampler that randomly samples a certain percentage of traces specified by the
4757
// samplingRate, in the range between 0.0 and 1.0. it utilizes the SDK `trace.TraceIDRatioBased` sampler.
48-
func newProbabilisticSampler(samplingRate float64) *probabilisticSampler {
49-
s := new(probabilisticSampler)
58+
func newProbabilisticSampler(samplingRate float64, attributesDisabled bool) *probabilisticSampler {
59+
s := &probabilisticSampler{
60+
attributesDisabled: attributesDisabled,
61+
}
5062
return s.init(samplingRate)
5163
}
5264

5365
func (s *probabilisticSampler) init(samplingRate float64) *probabilisticSampler {
5466
s.samplingRate = math.Max(0.0, math.Min(samplingRate, 1.0))
5567
s.sampler = trace.TraceIDRatioBased(s.samplingRate)
68+
if s.attributesDisabled {
69+
return s
70+
}
71+
s.attributes = []attribute.KeyValue{attribute.String(samplerTypeKey, samplerTypeValueProbabilistic), attribute.Float64(samplerParamKey, s.samplingRate)}
5672
return s
5773
}
5874

@@ -62,7 +78,12 @@ func (s *probabilisticSampler) SamplingRate() float64 {
6278
}
6379

6480
func (s *probabilisticSampler) ShouldSample(p trace.SamplingParameters) trace.SamplingResult {
65-
return s.sampler.ShouldSample(p)
81+
r := s.sampler.ShouldSample(p)
82+
if r.Decision == trace.Drop {
83+
return r
84+
}
85+
r.Attributes = s.attributes
86+
return r
6687
}
6788

6889
// Equal compares with another sampler.
@@ -95,11 +116,16 @@ func (s *probabilisticSampler) Description() string {
95116
type rateLimitingSampler struct {
96117
maxTracesPerSecond float64
97118
rateLimiter *ratelimiter.RateLimiter
119+
attributes []attribute.KeyValue
120+
attributesDisabled bool
98121
}
99122

100123
// newRateLimitingSampler creates new rateLimitingSampler.
101-
func newRateLimitingSampler(maxTracesPerSecond float64) *rateLimitingSampler {
102-
s := new(rateLimitingSampler)
124+
func newRateLimitingSampler(maxTracesPerSecond float64, attributesDisabled bool) *rateLimitingSampler {
125+
s := &rateLimitingSampler{
126+
attributesDisabled: attributesDisabled,
127+
}
128+
103129
return s.init(maxTracesPerSecond)
104130
}
105131

@@ -110,6 +136,10 @@ func (s *rateLimitingSampler) init(maxTracesPerSecond float64) *rateLimitingSamp
110136
s.rateLimiter.Update(maxTracesPerSecond, math.Max(maxTracesPerSecond, 1.0))
111137
}
112138
s.maxTracesPerSecond = maxTracesPerSecond
139+
if s.attributesDisabled {
140+
return s
141+
}
142+
s.attributes = []attribute.KeyValue{attribute.String(samplerTypeKey, samplerTypeValueRateLimiting), attribute.Float64(samplerParamKey, s.maxTracesPerSecond)}
113143
return s
114144
}
115145

@@ -119,6 +149,7 @@ func (s *rateLimitingSampler) ShouldSample(p trace.SamplingParameters) trace.Sam
119149
return trace.SamplingResult{
120150
Decision: trace.RecordAndSample,
121151
Tracestate: psc.TraceState(),
152+
Attributes: s.attributes,
122153
}
123154
}
124155
return trace.SamplingResult{
@@ -161,20 +192,22 @@ type guaranteedThroughputProbabilisticSampler struct {
161192
lowerBoundSampler *rateLimitingSampler
162193
samplingRate float64
163194
lowerBound float64
195+
attributesDisabled bool
164196
}
165197

166-
func newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate float64) *guaranteedThroughputProbabilisticSampler {
198+
func newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate float64, attributesDisabled bool) *guaranteedThroughputProbabilisticSampler {
167199
s := &guaranteedThroughputProbabilisticSampler{
168-
lowerBoundSampler: newRateLimitingSampler(lowerBound),
169-
lowerBound: lowerBound,
200+
lowerBoundSampler: newRateLimitingSampler(lowerBound, attributesDisabled),
201+
lowerBound: lowerBound,
202+
attributesDisabled: attributesDisabled,
170203
}
171204
s.setProbabilisticSampler(samplingRate)
172205
return s
173206
}
174207

175208
func (s *guaranteedThroughputProbabilisticSampler) setProbabilisticSampler(samplingRate float64) {
176209
if s.probabilisticSampler == nil {
177-
s.probabilisticSampler = newProbabilisticSampler(samplingRate)
210+
s.probabilisticSampler = newProbabilisticSampler(samplingRate, s.attributesDisabled)
178211
} else if s.samplingRate != samplingRate {
179212
s.probabilisticSampler.init(samplingRate)
180213
}
@@ -218,6 +251,7 @@ type perOperationSampler struct {
218251

219252
// see description in perOperationSamplerParams
220253
operationNameLateBinding bool
254+
attributesDisabled bool
221255
}
222256

223257
// perOperationSamplerParams defines parameters when creating perOperationSampler.
@@ -238,7 +272,7 @@ type perOperationSamplerParams struct {
238272
}
239273

240274
// newPerOperationSampler returns a new perOperationSampler.
241-
func newPerOperationSampler(params perOperationSamplerParams) *perOperationSampler {
275+
func newPerOperationSampler(params perOperationSamplerParams, attributesDisabled bool) *perOperationSampler {
242276
if params.MaxOperations <= 0 {
243277
params.MaxOperations = defaultMaxOperations
244278
}
@@ -247,15 +281,17 @@ func newPerOperationSampler(params perOperationSamplerParams) *perOperationSampl
247281
sampler := newGuaranteedThroughputProbabilisticSampler(
248282
params.Strategies.DefaultLowerBoundTracesPerSecond,
249283
strategy.ProbabilisticSampling.SamplingRate,
284+
attributesDisabled,
250285
)
251286
samplers[strategy.Operation] = sampler
252287
}
253288
return &perOperationSampler{
254289
samplers: samplers,
255-
defaultSampler: newProbabilisticSampler(params.Strategies.DefaultSamplingProbability),
290+
defaultSampler: newProbabilisticSampler(params.Strategies.DefaultSamplingProbability, attributesDisabled),
256291
lowerBound: params.Strategies.DefaultLowerBoundTracesPerSecond,
257292
maxOperations: params.MaxOperations,
258293
operationNameLateBinding: params.OperationNameLateBinding,
294+
attributesDisabled: attributesDisabled,
259295
}
260296
}
261297

@@ -284,7 +320,7 @@ func (s *perOperationSampler) getSamplerForOperation(operation string) trace.Sam
284320
if len(s.samplers) >= s.maxOperations {
285321
return s.defaultSampler
286322
}
287-
newSampler := newGuaranteedThroughputProbabilisticSampler(s.lowerBound, s.defaultSampler.SamplingRate())
323+
newSampler := newGuaranteedThroughputProbabilisticSampler(s.lowerBound, s.defaultSampler.SamplingRate(), s.attributesDisabled)
288324
s.samplers[operation] = newSampler
289325
return newSampler
290326
}
@@ -308,13 +344,14 @@ func (s *perOperationSampler) update(strategies *jaeger_api_v2.PerOperationSampl
308344
sampler := newGuaranteedThroughputProbabilisticSampler(
309345
lowerBound,
310346
samplingRate,
347+
s.attributesDisabled,
311348
)
312349
newSamplers[operation] = sampler
313350
}
314351
}
315352
s.lowerBound = strategies.DefaultLowerBoundTracesPerSecond
316353
if s.defaultSampler.SamplingRate() != strategies.DefaultSamplingProbability {
317-
s.defaultSampler = newProbabilisticSampler(strategies.DefaultSamplingProbability)
354+
s.defaultSampler = newProbabilisticSampler(strategies.DefaultSamplingProbability, s.attributesDisabled)
318355
}
319356
s.samplers = newSamplers
320357
}

samplers/jaegerremote/sampler_remote.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,12 @@ func (s *Sampler) updateSamplerViaUpdaters(strategy any) error {
189189
// -----------------------
190190

191191
// probabilisticSamplerUpdater is used by Sampler to parse sampling configuration.
192-
type probabilisticSamplerUpdater struct{}
192+
type probabilisticSamplerUpdater struct {
193+
attributesDisabled bool
194+
}
193195

194196
// Update implements Update of samplerUpdater.
195-
func (*probabilisticSamplerUpdater) Update(sampler trace.Sampler, strategy any) (trace.Sampler, error) {
197+
func (u *probabilisticSamplerUpdater) Update(sampler trace.Sampler, strategy any) (trace.Sampler, error) {
196198
type response interface {
197199
GetProbabilisticSampling() *jaeger_api_v2.ProbabilisticSamplingStrategy
198200
}
@@ -205,7 +207,7 @@ func (*probabilisticSamplerUpdater) Update(sampler trace.Sampler, strategy any)
205207
}
206208
return sampler, nil
207209
}
208-
return newProbabilisticSampler(probabilistic.SamplingRate), nil
210+
return newProbabilisticSampler(probabilistic.SamplingRate, u.attributesDisabled), nil
209211
}
210212
}
211213
return nil, nil
@@ -214,10 +216,12 @@ func (*probabilisticSamplerUpdater) Update(sampler trace.Sampler, strategy any)
214216
// -----------------------
215217

216218
// rateLimitingSamplerUpdater is used by Sampler to parse sampling configuration.
217-
type rateLimitingSamplerUpdater struct{}
219+
type rateLimitingSamplerUpdater struct {
220+
attributesDisabled bool
221+
}
218222

219223
// Update implements Update of samplerUpdater.
220-
func (*rateLimitingSamplerUpdater) Update(sampler trace.Sampler, strategy any) (trace.Sampler, error) {
224+
func (u *rateLimitingSamplerUpdater) Update(sampler trace.Sampler, strategy any) (trace.Sampler, error) {
221225
type response interface {
222226
GetRateLimitingSampling() *jaeger_api_v2.RateLimitingSamplingStrategy
223227
}
@@ -229,7 +233,7 @@ func (*rateLimitingSamplerUpdater) Update(sampler trace.Sampler, strategy any) (
229233
rl.Update(rateLimit)
230234
return rl, nil
231235
}
232-
return newRateLimitingSampler(rateLimit), nil
236+
return newRateLimitingSampler(rateLimit, u.attributesDisabled), nil
233237
}
234238
}
235239
return nil, nil
@@ -242,6 +246,7 @@ func (*rateLimitingSamplerUpdater) Update(sampler trace.Sampler, strategy any) (
242246
type perOperationSamplerUpdater struct {
243247
MaxOperations int
244248
OperationNameLateBinding bool
249+
attributesDisabled bool
245250
}
246251

247252
// Update implements Update of samplerUpdater.
@@ -260,7 +265,7 @@ func (u *perOperationSamplerUpdater) Update(sampler trace.Sampler, strategy any)
260265
MaxOperations: u.MaxOperations,
261266
OperationNameLateBinding: u.OperationNameLateBinding,
262267
Strategies: operations,
263-
}), nil
268+
}, u.attributesDisabled), nil
264269
}
265270
}
266271
return nil, nil

0 commit comments

Comments
 (0)