Skip to content

Commit 70bdf98

Browse files
authored
fix: SpanLimits setting event attributes length limit (#1230)
* fix: SpanLimits setting event attributes length limit
1 parent 3402bfd commit 70bdf98

File tree

4 files changed

+69
-45
lines changed

4 files changed

+69
-45
lines changed

sdk/lib/opentelemetry/sdk/trace/span.rb

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def add_attributes(attributes)
137137
#
138138
# @return [self] returns itself
139139
def add_event(name, attributes: nil, timestamp: nil)
140-
event = Event.new(name, truncate_attribute_values(attributes), relative_timestamp(timestamp))
140+
event = Event.new(name, truncate_attribute_values(attributes, @span_limits.event_attribute_length_limit), relative_timestamp(timestamp))
141141

142142
@mutex.synchronize do
143143
if @ended
@@ -349,14 +349,12 @@ def trim_span_attributes(attrs)
349349

350350
excess = attrs.size - @span_limits.attribute_count_limit
351351
excess.times { attrs.shift } if excess.positive?
352-
truncate_attribute_values(attrs)
352+
truncate_attribute_values(attrs, @span_limits.attribute_length_limit)
353353
nil
354354
end
355355

356-
def truncate_attribute_values(attrs)
356+
def truncate_attribute_values(attrs, attribute_length_limit)
357357
return EMPTY_ATTRIBUTES if attrs.nil?
358-
359-
attribute_length_limit = @span_limits.attribute_length_limit
360358
return attrs if attribute_length_limit.nil?
361359

362360
attrs.transform_values! { |value| OpenTelemetry::Common::Utilities.truncate_attribute_value(value, attribute_length_limit) }

sdk/lib/opentelemetry/sdk/trace/span_limits.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class SpanLimits
2424
# The global default max number of attributes per {OpenTelemetry::SDK::Trace::Event}.
2525
attr_reader :event_attribute_count_limit
2626

27+
# The global default max length of attribute value per {OpenTelemetry::SDK::Trace::Event}.
28+
attr_reader :event_attribute_length_limit
29+
2730
# The global default max number of attributes per {OpenTelemetry::Trace::Link}.
2831
attr_reader :link_attribute_count_limit
2932

@@ -36,19 +39,23 @@ def initialize(attribute_count_limit: Integer(OpenTelemetry::Common::Utilities.c
3639
event_count_limit: Integer(OpenTelemetry::Common::Utilities.config_opt('OTEL_SPAN_EVENT_COUNT_LIMIT', default: 128)),
3740
link_count_limit: Integer(OpenTelemetry::Common::Utilities.config_opt('OTEL_SPAN_LINK_COUNT_LIMIT', default: 128)),
3841
event_attribute_count_limit: Integer(OpenTelemetry::Common::Utilities.config_opt('OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT', default: 128)),
42+
event_attribute_length_limit: OpenTelemetry::Common::Utilities.config_opt('OTEL_EVENT_ATTRIBUTE_VALUE_LENGTH_LIMIT', 'OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT'),
3943
link_attribute_count_limit: Integer(OpenTelemetry::Common::Utilities.config_opt('OTEL_LINK_ATTRIBUTE_COUNT_LIMIT', default: 128)))
44+
4045
raise ArgumentError, 'attribute_count_limit must be positive' unless attribute_count_limit.positive?
4146
raise ArgumentError, 'attribute_length_limit must not be less than 32' unless attribute_length_limit.nil? || Integer(attribute_length_limit) >= 32
4247
raise ArgumentError, 'event_count_limit must be positive' unless event_count_limit.positive?
4348
raise ArgumentError, 'link_count_limit must be positive' unless link_count_limit.positive?
4449
raise ArgumentError, 'event_attribute_count_limit must be positive' unless event_attribute_count_limit.positive?
50+
raise ArgumentError, 'event_attribute_length_limit must not be less than 32' unless event_attribute_length_limit.nil? || Integer(event_attribute_length_limit) >= 32
4551
raise ArgumentError, 'link_attribute_count_limit must be positive' unless link_attribute_count_limit.positive?
4652

4753
@attribute_count_limit = attribute_count_limit
4854
@attribute_length_limit = attribute_length_limit.nil? ? nil : Integer(attribute_length_limit)
4955
@event_count_limit = event_count_limit
5056
@link_count_limit = link_count_limit
5157
@event_attribute_count_limit = event_attribute_count_limit
58+
@event_attribute_length_limit = event_attribute_length_limit.nil? ? nil : Integer(event_attribute_length_limit)
5259
@link_attribute_count_limit = link_attribute_count_limit
5360
end
5461

sdk/test/opentelemetry/sdk/trace/span_limits_test.rb

Lines changed: 57 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,33 @@
77
require 'test_helper'
88

99
describe OpenTelemetry::SDK::Trace::SpanLimits do
10-
let(:subject) { OpenTelemetry::SDK::Trace::SpanLimits }
10+
let(:span_limits) { OpenTelemetry::SDK::Trace::SpanLimits.new }
1111

1212
describe '#initialize' do
1313
it 'provides defaults' do
14-
config = subject.new
15-
_(config.attribute_count_limit).must_equal 128
16-
_(config.event_count_limit).must_equal 128
17-
_(config.link_count_limit).must_equal 128
18-
_(config.event_attribute_count_limit).must_equal 128
19-
_(config.link_attribute_count_limit).must_equal 128
14+
_(span_limits.attribute_count_limit).must_equal 128
15+
_(span_limits.attribute_length_limit).must_be_nil
16+
_(span_limits.event_count_limit).must_equal 128
17+
_(span_limits.link_count_limit).must_equal 128
18+
_(span_limits.event_attribute_count_limit).must_equal 128
19+
_(span_limits.event_attribute_length_limit).must_be_nil
20+
_(span_limits.link_attribute_count_limit).must_equal 128
21+
end
22+
23+
it 'prioritizes specific environment varibles for attribute value length limits' do
24+
OpenTelemetry::TestHelpers.with_env('OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '35',
25+
'OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '33',
26+
'OTEL_EVENT_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '32') do
27+
_(span_limits.attribute_length_limit).must_equal 33
28+
_(span_limits.event_attribute_length_limit).must_equal 32
29+
end
30+
end
31+
32+
it 'uses general attribute value length limits in the absence of more specific ones' do
33+
OpenTelemetry::TestHelpers.with_env('OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '35') do
34+
_(span_limits.attribute_length_limit).must_equal 35
35+
_(span_limits.event_attribute_length_limit).must_equal 35
36+
end
2037
end
2138

2239
it 'reflects environment variables' do
@@ -27,13 +44,13 @@
2744
'OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT' => '5',
2845
'OTEL_LINK_ATTRIBUTE_COUNT_LIMIT' => '6',
2946
'OTEL_TRACES_SAMPLER' => 'always_on') do
30-
config = subject.new
31-
_(config.attribute_count_limit).must_equal 1
32-
_(config.event_count_limit).must_equal 2
33-
_(config.link_count_limit).must_equal 3
34-
_(config.attribute_length_limit).must_equal 32
35-
_(config.event_attribute_count_limit).must_equal 5
36-
_(config.link_attribute_count_limit).must_equal 6
47+
_(span_limits.attribute_count_limit).must_equal 1
48+
_(span_limits.event_count_limit).must_equal 2
49+
_(span_limits.link_count_limit).must_equal 3
50+
_(span_limits.attribute_length_limit).must_equal 32
51+
_(span_limits.event_attribute_count_limit).must_equal 5
52+
_(span_limits.event_attribute_length_limit).must_be_nil
53+
_(span_limits.link_attribute_count_limit).must_equal 6
3754
end
3855
end
3956

@@ -45,13 +62,13 @@
4562
'OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT' => '5',
4663
'OTEL_LINK_ATTRIBUTE_COUNT_LIMIT' => '6',
4764
'OTEL_TRACES_SAMPLER' => 'always_on') do
48-
config = subject.new
49-
_(config.attribute_count_limit).must_equal 1
50-
_(config.event_count_limit).must_equal 2
51-
_(config.link_count_limit).must_equal 3
52-
_(config.attribute_length_limit).must_equal 32
53-
_(config.event_attribute_count_limit).must_equal 5
54-
_(config.link_attribute_count_limit).must_equal 6
65+
_(span_limits.attribute_count_limit).must_equal 1
66+
_(span_limits.event_count_limit).must_equal 2
67+
_(span_limits.link_count_limit).must_equal 3
68+
_(span_limits.attribute_length_limit).must_equal 32
69+
_(span_limits.event_attribute_count_limit).must_equal 5
70+
_(span_limits.event_attribute_length_limit).must_be_nil
71+
_(span_limits.link_attribute_count_limit).must_equal 6
5572
end
5673
end
5774

@@ -61,29 +78,31 @@
6178
'OTEL_SPAN_LINK_COUNT_LIMIT' => '3',
6279
'OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '4',
6380
'OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT' => '5',
81+
'OTEL_EVENT_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '32',
6482
'OTEL_LINK_ATTRIBUTE_COUNT_LIMIT' => '6',
6583
'OTEL_TRACES_SAMPLER' => 'always_on') do
66-
config = subject.new(attribute_count_limit: 10,
67-
event_count_limit: 11,
68-
link_count_limit: 12,
69-
event_attribute_count_limit: 13,
70-
link_attribute_count_limit: 14,
71-
attribute_length_limit: 32)
72-
_(config.attribute_count_limit).must_equal 10
73-
_(config.event_count_limit).must_equal 11
74-
_(config.link_count_limit).must_equal 12
75-
_(config.event_attribute_count_limit).must_equal 13
76-
_(config.link_attribute_count_limit).must_equal 14
77-
_(config.attribute_length_limit).must_equal 32
84+
span_limits = OpenTelemetry::SDK::Trace::SpanLimits.new(attribute_count_limit: 10,
85+
event_count_limit: 11,
86+
link_count_limit: 12,
87+
event_attribute_count_limit: 13,
88+
event_attribute_length_limit: 40,
89+
link_attribute_count_limit: 14,
90+
attribute_length_limit: 32)
91+
_(span_limits.attribute_count_limit).must_equal 10
92+
_(span_limits.event_count_limit).must_equal 11
93+
_(span_limits.link_count_limit).must_equal 12
94+
_(span_limits.event_attribute_count_limit).must_equal 13
95+
_(span_limits.event_attribute_length_limit).must_equal 40
96+
_(span_limits.link_attribute_count_limit).must_equal 14
97+
_(span_limits.attribute_length_limit).must_equal 32
7898
end
7999
end
80100

81101
it 'reflects generic attribute env vars' do
82102
OpenTelemetry::TestHelpers.with_env('OTEL_ATTRIBUTE_COUNT_LIMIT' => '1',
83103
'OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '32') do
84-
config = subject.new
85-
_(config.attribute_count_limit).must_equal 1
86-
_(config.attribute_length_limit).must_equal 32
104+
_(span_limits.attribute_count_limit).must_equal 1
105+
_(span_limits.attribute_length_limit).must_equal 32
87106
end
88107
end
89108

@@ -92,9 +111,8 @@
92111
'OTEL_ATTRIBUTE_COUNT_LIMIT' => '2',
93112
'OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '32',
94113
'OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT' => '33') do
95-
config = subject.new
96-
_(config.attribute_count_limit).must_equal 1
97-
_(config.attribute_length_limit).must_equal 32
114+
_(span_limits.attribute_count_limit).must_equal 1
115+
_(span_limits.attribute_length_limit).must_equal 32
98116
end
99117
end
100118
end

sdk/test/opentelemetry/sdk/trace/span_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
link_count_limit: 1,
2323
event_attribute_count_limit: 1,
2424
link_attribute_count_limit: 1,
25-
attribute_length_limit: 32
25+
attribute_length_limit: 32,
26+
event_attribute_length_limit: 32
2627
)
2728
end
2829
let(:span) do

0 commit comments

Comments
 (0)