Skip to content

Commit 5697fab

Browse files
authored
otelconf: add support for tracer provider limits (#8687)
Signed-off-by: alex boten <223565+codeboten@users.noreply.github.com>
1 parent 05eb6d8 commit 5697fab

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1212

1313
- Configuration file can now be set via `OTEL_CONFIG_FILE` in `go.opentelemetry.io/contrib/otelconf`. (#8639)
1414
- Added support for `service` resource detector in `go.opentelemetry.io/contrib/otelconf`. (#8674)
15+
- Added support for `attribute_count_limit` and `attribute_value_length_limit` in tracer provider configuration in `go.opentelemetry.io/contrib/otelconf`. (#8687)
1516
- Added support for `attribute_count_limit` and `attribute_value_length_limit` in logger provider configuration in `go.opentelemetry.io/contrib/otelconf`. (#8686)
1617

1718
### Changed

otelconf/trace.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,33 @@ func tracerProvider(cfg configOptions, res *resource.Resource) (trace.TracerProv
4848
if len(errs) > 0 {
4949
return noop.NewTracerProvider(), noopShutdown, errors.Join(errs...)
5050
}
51+
52+
if cfg.opentelemetryConfig.TracerProvider.Limits != nil {
53+
opts = spanProcessorLimits(opts, *cfg.opentelemetryConfig.TracerProvider.Limits)
54+
}
5155
tp := sdktrace.NewTracerProvider(opts...)
5256
return tp, tp.Shutdown, nil
5357
}
5458

59+
func spanProcessorLimits(opts []sdktrace.TracerProviderOption, limits SpanLimits) []sdktrace.TracerProviderOption {
60+
spanLimits := sdktrace.NewSpanLimits()
61+
hasLimits := false
62+
63+
if limits.AttributeCountLimit != nil {
64+
spanLimits.AttributeCountLimit = *limits.AttributeCountLimit
65+
hasLimits = true
66+
}
67+
if limits.AttributeValueLengthLimit != nil {
68+
spanLimits.AttributeValueLengthLimit = *limits.AttributeValueLengthLimit
69+
hasLimits = true
70+
}
71+
72+
if hasLimits {
73+
opts = append(opts, sdktrace.WithRawSpanLimits(spanLimits))
74+
}
75+
return opts
76+
}
77+
5578
func parentBasedSampler(s *ParentBasedSampler) (sdktrace.Sampler, error) {
5679
var rootSampler sdktrace.Sampler
5780
var opts []sdktrace.ParentBasedSamplerOption

otelconf/trace_test.go

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,29 @@ func TestTracerProvider(t *testing.T) {
109109
wantProvider: noop.NewTracerProvider(),
110110
wantErr: errInvalidSamplerConfiguration,
111111
},
112+
{
113+
name: "with-limits",
114+
cfg: configOptions{
115+
opentelemetryConfig: OpenTelemetryConfiguration{
116+
TracerProvider: &TracerProvider{
117+
Limits: &SpanLimits{
118+
AttributeCountLimit: ptr(50),
119+
AttributeValueLengthLimit: ptr(100),
120+
},
121+
},
122+
},
123+
},
124+
},
112125
}
113126
for _, tt := range tests {
114127
t.Run(tt.name, func(t *testing.T) {
115128
tp, shutdown, err := tracerProvider(tt.cfg, resource.Default())
116-
require.Equal(t, tt.wantProvider, tp)
129+
if tt.wantProvider != nil {
130+
require.Equal(t, tt.wantProvider, tp)
131+
} else {
132+
require.NotNil(t, tp)
133+
require.IsType(t, &sdktrace.TracerProvider{}, tp)
134+
}
117135
assert.ErrorIs(t, err, tt.wantErr)
118136
require.NoError(t, shutdown(t.Context()))
119137
})
@@ -170,6 +188,51 @@ func TestTracerProviderOptions(t *testing.T) {
170188
assert.NotContains(t, buf.String(), "foo")
171189
}
172190

191+
func TestSpanProcessorLimits(t *testing.T) {
192+
tests := []struct {
193+
name string
194+
limits SpanLimits
195+
wantAdditionalOpts int
196+
}{
197+
{
198+
name: "no-limits",
199+
limits: SpanLimits{},
200+
wantAdditionalOpts: 0,
201+
},
202+
{
203+
name: "attribute-count-limit-only",
204+
limits: SpanLimits{
205+
AttributeCountLimit: ptr(50),
206+
},
207+
wantAdditionalOpts: 1,
208+
},
209+
{
210+
name: "attribute-value-length-limit-only",
211+
limits: SpanLimits{
212+
AttributeValueLengthLimit: ptr(100),
213+
},
214+
wantAdditionalOpts: 1,
215+
},
216+
{
217+
name: "both-limits",
218+
limits: SpanLimits{
219+
AttributeCountLimit: ptr(50),
220+
AttributeValueLengthLimit: ptr(100),
221+
},
222+
wantAdditionalOpts: 1,
223+
},
224+
}
225+
226+
for _, tt := range tests {
227+
t.Run(tt.name, func(t *testing.T) {
228+
initialOpts := []sdktrace.TracerProviderOption{}
229+
result := spanProcessorLimits(initialOpts, tt.limits)
230+
231+
assert.Len(t, result, tt.wantAdditionalOpts, "unexpected number of options returned")
232+
})
233+
}
234+
}
235+
173236
func TestSpanProcessor(t *testing.T) {
174237
consoleExporter, err := stdouttrace.New(
175238
stdouttrace.WithPrettyPrint(),

0 commit comments

Comments
 (0)