puma-plugin-statsd 1.0.0 → 2.0.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: 61b91a8a6e85cc308cb83a047ddbf958a2529363433689f3b7a407658982c9aa
4
- data.tar.gz: d62ab03d1fe3c20dc13a395ba84fa5fe035183f17dec401a85217a20221a43b5
3
+ metadata.gz: 1ac5651e242dcf306ed0c5964de2c7178a142e9555333cfd203e043dada926a6
4
+ data.tar.gz: 9cc7a3b70cdcda54a824ca4d9b65714c16f7b20834bb348182eb787820b5e5e1
5
5
  SHA512:
6
- metadata.gz: '09e931680b3c4280e1764fc9738ab69e7b0af6c0705eb02d52edc6ba9df69d227293075d77abbedb8e794337e99ae3d048abe8f76413ec9ed02a7c526494fe3c'
7
- data.tar.gz: 6eb107be17c9b457dc0c7bb900867dab42dcd50fd49e27df919e6268e648a6a0c858a422f9545d9280e001f825db0ceb0eae4a333b705adc5ccb5b3c25f4b0e8
6
+ metadata.gz: 1222d6580444972583bec535348958301a8c5aa4860d08e87bb1e735fc09d9b2764a38b4c3b9aa355878b9080ca30ef80b413c55c0f8f4b97edf750515162a89
7
+ data.tar.gz: 07e8987c8ce8f8f3db573241f824c80224aec9ffa2f5b1e8bbd474105981d6529c0c1a4a870995622f62c9edad1181aaced6c3382b8746aebf9149f51d0842c9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.0.0 2021-07-27
4
+
5
+ * Require puma 5 or better
6
+ * Split DD_TAGS environment variable by commas or spaces (PR #[31](https://github.com/yob/puma-plugin-statsd/pull/31))
7
+ * Gracefully handle unexpecte errors when submitting to statsd (like DNS resolution failures) (PR #[35](https://github.com/yob/puma-plugin-statsd/pull/35))
8
+
9
+ ## 1.2.1 2021-01-11
10
+
11
+ * Remove json from the gemspec
12
+
13
+ ## 1.2.0 2021-01-07
14
+
15
+ * 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))
16
+ * Require json at runtime to be extra sure we don't load the wrong version before bundler has initialised the LOAD_PATH
17
+
18
+ ## 1.1.0 2021-01-03
19
+
20
+ * Assume localhost for statsd host (PR #[20](https://github.com/yob/puma-plugin-statsd/pull/20))
21
+
3
22
  ## 1.0.0 2020-11-03
4
23
 
5
24
  * Added option to specify arbitrary datadog tags (PR #[18](https://github.com/yob/puma-plugin-statsd/pull/18))
data/README.md CHANGED
@@ -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
@@ -37,12 +39,14 @@ plugin :statsd
37
39
 
38
40
  ## Usage
39
41
 
40
- Ensure you have an environment variable set that points to a statsd host, then boot your puma app as usual. Optionally you may specify a port (default is 8125).
42
+ By default the plugin assumes statsd is available at 127.0.0.1. If that's true in your environment, just start puma like normal:
41
43
 
42
44
  ```
43
- STATSD_HOST=127.0.0.1 bundle exec puma
45
+ bundle exec puma
44
46
  ```
45
47
 
48
+ If statsd isn't on 127.0.0.1 or the port is non-standard, you can configure them using optional environment variables:
49
+
46
50
  ```
47
51
  STATSD_HOST=127.0.0.1 STATSD_PORT=9125 bundle exec puma
48
52
  ```
@@ -55,7 +59,6 @@ the datadog "dogstatsd" server.
55
59
  Should you be reporting the puma metrics to a dogstatsd server, you can set
56
60
  tags via the following three environment variables.
57
61
 
58
-
59
62
  #### DD_TAGS
60
63
 
61
64
  `DD_TAGS`: Set this to a space-separated list of tags, using the
@@ -107,9 +110,17 @@ https://github.com/yob/puma-plugin-statsd.
107
110
 
108
111
  ## Testing the data being sent to statsd
109
112
 
110
- 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.
114
+
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:
111
122
 
112
- ruby devtools/statsd-to-stdout.rb
123
+ ./bin/statsd-to-stdout
113
124
 
114
125
  Start puma:
115
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
@@ -1,5 +1,4 @@
1
1
  # coding: utf-8, frozen_string_literal: true
2
- require "json"
3
2
  require "puma"
4
3
  require "puma/plugin"
5
4
  require 'socket'
@@ -12,14 +11,10 @@ class StatsdConnector
12
11
  attr_reader :host, :port
13
12
 
14
13
  def initialize
15
- @host = ENV.fetch(ENV_NAME, nil)
14
+ @host = ENV.fetch(ENV_NAME, "127.0.0.1")
16
15
  @port = ENV.fetch("STATSD_PORT", 8125)
17
16
  end
18
17
 
19
- def enabled?
20
- !!host
21
- end
22
-
23
18
  def send(metric_name:, value:, type:, tags: nil)
24
19
  data = "#{metric_name}:#{value}|#{STATSD_TYPES.fetch(type)}"
25
20
  data = "#{data}|##{tags}" unless tags.nil?
@@ -49,6 +44,10 @@ class PumaStats
49
44
  @stats.fetch(:booted_workers, 1)
50
45
  end
51
46
 
47
+ def old_workers
48
+ @stats.fetch(:old_workers, 0)
49
+ end
50
+
52
51
  def running
53
52
  if clustered?
54
53
  @stats[:worker_status].map { |s| s[:last_status].fetch(:running, 0) }.inject(0, &:+)
@@ -80,6 +79,14 @@ class PumaStats
80
79
  @stats.fetch(:max_threads, 0)
81
80
  end
82
81
  end
82
+
83
+ def requests_count
84
+ if clustered?
85
+ @stats[:worker_status].map { |s| s[:last_status].fetch(:requests_count, 0) }.inject(0, &:+)
86
+ else
87
+ @stats.fetch(:requests_count, 0)
88
+ end
89
+ end
83
90
  end
84
91
 
85
92
  Puma::Plugin.create do
@@ -88,19 +95,15 @@ Puma::Plugin.create do
88
95
  @launcher = launcher
89
96
 
90
97
  @statsd = ::StatsdConnector.new
91
- if @statsd.enabled?
92
- @launcher.events.debug "statsd: enabled (host: #{@statsd.host})"
98
+ @launcher.events.debug "statsd: enabled (host: #{@statsd.host})"
93
99
 
94
- # Fetch global metric prefix from env variable
95
- @metric_prefix = ENV.fetch("STATSD_METRIC_PREFIX", nil)
96
- if @metric_prefix && !@metric_prefix.end_with?(::StatsdConnector::METRIC_DELIMETER)
97
- @metric_prefix += ::StatsdConnector::METRIC_DELIMETER
98
- end
99
-
100
- register_hooks
101
- else
102
- @launcher.events.debug "statsd: not enabled (no #{StatsdConnector::ENV_NAME} env var found)"
100
+ # Fetch global metric prefix from env variable
101
+ @metric_prefix = ENV.fetch("STATSD_METRIC_PREFIX", nil)
102
+ if @metric_prefix && !@metric_prefix.end_with?(::StatsdConnector::METRIC_DELIMETER)
103
+ @metric_prefix += ::StatsdConnector::METRIC_DELIMETER
103
104
  end
105
+
106
+ register_hooks
104
107
  end
105
108
 
106
109
  private
@@ -109,17 +112,6 @@ Puma::Plugin.create do
109
112
  in_background(&method(:stats_loop))
110
113
  end
111
114
 
112
- if Puma.respond_to?(:stats_hash)
113
- def fetch_stats
114
- Puma.stats_hash
115
- end
116
- else
117
- def fetch_stats
118
- stats = Puma.stats
119
- JSON.parse(stats, symbolize_names: true)
120
- end
121
- end
122
-
123
115
  def environment_variable_tags
124
116
  # Tags are separated by spaces, and while they are normally a tag and
125
117
  # value separated by a ':', they can also just be tagged without any
@@ -143,7 +135,7 @@ Puma::Plugin.create do
143
135
  # https://docs.datadoghq.com/agent/docker/?tab=standard#global-options
144
136
  #
145
137
  if ENV.has_key?("DD_TAGS")
146
- ENV["DD_TAGS"].split(/\s+/).each do |t|
138
+ ENV["DD_TAGS"].split(/\s+|,/).each do |t|
147
139
  tags << t
148
140
  end
149
141
  end
@@ -167,15 +159,17 @@ Puma::Plugin.create do
167
159
  loop do
168
160
  @launcher.events.debug "statsd: notify statsd"
169
161
  begin
170
- stats = ::PumaStats.new(fetch_stats)
162
+ stats = ::PumaStats.new(Puma.stats_hash)
171
163
  @statsd.send(metric_name: prefixed_metric_name("puma.workers"), value: stats.workers, type: :gauge, tags: tags)
172
164
  @statsd.send(metric_name: prefixed_metric_name("puma.booted_workers"), value: stats.booted_workers, type: :gauge, tags: tags)
165
+ @statsd.send(metric_name: prefixed_metric_name("puma.old_workers"), value: stats.old_workers, type: :gauge, tags: tags)
173
166
  @statsd.send(metric_name: prefixed_metric_name("puma.running"), value: stats.running, type: :gauge, tags: tags)
174
167
  @statsd.send(metric_name: prefixed_metric_name("puma.backlog"), value: stats.backlog, type: :gauge, tags: tags)
175
168
  @statsd.send(metric_name: prefixed_metric_name("puma.pool_capacity"), value: stats.pool_capacity, type: :gauge, tags: tags)
176
169
  @statsd.send(metric_name: prefixed_metric_name("puma.max_threads"), value: stats.max_threads, type: :gauge, tags: tags)
170
+ @statsd.send(metric_name: prefixed_metric_name("puma.requests_count"), value: stats.requests_count, type: :gauge, tags: tags)
177
171
  rescue StandardError => e
178
- @launcher.events.error "! statsd: notify stats failed:\n #{e.to_s}\n #{e.backtrace.join("\n ")}"
172
+ @launcher.events.unknown_error e, nil, "! statsd: notify stats failed"
179
173
  ensure
180
174
  sleep 2
181
175
  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.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Healy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-03 00:00:00.000000000 Z
11
+ date: 2021-07-27 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,24 +26,10 @@ 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'
33
- - !ruby/object:Gem::Dependency
34
- name: json
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: '0'
40
- type: :runtime
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: '0'
47
33
  - !ruby/object:Gem::Dependency
48
34
  name: bundler
49
35
  requirement: !ruby/object:Gem::Requirement
@@ -116,13 +102,15 @@ dependencies:
116
102
  version: '0'
117
103
  description:
118
104
  email: james@yob.id.au
119
- executables: []
105
+ executables:
106
+ - statsd-to-stdout
120
107
  extensions: []
121
108
  extra_rdoc_files: []
122
109
  files:
123
110
  - CHANGELOG.md
124
111
  - MIT-LICENSE
125
112
  - README.md
113
+ - bin/statsd-to-stdout
126
114
  - lib/puma/plugin/statsd.rb
127
115
  homepage: https://github.com/yob/puma-plugin-statsd
128
116
  licenses: