Skip to content

Commit 5a84474

Browse files
authored
Calculate batch sizes in bytes (#44)
* fix: count max payload size in bytes * Changelog and bump version * Verify payload always under max size * Review comments * Use bytesize in tests
1 parent 0162cbc commit 5a84474

File tree

4 files changed

+35
-10
lines changed

4 files changed

+35
-10
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.7.1
2+
3+
- Fix an error where max payload size was calculated using character count instead of bytes
4+
15
## 0.7.0
26

37
- Add new development dependency `rackup` for logstash 8.x compatibility

lib/logstash/outputs/dynatrace.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,11 @@ def initialize(max_batch_size)
122122

123123
def offer(serialized_event)
124124
# 2 square brackets, the length of all previously serialized strings, commas, and the current event size
125-
batch_size_bytes = 2 + @batch_events_size + @serialized_events.length + serialized_event.length
125+
batch_size_bytes = 2 + @batch_events_size + @serialized_events.length + serialized_event.bytesize
126126
return false if batch_size_bytes > @max_batch_size
127127

128128
@serialized_events.push(serialized_event)
129-
@batch_events_size += serialized_event.length
129+
@batch_events_size += serialized_event.bytesize
130130
true
131131
end
132132

@@ -178,8 +178,8 @@ def send_events(events)
178178

179179
events.each do |event|
180180
serialized_event = LogStash::Json.dump(event.to_hash)
181-
if serialized_event.length > @max_payload_size
182-
log_params = { size: serialized_event.length }
181+
if serialized_event.bytesize > @max_payload_size
182+
log_params = { size: serialized_event.bytesize }
183183
log_params[:body] = serialized_event if @debug_include_body
184184
log_warning('Event larger than max_payload_size dropped', log_params)
185185
next

spec/outputs/dynatrace_spec.rb

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,17 +232,38 @@
232232
end
233233
end
234234

235-
context 'max_payload_size 2MB' do
236-
let(:config) { { 'ingest_endpoint_url' => ingest_endpoint_url, 'api_key' => api_key, 'max_payload_size' => 2_000_000 } }
235+
context 'max_payload_size 500' do
236+
let(:max_payload_size) { 500 }
237+
let(:config) { { 'ingest_endpoint_url' => ingest_endpoint_url, 'api_key' => api_key, 'max_payload_size' => max_payload_size } }
237238
subject { LogStash::Outputs::Dynatrace.new(config) }
238239

239240
before do
240241
allow(subject).to receive(:send_event) { |e, att| [:success, e, att] }
241-
subject.multi_receive([1, 2].map { |n| LogStash::Event.new({ 'n' => n.to_s * 1_250_000 }) })
242242
end
243243

244-
it 'should split the chunk into multiple requests' do
245-
expect(subject).to have_received(:send_event).exactly(2).times
244+
it 'should send 2 400B messages in multiple requests' do
245+
subject.multi_receive([1, 2].map { |n| LogStash::Event.new({ 'n' => n.to_s * 400 }) })
246+
expect(subject).to have_received(:send_event).exactly(2).times do |s|
247+
expect(s.bytesize).to be <= max_payload_size
248+
end
249+
end
250+
251+
it 'should send 2 100B messages in a single request' do
252+
subject.multi_receive([1, 2].map { |n| LogStash::Event.new({ 'n' => n.to_s * 100 }) })
253+
expect(subject).to have_received(:send_event).exactly(1).times do |s|
254+
expect(s.bytesize).to be <= max_payload_size
255+
end
256+
end
257+
258+
it 'should drop messages larger than max_payload_size' do
259+
subject.multi_receive([
260+
LogStash::Event.new({ 'event' => '🤣' * 400 }),
261+
LogStash::Event.new({ 'event' => 'n' * 600 }),
262+
LogStash::Event.new({ 'event' => 'n' * 400 }),
263+
])
264+
expect(subject).to have_received(:send_event).exactly(1).times do |s|
265+
expect(s.bytesize).to be <= max_payload_size
266+
end
246267
end
247268
end
248269

version.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
logstash-output-dynatrace: '0.7.0'
1+
logstash-output-dynatrace: '0.7.1'

0 commit comments

Comments
 (0)