puma-plugin-statsd 1.2.1 → 2.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: 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: []