dogstatsd-ruby 5.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 264d78a169508453151e7a5c3260c2299ad05c727dc9c72cfa52f8be721809d0
4
- data.tar.gz: 8e0726168a20f7efcb2bdcf72ab3d748184cd652de4fd25871f9fdf676020baf
3
+ metadata.gz: 9abfaabd9be58a320dd8cc8d1d4998ac287daa08e68ab894054cf2910f5f3133
4
+ data.tar.gz: 88ebf4ef472f7663897c06fa3e5753a17c12722bc1a58f8aa4e9fb0a3ace07c6
5
5
  SHA512:
6
- metadata.gz: 1875c615a043db68c69d855af2b454e45ef41af1d7e1f726a6067c35e260eb0dbc9b706a0588608e31bd5087e500b1b77b1b604f3dc22750f1376b6583b78c9a
7
- data.tar.gz: 36f60d62312f6844efa9ce1b53a86cde380140582e009b5e5bf07d3a4a859e4d762e92a2ebcfe38a668145255f82f72c84504caabb93f25475e895a5166a9969
6
+ metadata.gz: 199527bd5e9d39d94be3cabf28dc5f4d8913c4d3f746a6018a22c9ed13440c34d77fc11b363f47f9e2fd325974005fdc3567a223de4669b388ced99c3cd0750f
7
+ data.tar.gz: 0da25bafef540e4d36be8cae9c1fbb1f11c6aea94415828941aa9c34877db75166574f41b5e1a0829c71285f958162133d0f592a34619ce066e14c97ea86fd4d
data/README.md CHANGED
@@ -51,9 +51,37 @@ call the method `Datadog::Statsd#flush` if you want to force the sending of metr
51
51
 
52
52
  2. You have to make sure you are either:
53
53
 
54
- * using singletons instances of the DogStatsD client and not allocating one each time you need one, letting the buffering mechanism flush metrics, or,
54
+ * using singletons instances of the DogStatsD client and not allocating one each time you need one, letting the buffering mechanism flush metrics, it's still a bad solution if the process later forks (see related section below). Or,
55
55
  * properly closing your DogStatsD client instance when it is not needed anymore using the method `Datadog::Statsd#close` to release the resources used by the instance and to close the socket
56
56
 
57
+ If you have issues with the companion thread or the buffering mode, you can instantiate a client that behaves exactly as in v4.x (i.e. no companion thread and flush on every metric submission):
58
+
59
+ ```ruby
60
+ # Import the library
61
+ require 'datadog/statsd'
62
+
63
+ # Create a DogStatsD client instance using UDP
64
+ statsd = Datadog::Statsd.new('localhost', 8125, single_thread: true, buffer_max_payload_size: 1)
65
+ ...
66
+ # to close the instance is not necessary in this case since metrics are flushed on submission
67
+ # but it is still a good practice and it explicitely closes the socket
68
+ statsd.close()
69
+ ```
70
+
71
+ or
72
+
73
+ ```ruby
74
+ # Import the library
75
+ require 'datadog/statsd'
76
+
77
+ # Create a DogStatsD client instance using UDS
78
+ statsd = Datadog::Statsd.new(socket_path: '/path/to/socket/file', single_thread: true, buffer_max_payload_size: 1)
79
+ ...
80
+ # to close the instance is not necessary in this case since metrics are flushed on submission
81
+ # but it is still a good practice and it explicitely closes the socket
82
+ statsd.close()
83
+ ```
84
+
57
85
  ### v5.x Common Pitfalls
58
86
 
59
87
  Version v5.x of `dogstatsd-ruby` is using a companion thread for preemptive flushing, it brings better performances for application having a high-throughput of statsd metrics, but it comes with new pitfalls:
@@ -65,7 +93,18 @@ If you are using [Sidekiq](https://github.com/mperham/sidekiq), please make sure
65
93
 
66
94
  If you are using [Puma](https://github.com/puma/puma) or [Unicorn](https://yhbt.net/unicorn.git), please make sure to create the instance of DogStatsD in the workers, not in the main process before it forks to create its workers. See [this comment for more details](https://github.com/DataDog/dogstatsd-ruby/issues/179#issuecomment-845570345).
67
95
 
68
- Applications that are in these situations and can't apply these recommendations should pin dogstatsd-ruby v4.x using `gem 'dogstatsd-ruby', '~> 4.0'`. Note that v4.x will continue to be maintained until a future v5.x version can more easily fit these use cases.
96
+ Applications that are in these situations but can't apply these recommendations should enable the `single_thread` mode which does not use a companion thread. Here is how to instantiate a client in this mode:
97
+
98
+ ```ruby
99
+ # Import the library
100
+ require 'datadog/statsd'
101
+
102
+ # Create a DogStatsD client instance.
103
+ statsd = Datadog::Statsd.new('localhost', 8125, single_thread: true)
104
+ ...
105
+ # release resources used by the client instance and flush last metrics
106
+ statsd.close()
107
+ ```
69
108
 
70
109
  ### Origin detection over UDP
71
110
 
@@ -122,7 +161,7 @@ statsd = Datadog::Statsd.new('localhost', 8125, buffer_max_payload_size: 4096)
122
161
 
123
162
  On versions greater than 5.0, we changed the threading model of the library so that one instance of `Datadog::Statsd` could be shared between threads and so that the writes in the socket are non blocking.
124
163
 
125
- When you instantiate a `Datadog::Statsd`, a companion thread is spawned. This thread will be called the Sender thread, as it is modeled by the [Sender](../lib/datadog/statsd/sender.rb) class.
164
+ When you instantiate a `Datadog::Statsd`, a companion thread is spawned. This thread will be called the Sender thread, as it is modeled by the [Sender](../lib/datadog/statsd/sender.rb) class. Please use `single_thread: true` while creating an instance if you don't want to or can't use a companion thread.
126
165
 
127
166
  This thread is stopped when you close the statsd client (`Datadog::Statsd#close`). It also means that allocating a lot of statsd clients without closing them properly when not used anymore
128
167
  could lead to a thread leak (even though they will be sleeping, blocked on IO).
@@ -8,6 +8,7 @@ require_relative 'statsd/uds_connection'
8
8
  require_relative 'statsd/message_buffer'
9
9
  require_relative 'statsd/serialization'
10
10
  require_relative 'statsd/sender'
11
+ require_relative 'statsd/single_thread_sender'
11
12
  require_relative 'statsd/forwarder'
12
13
 
13
14
  # = Datadog::Statsd: A DogStatsd client (https://www.datadoghq.com)
@@ -70,6 +71,7 @@ module Datadog
70
71
  # @option [Integer] buffer_max_pool_size max messages to buffer
71
72
  # @option [String] socket_path unix socket path
72
73
  # @option [Float] default sample rate if not overridden
74
+ # @option [Boolean] single_thread flushes the metrics on the main thread instead of in a companion thread
73
75
  def initialize(
74
76
  host = nil,
75
77
  port = nil,
@@ -85,6 +87,8 @@ module Datadog
85
87
 
86
88
  logger: nil,
87
89
 
90
+ single_thread: false,
91
+
88
92
  telemetry_enable: true,
89
93
  telemetry_flush_interval: DEFAULT_TELEMETRY_FLUSH_INTERVAL
90
94
  )
@@ -105,6 +109,8 @@ module Datadog
105
109
  global_tags: tags,
106
110
  logger: logger,
107
111
 
112
+ single_thread: single_thread,
113
+
108
114
  buffer_max_payload_size: buffer_max_payload_size,
109
115
  buffer_max_pool_size: buffer_max_pool_size,
110
116
  buffer_overflowing_stategy: buffer_overflowing_stategy,
@@ -18,6 +18,8 @@ module Datadog
18
18
  telemetry_flush_interval: nil,
19
19
  global_tags: [],
20
20
 
21
+ single_thread: false,
22
+
21
23
  logger: nil
22
24
  )
23
25
  @transport_type = socket_path.nil? ? :udp : :uds
@@ -53,7 +55,7 @@ module Datadog
53
55
  overflowing_stategy: buffer_overflowing_stategy,
54
56
  )
55
57
 
56
- @sender = Sender.new(buffer)
58
+ @sender = single_thread ? SingleThreadSender.new(buffer) : Sender.new(buffer)
57
59
  @sender.start
58
60
  end
59
61
 
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ class Statsd
5
+ class SingleThreadSender
6
+ def initialize(message_buffer)
7
+ @message_buffer = message_buffer
8
+ end
9
+
10
+ def add(message)
11
+ @message_buffer.add(message)
12
+ end
13
+
14
+ def flush(*)
15
+ @message_buffer.flush()
16
+ end
17
+
18
+ # Compatibility with `Sender`
19
+ def start()
20
+ end
21
+
22
+ # Compatibility with `Sender`
23
+ def stop()
24
+ end
25
+
26
+ # Compatibility with `Sender`
27
+ def rendez_vous()
28
+ end
29
+ end
30
+ end
31
+ end
@@ -4,6 +4,6 @@ require_relative 'connection'
4
4
 
5
5
  module Datadog
6
6
  class Statsd
7
- VERSION = '5.1.0'
7
+ VERSION = '5.2.0'
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dogstatsd-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rein Henrichs
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-06-17 00:00:00.000000000 Z
12
+ date: 2021-07-01 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A Ruby DogStatsd client
15
15
  email: code@datadoghq.com
@@ -32,6 +32,7 @@ files:
32
32
  - lib/datadog/statsd/serialization/service_check_serializer.rb
33
33
  - lib/datadog/statsd/serialization/stat_serializer.rb
34
34
  - lib/datadog/statsd/serialization/tag_serializer.rb
35
+ - lib/datadog/statsd/single_thread_sender.rb
35
36
  - lib/datadog/statsd/telemetry.rb
36
37
  - lib/datadog/statsd/udp_connection.rb
37
38
  - lib/datadog/statsd/uds_connection.rb
@@ -41,9 +42,9 @@ licenses:
41
42
  - MIT
42
43
  metadata:
43
44
  bug_tracker_uri: https://github.com/DataDog/dogstatsd-ruby/issues
44
- changelog_uri: https://github.com/DataDog/dogstatsd-ruby/blob/v5.1.0/CHANGELOG.md
45
- documentation_uri: https://www.rubydoc.info/gems/dogstatsd-ruby/5.1.0
46
- source_code_uri: https://github.com/DataDog/dogstatsd-ruby/tree/v5.1.0
45
+ changelog_uri: https://github.com/DataDog/dogstatsd-ruby/blob/v5.2.0/CHANGELOG.md
46
+ documentation_uri: https://www.rubydoc.info/gems/dogstatsd-ruby/5.2.0
47
+ source_code_uri: https://github.com/DataDog/dogstatsd-ruby/tree/v5.2.0
47
48
  post_install_message:
48
49
  rdoc_options: []
49
50
  require_paths: