statsdserver 0.8 → 0.11
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.
- data/bin/statsd +1 -1
- data/lib/statsdserver.rb +38 -12
- data/lib/statsdserver/proto/v1.rb +17 -6
- data/lib/statsdserver/stats.rb +2 -0
- metadata +107 -147
data/bin/statsd
CHANGED
@@ -30,7 +30,7 @@ end
|
|
30
30
|
|
31
31
|
config = {}
|
32
32
|
%w(daemonize inputs flush_interval outputs prefix percentile
|
33
|
-
suffix preserve_counters).each do |key|
|
33
|
+
suffix preserve_counters timer_names_before_suffix).each do |key|
|
34
34
|
config[key.to_sym] = config_file[key] if config_file[key]
|
35
35
|
end
|
36
36
|
|
data/lib/statsdserver.rb
CHANGED
@@ -29,6 +29,7 @@ class StatsdServer
|
|
29
29
|
:flush_interval => 30,
|
30
30
|
:prefix => "stats",
|
31
31
|
:preserve_counters => "true",
|
32
|
+
:timer_names_before_suffix => "true",
|
32
33
|
}.merge(opts)
|
33
34
|
@input_config = input_config
|
34
35
|
@output_config = output_config
|
@@ -165,11 +166,18 @@ class StatsdServer
|
|
165
166
|
now = Time.now.to_i
|
166
167
|
|
167
168
|
timers = {}
|
169
|
+
gauges = {}
|
170
|
+
counters = {}
|
171
|
+
|
168
172
|
@stats.timers.keys.each do |k|
|
169
173
|
timers[k] = @stats.timers.delete(k)
|
170
174
|
end
|
171
175
|
|
172
|
-
|
176
|
+
@stats.gauges.keys.each do |k|
|
177
|
+
#gauges[k] = @stats.gauges.delete(k)
|
178
|
+
gauges[k] = stats.gauges[k]
|
179
|
+
end
|
180
|
+
|
173
181
|
@stats.counters.keys.each do |k|
|
174
182
|
counters[k] = @stats.counters.delete(k)
|
175
183
|
end
|
@@ -184,17 +192,29 @@ class StatsdServer
|
|
184
192
|
timers.each do |key, values|
|
185
193
|
next if values.length == 0
|
186
194
|
summary = ::StatsdServer::Math.summarize(values, @opts)
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
195
|
+
if @opts[:timer_names_before_suffix] == "true"
|
196
|
+
updates << [metric_name("timers.#{key}.mean"),
|
197
|
+
summary[:mean], now].join(" ")
|
198
|
+
updates << [metric_name("timers.#{key}.upper"),
|
199
|
+
summary[:max], now].join(" ")
|
200
|
+
updates << [metric_name("timers.#{key}.lower"),
|
201
|
+
summary[:min], now].join(" ")
|
202
|
+
updates << [metric_name("timers.#{key}.count"),
|
203
|
+
values.length, now].join(" ")
|
204
|
+
updates << [metric_name("timers.#{key}.upper_#{@opts[:percentile].to_i}"),
|
205
|
+
summary[:max_at_threshold], now].join(" ")
|
206
|
+
else
|
207
|
+
updates << [metric_name("timers.#{key}") + ".mean",
|
208
|
+
summary[:mean], now].join(" ")
|
209
|
+
updates << [metric_name("timers.#{key}") + ".upper",
|
210
|
+
summary[:max], now].join(" ")
|
211
|
+
updates << [metric_name("timers.#{key}") + ".lower",
|
212
|
+
summary[:min], now].join(" ")
|
213
|
+
updates << [metric_name("timers.#{key}") + ".count",
|
214
|
+
values.length, now].join(" ")
|
215
|
+
updates << [metric_name("timers.#{key}") + ".upper_#{@opts[:percentile].to_i}",
|
216
|
+
summary[:max_at_threshold], now].join(" ")
|
217
|
+
end
|
198
218
|
end # timers.each
|
199
219
|
|
200
220
|
counters.each do |key, value|
|
@@ -203,6 +223,12 @@ class StatsdServer
|
|
203
223
|
now].join(" ")
|
204
224
|
end # counters.each
|
205
225
|
|
226
|
+
gauges.each do |key, value|
|
227
|
+
updates << [metric_name(key),
|
228
|
+
value,
|
229
|
+
now].join(" ")
|
230
|
+
end # gauges.each
|
231
|
+
|
206
232
|
return updates.length == 0 ? nil : updates.join("\n") + "\n"
|
207
233
|
end # def carbon_update_str
|
208
234
|
|
@@ -25,23 +25,25 @@ class StatsdServer
|
|
25
25
|
if fields[1] == "ms" or fields[1] == "t" # timer update
|
26
26
|
if fields[0].index(",")
|
27
27
|
fields[0].split(",").each do |value_str|
|
28
|
-
value =
|
28
|
+
value = Float(value_str) rescue nil
|
29
29
|
stats.timers[key] << value if value
|
30
30
|
end
|
31
31
|
else
|
32
|
-
value =
|
32
|
+
value = Float(fields[0]) rescue nil
|
33
33
|
if value.nil?
|
34
|
-
raise ParseError, "invalid timer value: #{fields[0]}"
|
34
|
+
raise ParseError, "invalid timer value for #{key}: #{fields[0]}"
|
35
35
|
end
|
36
|
-
stats.timers[key] <<
|
36
|
+
stats.timers[key] << value
|
37
37
|
end
|
38
|
+
|
38
39
|
elsif fields[1] == "c" # counter update
|
39
40
|
count_str, sample_rate_str = fields[0].split("@", 2)
|
40
41
|
|
41
42
|
if sample_rate_str
|
42
43
|
sample_rate = Float(sample_rate_str) rescue nil
|
43
44
|
if sample_rate.nil?
|
44
|
-
raise ParseError, "invalid sample_rate
|
45
|
+
raise ParseError, "invalid sample_rate for #{key}: " +
|
46
|
+
"#{sample_rate_str}"
|
45
47
|
end
|
46
48
|
else
|
47
49
|
sample_rate = 1
|
@@ -49,10 +51,19 @@ class StatsdServer
|
|
49
51
|
|
50
52
|
count = Integer(count_str) rescue nil
|
51
53
|
if count.nil?
|
52
|
-
raise ParseError, "invalid count: #{count_str}"
|
54
|
+
raise ParseError, "invalid count for #{key}: #{count_str}"
|
53
55
|
end
|
54
56
|
|
55
57
|
stats.counters[key] += count.to_i * (1 / sample_rate.to_f)
|
58
|
+
|
59
|
+
elsif fields[1] == "g" # gauge update
|
60
|
+
value = Float(fields[0]) rescue nil
|
61
|
+
if value.nil?
|
62
|
+
raise ParseError, "invalid gauge value for #{key}: #{fields[0]}"
|
63
|
+
end
|
64
|
+
|
65
|
+
stats.gauges[key] = value
|
66
|
+
|
56
67
|
else
|
57
68
|
raise ParseError,
|
58
69
|
"invalid update: #{update}: unknown type #{fields[1]}"
|
data/lib/statsdserver/stats.rb
CHANGED
@@ -4,12 +4,14 @@ class StatsdServer
|
|
4
4
|
class Stats
|
5
5
|
attr_accessor :counters,
|
6
6
|
:timers,
|
7
|
+
:gauges,
|
7
8
|
:logger
|
8
9
|
|
9
10
|
public
|
10
11
|
def initialize
|
11
12
|
@timers = Hash.new { |h, k| h[k] = Array.new }
|
12
13
|
@counters = Hash.new { |h, k| h[k] = 0 }
|
14
|
+
@gauges = Hash.new { |h, k| h[k] = 0 }
|
13
15
|
@logger = Logger.new(STDERR)
|
14
16
|
end
|
15
17
|
end # class Stats
|
metadata
CHANGED
@@ -1,186 +1,146 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: statsdserver
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 11
|
9
|
+
version: "0.11"
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- Pete Fritchman
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
date: 2013-02-25 00:00:00 -05:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: bundler
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: rspec
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
38
|
-
type: :development
|
39
22
|
prerelease: false
|
40
|
-
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
54
32
|
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: daemons
|
55
36
|
prerelease: false
|
56
|
-
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ! '>='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
70
46
|
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: eventmachine
|
71
50
|
prerelease: false
|
72
|
-
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ! '>='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '0'
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
86
60
|
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: parseconfig
|
87
64
|
prerelease: false
|
88
|
-
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ! '>='
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '0'
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
102
74
|
type: :runtime
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: sysexits
|
103
78
|
prerelease: false
|
104
|
-
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: em-zeromq
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: '0'
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ! '>='
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: '0'
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
type: :runtime
|
89
|
+
version_requirements: *id005
|
142
90
|
description: collect and aggregate stats, flush to graphite
|
143
91
|
email: petef@databits.net
|
144
|
-
executables:
|
92
|
+
executables:
|
145
93
|
- statsd
|
146
94
|
extensions: []
|
95
|
+
|
147
96
|
extra_rdoc_files: []
|
148
|
-
|
149
|
-
|
150
|
-
- lib/statsdserver
|
97
|
+
|
98
|
+
files:
|
99
|
+
- lib/statsdserver.rb
|
151
100
|
- lib/statsdserver/input/zeromq.rb
|
152
|
-
- lib/statsdserver/
|
153
|
-
- lib/statsdserver/output/tcp.rb
|
154
|
-
- lib/statsdserver/output/amqp.rb
|
155
|
-
- lib/statsdserver/stats.rb
|
101
|
+
- lib/statsdserver/input/udp.rb
|
156
102
|
- lib/statsdserver/proto/parseerror.rb
|
157
103
|
- lib/statsdserver/proto/v1.rb
|
158
|
-
- lib/statsdserver.rb
|
104
|
+
- lib/statsdserver/stats.rb
|
105
|
+
- lib/statsdserver/math.rb
|
106
|
+
- lib/statsdserver/output/amqp.rb
|
107
|
+
- lib/statsdserver/output/stdout.rb
|
108
|
+
- lib/statsdserver/output/tcp.rb
|
159
109
|
- bin/statsd
|
160
|
-
|
161
|
-
|
110
|
+
has_rdoc: true
|
111
|
+
homepage: https://github.com/fetep/ruby-statsdserver
|
112
|
+
licenses:
|
162
113
|
- Apache License 2.0
|
163
114
|
post_install_message:
|
164
115
|
rdoc_options: []
|
165
|
-
|
116
|
+
|
117
|
+
require_paths:
|
166
118
|
- lib
|
167
119
|
- lib
|
168
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
169
121
|
none: false
|
170
|
-
requirements:
|
171
|
-
- -
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
|
174
|
-
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
hash: 3
|
126
|
+
segments:
|
127
|
+
- 0
|
128
|
+
version: "0"
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
130
|
none: false
|
176
|
-
requirements:
|
177
|
-
- -
|
178
|
-
- !ruby/object:Gem::Version
|
179
|
-
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
hash: 3
|
135
|
+
segments:
|
136
|
+
- 0
|
137
|
+
version: "0"
|
180
138
|
requirements: []
|
139
|
+
|
181
140
|
rubyforge_project:
|
182
|
-
rubygems_version: 1.
|
141
|
+
rubygems_version: 1.6.0
|
183
142
|
signing_key:
|
184
143
|
specification_version: 3
|
185
144
|
summary: statsd (server) -- stat collector/aggregator
|
186
145
|
test_files: []
|
146
|
+
|