puma-plugin-statsd 1.2.1 → 2.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb512a32b788a2df3fc7f9f222e7dcb510fdbda09bb1bb278466978d2f5b511d
4
- data.tar.gz: 6274f07b78d32a6bddbc5d6d823114f6171df7fb3131186e35fbdd9416244ce1
3
+ metadata.gz: 359b3281a2ce1173373bba01c4ca0981772d63af2719daead709efb87b0f19bd
4
+ data.tar.gz: 2b11561ad00b73a80c8cea674fad5bce390a9e384169f68bb77f0445b006d8b0
5
5
  SHA512:
6
- metadata.gz: c568951db0c140e934d4cd40103c8b98160da02aeeda6b2549dd59a415ee2ee59ea171f6d818150fdbb66c99b88a912690c31f9bc3bc0715dc7478440136e76a
7
- data.tar.gz: 2af0724eb7a83bae47caed6c3009a5fa5ed2d0ab98b2c98be250c03636750bdf48788f69fe8bd04fb83a7656fb15174ab356edd0581eed072e780b4fa0855aa8
6
+ metadata.gz: 8c5da2367dfa0d796258d9d8ecda4a70d4225946669e4ad30aefd4196c86f3b03f3fd99894dc5cbc55afede49b2559bbaac5217f4b9b97622ab0c4105dd0d5f5
7
+ data.tar.gz: be824e394c2b04ad4f6e80a32db242e2a3e74db512b8ec3720a41a1e3ba1ca45dd2e0221a951b71f8c6e2c8a90e2fc03b63dd865e0f63978c5f1b4eb9ff816b1
data/CHANGELOG.md CHANGED
@@ -1,12 +1,26 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.2.0 2022-07-31
4
+
5
+ * Support communicating with the Datadog agent via a UNIX socket (set STATSD_SOCKET_PATH env var) (PR #[38](https://github.com/yob/puma-plugin-statsd/pull/38))
6
+
7
+ ## 2.1.0 2021-12-04
8
+
9
+ * Adds support for Datadog unified service tagging (env, service, version) (PR #[37](https://github.com/yob/puma-plugin-statsd/pull/37))
10
+
11
+ ## 2.0.0 2021-07-27
12
+
13
+ * Require puma 5 or better
14
+ * Split DD_TAGS environment variable by commas or spaces (PR #[31](https://github.com/yob/puma-plugin-statsd/pull/31))
15
+ * Gracefully handle unexpected errors when submitting to statsd (like DNS resolution failures) (PR #[35](https://github.com/yob/puma-plugin-statsd/pull/35))
16
+
3
17
  ## 1.2.1 2021-01-11
4
18
 
5
19
  * Remove json from the gemspec
6
20
 
7
21
  ## 1.2.0 2021-01-07
8
22
 
9
- * New metrics: old_workers (PR #[21](https://github.com/yob/puma-plugin-statsd/pull/21)) and requsts_count (PR #[28](https://github.com/yob/puma-plugin-statsd/pull/28))
23
+ * New metrics: old_workers (PR #[21](https://github.com/yob/puma-plugin-statsd/pull/21)) and requests_count (PR #[28](https://github.com/yob/puma-plugin-statsd/pull/28))
10
24
  * Require json at runtime to be extra sure we don't load the wrong version before bundler has initialised the LOAD_PATH
11
25
 
12
26
  ## 1.1.0 2021-01-03
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Puma Statsd Plugin
2
2
 
3
- [Puma][puma] integration with [statsd](statsd) for easy tracking of key metrics
3
+ [Puma][puma] integration with [statsd][statsd] for easy tracking of key metrics
4
4
  that puma can provide:
5
5
 
6
6
  * puma.workers
@@ -9,6 +9,8 @@ that puma can provide:
9
9
  * puma.backlog
10
10
  * puma.pool_capacity
11
11
  * puma.max_threads
12
+ * puma.old_workers
13
+ * puma.requests_count
12
14
 
13
15
  [puma]: https://github.com/puma/puma
14
16
  [statsd]: https://github.com/etsy/statsd
@@ -108,9 +110,17 @@ https://github.com/yob/puma-plugin-statsd.
108
110
 
109
111
  ## Testing the data being sent to statsd
110
112
 
111
- Start a pretend statsd server that listens for UDP packets on port 8125:
113
+ Start a pretend statsd server that listens for UDP packets on port 8125.
112
114
 
113
- ruby devtools/statsd-to-stdout.rb
115
+ If you've installed the gem in your app:
116
+
117
+ # only need to install the binstub once
118
+ bundle binstubs puma-plugin-statsd
119
+ ./bin/statsd-to-stdout
120
+
121
+ If you are developing/testing this gem locally:
122
+
123
+ ./bin/statsd-to-stdout
114
124
 
115
125
  Start puma:
116
126
 
@@ -0,0 +1,15 @@
1
+ #! /usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ RECV_BUFFER = 64*1024
5
+
6
+ require 'socket'
7
+ server = UDPSocket.new
8
+ host, port = "127.0.0.1", 8125
9
+ server.bind(host, port)
10
+
11
+ while true
12
+ text, sender = server.recvfrom(RECV_BUFFER)
13
+ remote_host = sender[3]
14
+ STDOUT.puts "#{remote_host}:" + text
15
+ end
@@ -13,14 +13,21 @@ class StatsdConnector
13
13
  def initialize
14
14
  @host = ENV.fetch(ENV_NAME, "127.0.0.1")
15
15
  @port = ENV.fetch("STATSD_PORT", 8125)
16
+ @socket_path = ENV.fetch("STATSD_SOCKET_PATH", nil)
16
17
  end
17
18
 
18
19
  def send(metric_name:, value:, type:, tags: nil)
19
20
  data = "#{metric_name}:#{value}|#{STATSD_TYPES.fetch(type)}"
20
21
  data = "#{data}|##{tags}" unless tags.nil?
21
22
 
22
- socket = UDPSocket.new
23
- socket.send(data, 0, host, port)
23
+ if @socket_path
24
+ socket = Socket.new(Socket::AF_UNIX, Socket::SOCK_DGRAM)
25
+ socket.connect(Socket.pack_sockaddr_un(@socket_path))
26
+ socket.sendmsg_nonblock(data)
27
+ else
28
+ socket = UDPSocket.new
29
+ socket.send(data, 0, host, port)
30
+ end
24
31
  ensure
25
32
  socket.close
26
33
  end
@@ -112,18 +119,6 @@ Puma::Plugin.create do
112
119
  in_background(&method(:stats_loop))
113
120
  end
114
121
 
115
- if Puma.respond_to?(:stats_hash)
116
- def fetch_stats
117
- Puma.stats_hash
118
- end
119
- else
120
- def fetch_stats
121
- require "json"
122
- stats = Puma.stats
123
- JSON.parse(stats, symbolize_names: true)
124
- end
125
- end
126
-
127
122
  def environment_variable_tags
128
123
  # Tags are separated by spaces, and while they are normally a tag and
129
124
  # value separated by a ':', they can also just be tagged without any
@@ -147,11 +142,27 @@ Puma::Plugin.create do
147
142
  # https://docs.datadoghq.com/agent/docker/?tab=standard#global-options
148
143
  #
149
144
  if ENV.has_key?("DD_TAGS")
150
- ENV["DD_TAGS"].split(/\s+/).each do |t|
145
+ ENV["DD_TAGS"].split(/\s+|,/).each do |t|
151
146
  tags << t
152
147
  end
153
148
  end
154
149
 
150
+ # Support the Unified Service Tagging from Datadog, so that we can share
151
+ # the metric tags with the application running
152
+ #
153
+ # https://docs.datadoghq.com/getting_started/tagging/unified_service_tagging
154
+ if ENV.has_key?("DD_ENV")
155
+ tags << "env:#{ENV["DD_ENV"]}"
156
+ end
157
+
158
+ if ENV.has_key?("DD_SERVICE")
159
+ tags << "service:#{ENV["DD_SERVICE"]}"
160
+ end
161
+
162
+ if ENV.has_key?("DD_VERSION")
163
+ tags << "version:#{ENV["DD_VERSION"]}"
164
+ end
165
+
155
166
  # Return nil if we have no environment variable tags. This way we don't
156
167
  # send an unnecessary '|' on the end of each stat
157
168
  return nil if tags.empty?
@@ -171,7 +182,7 @@ Puma::Plugin.create do
171
182
  loop do
172
183
  @launcher.events.debug "statsd: notify statsd"
173
184
  begin
174
- stats = ::PumaStats.new(fetch_stats)
185
+ stats = ::PumaStats.new(Puma.stats_hash)
175
186
  @statsd.send(metric_name: prefixed_metric_name("puma.workers"), value: stats.workers, type: :gauge, tags: tags)
176
187
  @statsd.send(metric_name: prefixed_metric_name("puma.booted_workers"), value: stats.booted_workers, type: :gauge, tags: tags)
177
188
  @statsd.send(metric_name: prefixed_metric_name("puma.old_workers"), value: stats.old_workers, type: :gauge, tags: tags)
@@ -181,7 +192,7 @@ Puma::Plugin.create do
181
192
  @statsd.send(metric_name: prefixed_metric_name("puma.max_threads"), value: stats.max_threads, type: :gauge, tags: tags)
182
193
  @statsd.send(metric_name: prefixed_metric_name("puma.requests_count"), value: stats.requests_count, type: :gauge, tags: tags)
183
194
  rescue StandardError => e
184
- @launcher.events.error "! statsd: notify stats failed:\n #{e.to_s}\n #{e.backtrace.join("\n ")}"
195
+ @launcher.events.unknown_error e, nil, "! statsd: notify stats failed"
185
196
  ensure
186
197
  sleep 2
187
198
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puma-plugin-statsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Healy
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-11 00:00:00.000000000 Z
11
+ date: 2022-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: puma
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.12'
19
+ version: '5.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '6'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '3.12'
29
+ version: '5.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '6'
@@ -100,21 +100,23 @@ dependencies:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
- description:
103
+ description:
104
104
  email: james@yob.id.au
105
- executables: []
105
+ executables:
106
+ - statsd-to-stdout
106
107
  extensions: []
107
108
  extra_rdoc_files: []
108
109
  files:
109
110
  - CHANGELOG.md
110
111
  - MIT-LICENSE
111
112
  - README.md
113
+ - bin/statsd-to-stdout
112
114
  - lib/puma/plugin/statsd.rb
113
115
  homepage: https://github.com/yob/puma-plugin-statsd
114
116
  licenses:
115
117
  - MIT
116
118
  metadata: {}
117
- post_install_message:
119
+ post_install_message:
118
120
  rdoc_options: []
119
121
  require_paths:
120
122
  - lib
@@ -129,8 +131,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
131
  - !ruby/object:Gem::Version
130
132
  version: '0'
131
133
  requirements: []
132
- rubygems_version: 3.0.3
133
- signing_key:
134
+ rubygems_version: 3.3.7
135
+ signing_key:
134
136
  specification_version: 4
135
137
  summary: Send puma metrics to statsd via a background thread
136
138
  test_files: []