dogstatsd-ruby 4.8.3 → 5.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +165 -21
- data/lib/datadog/statsd/connection.rb +16 -18
- data/lib/datadog/statsd/connection_cfg.rb +125 -0
- data/lib/datadog/statsd/forwarder.rb +138 -0
- data/lib/datadog/statsd/message_buffer.rb +105 -0
- data/lib/datadog/statsd/sender.rb +184 -0
- data/lib/datadog/statsd/serialization/tag_serializer.rb +5 -1
- data/lib/datadog/statsd/single_thread_sender.rb +82 -0
- data/lib/datadog/statsd/telemetry.rb +43 -24
- data/lib/datadog/statsd/timer.rb +61 -0
- data/lib/datadog/statsd/udp_connection.rb +25 -14
- data/lib/datadog/statsd/uds_connection.rb +19 -8
- data/lib/datadog/statsd/version.rb +1 -1
- data/lib/datadog/statsd.rb +153 -69
- metadata +21 -11
- data/lib/datadog/statsd/batch.rb +0 -56
data/lib/datadog/statsd.rb
CHANGED
@@ -5,8 +5,13 @@ require_relative 'statsd/version'
|
|
5
5
|
require_relative 'statsd/telemetry'
|
6
6
|
require_relative 'statsd/udp_connection'
|
7
7
|
require_relative 'statsd/uds_connection'
|
8
|
-
require_relative 'statsd/
|
8
|
+
require_relative 'statsd/connection_cfg'
|
9
|
+
require_relative 'statsd/message_buffer'
|
9
10
|
require_relative 'statsd/serialization'
|
11
|
+
require_relative 'statsd/sender'
|
12
|
+
require_relative 'statsd/single_thread_sender'
|
13
|
+
require_relative 'statsd/forwarder'
|
14
|
+
require_relative 'statsd/timer'
|
10
15
|
|
11
16
|
# = Datadog::Statsd: A DogStatsd client (https://www.datadoghq.com)
|
12
17
|
#
|
@@ -26,13 +31,23 @@ require_relative 'statsd/serialization'
|
|
26
31
|
# statsd = Datadog::Statsd.new 'localhost', 8125, tags: 'tag1:true'
|
27
32
|
module Datadog
|
28
33
|
class Statsd
|
34
|
+
class Error < StandardError
|
35
|
+
end
|
36
|
+
|
29
37
|
OK = 0
|
30
38
|
WARNING = 1
|
31
39
|
CRITICAL = 2
|
32
40
|
UNKNOWN = 3
|
33
41
|
|
34
|
-
|
42
|
+
UDP_DEFAULT_BUFFER_SIZE = 1_432
|
43
|
+
UDS_DEFAULT_BUFFER_SIZE = 8_192
|
44
|
+
DEFAULT_BUFFER_POOL_SIZE = Float::INFINITY
|
45
|
+
|
46
|
+
UDP_DEFAULT_SENDER_QUEUE_SIZE = 2048
|
47
|
+
UDS_DEFAULT_SENDER_QUEUE_SIZE = 512
|
48
|
+
|
35
49
|
MAX_EVENT_SIZE = 8 * 1_024
|
50
|
+
|
36
51
|
# minimum flush interval for the telemetry in seconds
|
37
52
|
DEFAULT_TELEMETRY_FLUSH_INTERVAL = 10
|
38
53
|
|
@@ -51,77 +66,89 @@ module Datadog
|
|
51
66
|
serializer.global_tags
|
52
67
|
end
|
53
68
|
|
54
|
-
# Buffer containing the statsd message before they are sent in batch
|
55
|
-
attr_reader :buffer
|
56
|
-
|
57
|
-
# Maximum buffer size in bytes before it is flushed
|
58
|
-
attr_reader :max_buffer_bytes
|
59
|
-
|
60
69
|
# Default sample rate
|
61
70
|
attr_reader :sample_rate
|
62
71
|
|
63
|
-
# Connection
|
64
|
-
attr_reader :connection
|
65
|
-
|
66
72
|
# @param [String] host your statsd host
|
67
73
|
# @param [Integer] port your statsd port
|
68
74
|
# @option [String] namespace set a namespace to be prepended to every metric name
|
69
75
|
# @option [Array<String>|Hash] tags tags to be added to every metric
|
70
76
|
# @option [Logger] logger for debugging
|
71
|
-
# @option [Integer]
|
77
|
+
# @option [Integer] buffer_max_payload_size max bytes to buffer
|
78
|
+
# @option [Integer] buffer_max_pool_size max messages to buffer
|
79
|
+
# @option [Integer] sender_queue_size size of the sender queue in number of buffers
|
80
|
+
# @option [Numeric] buffer_flush_interval interval in second to flush buffer
|
72
81
|
# @option [String] socket_path unix socket path
|
73
82
|
# @option [Float] default sample rate if not overridden
|
83
|
+
# @option [Boolean] single_thread flushes the metrics on the main thread instead of in a companion thread
|
84
|
+
# @option [Boolean] delay_serialization delays stat serialization
|
74
85
|
def initialize(
|
75
86
|
host = nil,
|
76
87
|
port = nil,
|
88
|
+
socket_path: nil,
|
89
|
+
|
77
90
|
namespace: nil,
|
78
91
|
tags: nil,
|
79
|
-
max_buffer_bytes: DEFAULT_BUFFER_SIZE,
|
80
|
-
socket_path: nil,
|
81
|
-
logger: nil,
|
82
92
|
sample_rate: nil,
|
83
|
-
|
93
|
+
|
94
|
+
buffer_max_payload_size: nil,
|
95
|
+
buffer_max_pool_size: nil,
|
96
|
+
buffer_overflowing_stategy: :drop,
|
97
|
+
buffer_flush_interval: nil,
|
98
|
+
|
99
|
+
sender_queue_size: nil,
|
100
|
+
|
101
|
+
logger: nil,
|
102
|
+
|
103
|
+
single_thread: false,
|
104
|
+
delay_serialization: false,
|
105
|
+
|
106
|
+
telemetry_enable: true,
|
84
107
|
telemetry_flush_interval: DEFAULT_TELEMETRY_FLUSH_INTERVAL
|
85
108
|
)
|
86
109
|
unless tags.nil? || tags.is_a?(Array) || tags.is_a?(Hash)
|
87
|
-
raise ArgumentError, 'tags must be
|
110
|
+
raise ArgumentError, 'tags must be an array of string tags or a Hash'
|
88
111
|
end
|
89
112
|
|
90
113
|
@namespace = namespace
|
91
114
|
@prefix = @namespace ? "#{@namespace}.".freeze : nil
|
92
|
-
|
93
115
|
@serializer = Serialization::Serializer.new(prefix: @prefix, global_tags: tags)
|
116
|
+
@sample_rate = sample_rate
|
117
|
+
@delay_serialization = delay_serialization
|
94
118
|
|
95
|
-
|
119
|
+
@forwarder = Forwarder.new(
|
120
|
+
connection_cfg: ConnectionCfg.new(
|
121
|
+
host: host,
|
122
|
+
port: port,
|
123
|
+
socket_path: socket_path,
|
124
|
+
),
|
96
125
|
|
97
|
-
@telemetry = Telemetry.new(disable_telemetry, telemetry_flush_interval,
|
98
126
|
global_tags: tags,
|
99
|
-
|
100
|
-
)
|
127
|
+
logger: logger,
|
101
128
|
|
102
|
-
|
103
|
-
when :udp
|
104
|
-
UDPConnection.new(host, port, logger, telemetry)
|
105
|
-
when :uds
|
106
|
-
UDSConnection.new(socket_path, logger, telemetry)
|
107
|
-
end
|
129
|
+
single_thread: single_thread,
|
108
130
|
|
109
|
-
|
131
|
+
buffer_max_payload_size: buffer_max_payload_size,
|
132
|
+
buffer_max_pool_size: buffer_max_pool_size,
|
133
|
+
buffer_overflowing_stategy: buffer_overflowing_stategy,
|
134
|
+
buffer_flush_interval: buffer_flush_interval,
|
110
135
|
|
111
|
-
|
136
|
+
sender_queue_size: sender_queue_size,
|
112
137
|
|
113
|
-
|
114
|
-
|
138
|
+
telemetry_flush_interval: telemetry_enable ? telemetry_flush_interval : nil,
|
139
|
+
serializer: serializer
|
140
|
+
)
|
115
141
|
end
|
116
142
|
|
117
143
|
# yield a new instance to a block and close it when done
|
118
144
|
# for short-term use-cases that don't want to close the socket manually
|
119
|
-
|
120
|
-
|
145
|
+
# TODO: replace with ... once we are on ruby 2.7
|
146
|
+
def self.open(*args, **kwargs)
|
147
|
+
instance = new(*args, **kwargs)
|
121
148
|
|
122
149
|
yield instance
|
123
150
|
ensure
|
124
|
-
instance.close
|
151
|
+
instance.close if instance
|
125
152
|
end
|
126
153
|
|
127
154
|
# Sends an increment (count = 1) for the given stat to the statsd server.
|
@@ -129,6 +156,7 @@ module Datadog
|
|
129
156
|
# @param [String] stat stat name
|
130
157
|
# @param [Hash] opts the options to create the metric with
|
131
158
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
159
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
132
160
|
# @option opts [Array<String>] :tags An array of tags
|
133
161
|
# @option opts [Numeric] :by increment value, default 1
|
134
162
|
# @see #count
|
@@ -143,6 +171,7 @@ module Datadog
|
|
143
171
|
# @param [String] stat stat name
|
144
172
|
# @param [Hash] opts the options to create the metric with
|
145
173
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
174
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
146
175
|
# @option opts [Array<String>] :tags An array of tags
|
147
176
|
# @option opts [Numeric] :by decrement value, default 1
|
148
177
|
# @see #count
|
@@ -158,13 +187,14 @@ module Datadog
|
|
158
187
|
# @param [Integer] count count
|
159
188
|
# @param [Hash] opts the options to create the metric with
|
160
189
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
190
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
161
191
|
# @option opts [Array<String>] :tags An array of tags
|
162
192
|
def count(stat, count, opts = EMPTY_OPTIONS)
|
163
193
|
opts = { sample_rate: opts } if opts.is_a?(Numeric)
|
164
194
|
send_stats(stat, count, COUNTER_TYPE, opts)
|
165
195
|
end
|
166
196
|
|
167
|
-
# Sends an
|
197
|
+
# Sends an arbitrary gauge value for the given stat to the statsd server.
|
168
198
|
#
|
169
199
|
# This is useful for recording things like available disk space,
|
170
200
|
# memory usage, and the like, which have different semantics than
|
@@ -174,6 +204,7 @@ module Datadog
|
|
174
204
|
# @param [Numeric] value gauge value.
|
175
205
|
# @param [Hash] opts the options to create the metric with
|
176
206
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
207
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
177
208
|
# @option opts [Array<String>] :tags An array of tags
|
178
209
|
# @example Report the current user count:
|
179
210
|
# $statsd.gauge('user.count', User.count)
|
@@ -188,6 +219,7 @@ module Datadog
|
|
188
219
|
# @param [Numeric] value histogram value.
|
189
220
|
# @param [Hash] opts the options to create the metric with
|
190
221
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
222
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
191
223
|
# @option opts [Array<String>] :tags An array of tags
|
192
224
|
# @example Report the current user count:
|
193
225
|
# $statsd.histogram('user.count', User.count)
|
@@ -201,6 +233,7 @@ module Datadog
|
|
201
233
|
# @param [Numeric] value distribution value.
|
202
234
|
# @param [Hash] opts the options to create the metric with
|
203
235
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
236
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
204
237
|
# @option opts [Array<String>] :tags An array of tags
|
205
238
|
# @example Report the current user count:
|
206
239
|
# $statsd.distribution('user.count', User.count)
|
@@ -208,6 +241,26 @@ module Datadog
|
|
208
241
|
send_stats(stat, value, DISTRIBUTION_TYPE, opts)
|
209
242
|
end
|
210
243
|
|
244
|
+
# Reports execution time of the provided block as a distribution.
|
245
|
+
#
|
246
|
+
# If the block fails, the stat is still reported, then the error
|
247
|
+
# is reraised
|
248
|
+
#
|
249
|
+
# @param [String] stat stat name.
|
250
|
+
# @param [Numeric] value distribution value.
|
251
|
+
# @param [Hash] opts the options to create the metric with
|
252
|
+
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
253
|
+
# @option opts [Array<String>] :tags An array of tags
|
254
|
+
# @example Report the time (in ms) taken to activate an account
|
255
|
+
# $statsd.distribution_time('account.activate') { @account.activate! }
|
256
|
+
def distribution_time(stat, opts = EMPTY_OPTIONS)
|
257
|
+
opts = { sample_rate: opts } if opts.is_a?(Numeric)
|
258
|
+
start = now
|
259
|
+
yield
|
260
|
+
ensure
|
261
|
+
distribution(stat, ((now - start) * 1000).round, opts)
|
262
|
+
end
|
263
|
+
|
211
264
|
# Sends a timing (in ms) for the given stat to the statsd server. The
|
212
265
|
# sample_rate determines what percentage of the time this report is sent. The
|
213
266
|
# statsd server then uses the sample_rate to correctly track the average
|
@@ -217,6 +270,7 @@ module Datadog
|
|
217
270
|
# @param [Integer] ms timing in milliseconds
|
218
271
|
# @param [Hash] opts the options to create the metric with
|
219
272
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
273
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
220
274
|
# @option opts [Array<String>] :tags An array of tags
|
221
275
|
def timing(stat, ms, opts = EMPTY_OPTIONS)
|
222
276
|
opts = { sample_rate: opts } if opts.is_a?(Numeric)
|
@@ -231,6 +285,7 @@ module Datadog
|
|
231
285
|
# @param [String] stat stat name
|
232
286
|
# @param [Hash] opts the options to create the metric with
|
233
287
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
288
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
234
289
|
# @option opts [Array<String>] :tags An array of tags
|
235
290
|
# @yield The operation to be timed
|
236
291
|
# @see #timing
|
@@ -250,6 +305,7 @@ module Datadog
|
|
250
305
|
# @param [Numeric] value set value.
|
251
306
|
# @param [Hash] opts the options to create the metric with
|
252
307
|
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
308
|
+
# @option opts [Boolean] :pre_sampled If true, the client assumes the caller has already sampled metrics at :sample_rate, and doesn't perform sampling.
|
253
309
|
# @option opts [Array<String>] :tags An array of tags
|
254
310
|
# @example Record a unique visitory by id:
|
255
311
|
# $statsd.set('visitors.uniques', User.id)
|
@@ -270,9 +326,9 @@ module Datadog
|
|
270
326
|
# @example Report a critical service check status
|
271
327
|
# $statsd.service_check('my.service.check', Statsd::CRITICAL, :tags=>['urgent'])
|
272
328
|
def service_check(name, status, opts = EMPTY_OPTIONS)
|
273
|
-
telemetry.sent(service_checks: 1)
|
329
|
+
telemetry.sent(service_checks: 1) if telemetry
|
274
330
|
|
275
|
-
|
331
|
+
forwarder.send_message(serializer.to_service_check(name, status, opts))
|
276
332
|
end
|
277
333
|
|
278
334
|
# This end point allows you to post events to the stream. You can tag them, set priority and even aggregate them with other events.
|
@@ -295,13 +351,20 @@ module Datadog
|
|
295
351
|
# @example Report an awful event:
|
296
352
|
# $statsd.event('Something terrible happened', 'The end is near if we do nothing', :alert_type=>'warning', :tags=>['end_of_times','urgent'])
|
297
353
|
def event(title, text, opts = EMPTY_OPTIONS)
|
298
|
-
telemetry.sent(events: 1)
|
354
|
+
telemetry.sent(events: 1) if telemetry
|
299
355
|
|
300
|
-
|
356
|
+
forwarder.send_message(serializer.to_event(title, text, opts))
|
301
357
|
end
|
302
358
|
|
303
|
-
# Send several metrics in the same
|
304
|
-
# They will be buffered and flushed when the block finishes
|
359
|
+
# Send several metrics in the same packet.
|
360
|
+
# They will be buffered and flushed when the block finishes.
|
361
|
+
#
|
362
|
+
# This method exists for compatibility with v4.x versions, it is not needed
|
363
|
+
# anymore since the batching is now automatically done internally.
|
364
|
+
# It also means that an automatic flush could occur if the buffer is filled
|
365
|
+
# during the execution of the batch block.
|
366
|
+
#
|
367
|
+
# This method is DEPRECATED and will be removed in future v6.x API.
|
305
368
|
#
|
306
369
|
# @example Send several metrics in one packet:
|
307
370
|
# $statsd.batch do |s|
|
@@ -309,50 +372,71 @@ module Datadog
|
|
309
372
|
# s.increment('page.views')
|
310
373
|
# end
|
311
374
|
def batch
|
312
|
-
|
313
|
-
|
314
|
-
end
|
375
|
+
yield self
|
376
|
+
flush(sync: true)
|
315
377
|
end
|
316
378
|
|
317
379
|
# Close the underlying socket
|
318
|
-
|
319
|
-
|
380
|
+
#
|
381
|
+
# @param [Boolean, true] flush Should we flush the metrics before closing
|
382
|
+
def close(flush: true)
|
383
|
+
flush(sync: true) if flush
|
384
|
+
forwarder.close
|
385
|
+
end
|
386
|
+
|
387
|
+
def sync_with_outbound_io
|
388
|
+
forwarder.sync_with_outbound_io
|
389
|
+
end
|
390
|
+
|
391
|
+
# Flush the buffer into the connection
|
392
|
+
def flush(flush_telemetry: false, sync: false)
|
393
|
+
forwarder.flush(flush_telemetry: flush_telemetry, sync: sync)
|
394
|
+
end
|
395
|
+
|
396
|
+
def telemetry
|
397
|
+
forwarder.telemetry
|
398
|
+
end
|
399
|
+
|
400
|
+
def host
|
401
|
+
forwarder.host
|
402
|
+
end
|
403
|
+
|
404
|
+
def port
|
405
|
+
forwarder.port
|
406
|
+
end
|
407
|
+
|
408
|
+
def socket_path
|
409
|
+
forwarder.socket_path
|
410
|
+
end
|
411
|
+
|
412
|
+
def transport_type
|
413
|
+
forwarder.transport_type
|
320
414
|
end
|
321
415
|
|
322
416
|
private
|
323
417
|
attr_reader :serializer
|
324
|
-
attr_reader :
|
418
|
+
attr_reader :forwarder
|
325
419
|
|
326
|
-
PROCESS_TIME_SUPPORTED = (RUBY_VERSION >= '2.1.0')
|
327
420
|
EMPTY_OPTIONS = {}.freeze
|
328
421
|
|
329
|
-
|
330
|
-
|
331
|
-
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
332
|
-
end
|
333
|
-
else
|
334
|
-
def now
|
335
|
-
Time.now.to_f
|
336
|
-
end
|
422
|
+
def now
|
423
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
337
424
|
end
|
338
425
|
|
339
426
|
def send_stats(stat, delta, type, opts = EMPTY_OPTIONS)
|
340
|
-
telemetry.sent(metrics: 1)
|
427
|
+
telemetry.sent(metrics: 1) if telemetry
|
341
428
|
|
342
429
|
sample_rate = opts[:sample_rate] || @sample_rate || 1
|
343
430
|
|
344
|
-
if sample_rate == 1 || rand <= sample_rate
|
345
|
-
full_stat =
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
431
|
+
if sample_rate == 1 || opts[:pre_sampled] || rand <= sample_rate
|
432
|
+
full_stat =
|
433
|
+
if @delay_serialization
|
434
|
+
[[stat, delta, type], {tags: opts[:tags], sample_rate: sample_rate}]
|
435
|
+
else
|
436
|
+
serializer.to_stat(stat, delta, type, tags: opts[:tags], sample_rate: sample_rate)
|
437
|
+
end
|
350
438
|
|
351
|
-
|
352
|
-
if @batch.open?
|
353
|
-
@batch.add(message)
|
354
|
-
else
|
355
|
-
@connection.write(message)
|
439
|
+
forwarder.send_message(full_stat)
|
356
440
|
end
|
357
441
|
end
|
358
442
|
end
|
metadata
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dogstatsd-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rein Henrichs
|
8
|
+
- Karim Bogtob
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2023-09-07 00:00:00.000000000 Z
|
12
13
|
dependencies: []
|
13
|
-
description: A Ruby
|
14
|
+
description: A Ruby DogStatsd client
|
14
15
|
email: code@datadoghq.com
|
15
16
|
executables: []
|
16
17
|
extensions: []
|
@@ -21,15 +22,20 @@ files:
|
|
21
22
|
- LICENSE.txt
|
22
23
|
- README.md
|
23
24
|
- lib/datadog/statsd.rb
|
24
|
-
- lib/datadog/statsd/batch.rb
|
25
25
|
- lib/datadog/statsd/connection.rb
|
26
|
+
- lib/datadog/statsd/connection_cfg.rb
|
27
|
+
- lib/datadog/statsd/forwarder.rb
|
28
|
+
- lib/datadog/statsd/message_buffer.rb
|
29
|
+
- lib/datadog/statsd/sender.rb
|
26
30
|
- lib/datadog/statsd/serialization.rb
|
27
31
|
- lib/datadog/statsd/serialization/event_serializer.rb
|
28
32
|
- lib/datadog/statsd/serialization/serializer.rb
|
29
33
|
- lib/datadog/statsd/serialization/service_check_serializer.rb
|
30
34
|
- lib/datadog/statsd/serialization/stat_serializer.rb
|
31
35
|
- lib/datadog/statsd/serialization/tag_serializer.rb
|
36
|
+
- lib/datadog/statsd/single_thread_sender.rb
|
32
37
|
- lib/datadog/statsd/telemetry.rb
|
38
|
+
- lib/datadog/statsd/timer.rb
|
33
39
|
- lib/datadog/statsd/udp_connection.rb
|
34
40
|
- lib/datadog/statsd/uds_connection.rb
|
35
41
|
- lib/datadog/statsd/version.rb
|
@@ -38,10 +44,14 @@ licenses:
|
|
38
44
|
- MIT
|
39
45
|
metadata:
|
40
46
|
bug_tracker_uri: https://github.com/DataDog/dogstatsd-ruby/issues
|
41
|
-
changelog_uri: https://github.com/DataDog/dogstatsd-ruby/blob/
|
42
|
-
documentation_uri: https://www.rubydoc.info/gems/dogstatsd-ruby/
|
43
|
-
source_code_uri: https://github.com/DataDog/dogstatsd-ruby/tree/
|
44
|
-
post_install_message:
|
47
|
+
changelog_uri: https://github.com/DataDog/dogstatsd-ruby/blob/v5.6.1/CHANGELOG.md
|
48
|
+
documentation_uri: https://www.rubydoc.info/gems/dogstatsd-ruby/5.6.1
|
49
|
+
source_code_uri: https://github.com/DataDog/dogstatsd-ruby/tree/v5.6.1
|
50
|
+
post_install_message: |2+
|
51
|
+
|
52
|
+
If you are upgrading from v4.x of the dogstatsd-ruby library, note the major change to the threading model:
|
53
|
+
https://github.com/DataDog/dogstatsd-ruby#migrating-from-v4x-to-v5x
|
54
|
+
|
45
55
|
rdoc_options: []
|
46
56
|
require_paths:
|
47
57
|
- lib
|
@@ -49,16 +59,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
49
59
|
requirements:
|
50
60
|
- - ">="
|
51
61
|
- !ruby/object:Gem::Version
|
52
|
-
version: 2.
|
62
|
+
version: 2.1.0
|
53
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
64
|
requirements:
|
55
65
|
- - ">="
|
56
66
|
- !ruby/object:Gem::Version
|
57
67
|
version: '0'
|
58
68
|
requirements: []
|
59
|
-
|
60
|
-
rubygems_version: 2.7.10
|
69
|
+
rubygems_version: 3.2.3
|
61
70
|
signing_key:
|
62
71
|
specification_version: 4
|
63
72
|
summary: A Ruby DogStatsd client
|
64
73
|
test_files: []
|
74
|
+
...
|
data/lib/datadog/statsd/batch.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
class Statsd
|
5
|
-
class Batch
|
6
|
-
def initialize(connection, max_buffer_bytes)
|
7
|
-
@connection = connection
|
8
|
-
@max_buffer_bytes = max_buffer_bytes
|
9
|
-
@depth = 0
|
10
|
-
reset
|
11
|
-
end
|
12
|
-
|
13
|
-
def open
|
14
|
-
@depth += 1
|
15
|
-
|
16
|
-
yield
|
17
|
-
ensure
|
18
|
-
@depth -= 1
|
19
|
-
flush if !open?
|
20
|
-
end
|
21
|
-
|
22
|
-
def open?
|
23
|
-
@depth > 0
|
24
|
-
end
|
25
|
-
|
26
|
-
def add(message)
|
27
|
-
message_bytes = message.bytesize
|
28
|
-
|
29
|
-
unless @buffer_bytes == 0
|
30
|
-
if @buffer_bytes + 1 + message_bytes >= @max_buffer_bytes
|
31
|
-
flush
|
32
|
-
else
|
33
|
-
@buffer << "\n"
|
34
|
-
@buffer_bytes += 1
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
@buffer << message
|
39
|
-
@buffer_bytes += message_bytes
|
40
|
-
end
|
41
|
-
|
42
|
-
def flush
|
43
|
-
return if @buffer_bytes == 0
|
44
|
-
@connection.write(@buffer)
|
45
|
-
reset
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
def reset
|
51
|
-
@buffer = String.new
|
52
|
-
@buffer_bytes = 0
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|