metriks-opentsdb 1.1.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/metriks-opentsdb.rb +1 -1
- data/lib/metriks/opentsdb_reporter.rb +69 -103
- data/metriks-opentsdb.gemspec +1 -1
- data/spec/opentsdb_spec.rb +58 -28
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d5f830258daa7e1b9e52283f7ed9f0610ace967
|
4
|
+
data.tar.gz: a5d6f6f2fe786eed74d365aa0f6ba80590b38415
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b589f243c7743aefd9e69504829e8e1f60f36aba60b7027843143ea97d36244d0f9eee1a1c28ffb34a807f1851b9f0c5ff4be09913681f8222c95c575e4c11f
|
7
|
+
data.tar.gz: a5577b451589159628fbe9605559499ec7551533733d16a8210171b347c59b88abfcddbb5d63880139acf2a00ce737c222d0a2462d1a8115bf0896e47fe1ff70
|
data/lib/metriks-opentsdb.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'metriks/time_tracker'
|
2
2
|
require 'rest-client'
|
3
|
+
require 'logger'
|
3
4
|
|
4
5
|
module Metriks
|
5
6
|
class OpenTSDBReporter
|
6
|
-
attr_accessor :prefix, :source, :data, :hostname, :tags
|
7
|
+
attr_accessor :prefix, :source, :data, :hostname, :tags, :logger
|
7
8
|
|
8
9
|
def initialize(h, t, options = {})
|
9
10
|
@hostname = h
|
@@ -29,9 +30,9 @@ module Metriks
|
|
29
30
|
@running = false
|
30
31
|
end
|
31
32
|
|
32
|
-
def
|
33
|
+
def log(level, msg)
|
33
34
|
if !@logger.nil?
|
34
|
-
@logger.
|
35
|
+
@logger.send level, msg
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -69,14 +70,11 @@ module Metriks
|
|
69
70
|
def flush
|
70
71
|
begin
|
71
72
|
@mutex.synchronize do
|
72
|
-
|
73
|
+
log "debug", "Flushing metrics"
|
73
74
|
submit get_datapoints
|
74
75
|
end
|
75
76
|
rescue Exception => ex
|
76
|
-
|
77
|
-
@logger.error(ex.message)
|
78
|
-
@logger.error(ex.stacktrace)
|
79
|
-
end
|
77
|
+
log "error",ex.message
|
80
78
|
@on_error[ex] rescue nil
|
81
79
|
end
|
82
80
|
end
|
@@ -87,25 +85,20 @@ module Metriks
|
|
87
85
|
index = 0
|
88
86
|
length = @batch_size
|
89
87
|
while index < datapoints.size
|
90
|
-
info("Starting from #{index}")
|
91
88
|
to_send = nil
|
92
89
|
if datapoints.size < (index + length)
|
93
90
|
length = datapoints.size - index
|
94
91
|
else
|
95
92
|
length = @batch_size
|
96
93
|
end
|
97
|
-
info("Length is #{length}")
|
98
|
-
info("Begin post")
|
99
|
-
info(datapoints[index, length].inspect)
|
100
|
-
info("To Json")
|
101
94
|
jsonstr = datapoints[index, length].to_json
|
102
|
-
info("Send to rest")
|
103
95
|
RestClient.post "#{@hostname}/api/put",
|
104
96
|
jsonstr,
|
105
97
|
:content_type => :json, :accept => :json
|
106
|
-
|
98
|
+
log "debug", "Sent #{length} metrics from #{index}"
|
107
99
|
index += length
|
108
100
|
end
|
101
|
+
log "info", "Sent #{datapoints.size} metrics"
|
109
102
|
end
|
110
103
|
|
111
104
|
def get_datapoints
|
@@ -115,105 +108,78 @@ module Metriks
|
|
115
108
|
@registry.each do |name, metric|
|
116
109
|
next if name.nil? || name.empty?
|
117
110
|
name = name.to_s.gsub(/ +/, '_')
|
111
|
+
if @prefix
|
112
|
+
name = "#{@prefix}.#{name}"
|
113
|
+
end
|
118
114
|
|
119
115
|
case metric
|
120
116
|
when Metriks::Meter
|
121
|
-
datapoints
|
122
|
-
:
|
123
|
-
:
|
124
|
-
|
125
|
-
:tags => @tags
|
126
|
-
}
|
127
|
-
datapoints << {
|
128
|
-
:metric => "#{name}.mean_rate",
|
129
|
-
:timestamp => time,
|
130
|
-
:value => metric.mean_rate,
|
131
|
-
:tags => @tags
|
132
|
-
}
|
133
|
-
datapoints << {
|
134
|
-
:metric => "#{name}.m1",
|
135
|
-
:timestamp => time,
|
136
|
-
:value => metric.one_minute_rate,
|
137
|
-
:tags => @tags
|
138
|
-
}
|
139
|
-
datapoints << {
|
140
|
-
:metric => "#{name}.m5",
|
141
|
-
:timestamp => time,
|
142
|
-
:value => metric.five_minute_rate,
|
143
|
-
:tags => @tags
|
144
|
-
}
|
145
|
-
datapoints << {
|
146
|
-
:metric => "#{name}.m15",
|
147
|
-
:timestamp => time,
|
148
|
-
:value => metric.fifteen_minute_rate,
|
149
|
-
:tags => @tags
|
150
|
-
}
|
117
|
+
datapoints |= create_datapoints name, metric, time, [
|
118
|
+
:count, :one_minute_rate, :five_minute_rate,
|
119
|
+
:fifteen_minute_rate, :mean_rate
|
120
|
+
]
|
151
121
|
when Metriks::Counter
|
152
|
-
datapoints
|
153
|
-
:
|
154
|
-
|
155
|
-
:value => metric.count,
|
156
|
-
:tags => @tags
|
157
|
-
}
|
122
|
+
datapoints |= create_datapoints name, metric, time, [
|
123
|
+
:count
|
124
|
+
]
|
158
125
|
when Metriks::Gauge
|
126
|
+
datapoints |= create_datapoints name, metric, time, [
|
127
|
+
:value
|
128
|
+
]
|
129
|
+
when Metriks::UtilizationTimer
|
130
|
+
datapoints |= create_datapoints name, metric, time, [
|
131
|
+
:count, :one_minute_rate, :five_minute_rate,
|
132
|
+
:fifteen_minute_rate, :mean_rate,
|
133
|
+
:min, :max, :mean, :stddev,
|
134
|
+
:one_minute_utilization, :five_minute_utilization,
|
135
|
+
:fifteen_minute_utilization, :mean_utilization,
|
136
|
+
], [
|
137
|
+
:median, :get_95th_percentile
|
138
|
+
]
|
139
|
+
|
140
|
+
when Metriks::Timer
|
141
|
+
datapoints |= create_datapoints name, metric, time, [
|
142
|
+
:count, :one_minute_rate, :five_minute_rate,
|
143
|
+
:fifteen_minute_rate, :mean_rate,
|
144
|
+
:min, :max, :mean, :stddev
|
145
|
+
], [
|
146
|
+
:median, :get_95th_percentile
|
147
|
+
]
|
148
|
+
when Metriks::Histogram
|
149
|
+
datapoints |= create_datapoints name, metric, time, [
|
150
|
+
:count, :min, :max, :mean, :stddev
|
151
|
+
], [
|
152
|
+
:median, :get_95th_percentile
|
153
|
+
]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
datapoints
|
157
|
+
end
|
158
|
+
|
159
|
+
def create_datapoints(base_name, metric, time, keys, snapshot_keys = [])
|
160
|
+
datapoints = []
|
161
|
+
keys.flatten.each do |key|
|
162
|
+
name = key.to_s.gsub(/^get_/, '')
|
163
|
+
datapoints << {
|
164
|
+
:metric => "#{base_name}.#{name}",
|
165
|
+
:timestamp => time,
|
166
|
+
:value => metric.send(key),
|
167
|
+
:tags => @tags
|
168
|
+
}
|
169
|
+
end
|
170
|
+
|
171
|
+
unless snapshot_keys.empty?
|
172
|
+
snapshot = metric.snapshot
|
173
|
+
snapshot_keys.flatten.each do |key|
|
174
|
+
name = key.to_s.gsub(/^get_/, '')
|
159
175
|
datapoints << {
|
160
|
-
:metric => name,
|
161
|
-
:timestamp => time,
|
162
|
-
:value => metric.value,
|
163
|
-
:tags => @tags
|
164
|
-
}
|
165
|
-
when Metriks::Histogram, Metriks::Timer, Metriks::UtilizationTimer
|
166
|
-
datapoints << {
|
167
|
-
:metric => "#{name}.count",
|
168
|
-
:timestamp => time,
|
169
|
-
:value => metric.count,
|
170
|
-
:tags => @tags
|
171
|
-
}
|
172
|
-
if Metriks::UtilizationTimer === metric || Metriks::Timer === metric
|
173
|
-
datapoints << {
|
174
|
-
:metric => "#{name}.mean_rate",
|
175
|
-
:timestamp => time,
|
176
|
-
:value => metric.mean_rate,
|
177
|
-
:tags => @tags
|
178
|
-
}
|
179
|
-
datapoints << {
|
180
|
-
:metric => "#{name}.m1",
|
181
|
-
:timestamp => time,
|
182
|
-
:value => metric.one_minute_rate,
|
183
|
-
:tags => @tags
|
184
|
-
}
|
185
|
-
datapoints << {
|
186
|
-
:metric => "#{name}.m5",
|
187
|
-
:timestamp => time,
|
188
|
-
:value => metric.five_minute_rate,
|
189
|
-
:tags => @tags
|
190
|
-
}
|
191
|
-
datapoints << {
|
192
|
-
:metric => "#{name}.m15",
|
193
|
-
:timestamp => time,
|
194
|
-
:value => metric.fifteen_minute_rate,
|
195
|
-
:tags => @tags
|
196
|
-
}
|
197
|
-
end
|
198
|
-
snapshot = metric.snapshot
|
199
|
-
datapoints << {
|
200
|
-
:metric => "#{name}.median",
|
176
|
+
:metric => "#{base_name}.#{name}",
|
201
177
|
:timestamp => time,
|
202
|
-
:value => snapshot.
|
178
|
+
:value => snapshot.send(key),
|
203
179
|
:tags => @tags
|
204
180
|
}
|
205
|
-
|
206
|
-
@percentiles.each do |percentile|
|
207
|
-
datapoints << {
|
208
|
-
:metric => "#{name}.p#{(percentile * 100).to_i}",
|
209
|
-
:timestamp => time,
|
210
|
-
:value => snapshot.value(percentile),
|
211
|
-
:tags => @tags
|
212
|
-
}
|
213
|
-
end
|
214
181
|
end
|
215
182
|
end
|
216
|
-
info("Captured #{datapoints.size} metrics")
|
217
183
|
datapoints
|
218
184
|
end
|
219
185
|
end
|
data/metriks-opentsdb.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'metriks-opentsdb'
|
16
|
-
s.version = '1.
|
16
|
+
s.version = '1.2.0'
|
17
17
|
s.date = '2015-08-03'
|
18
18
|
|
19
19
|
## Make sure your summary is short. The description may be as long
|
data/spec/opentsdb_spec.rb
CHANGED
@@ -29,23 +29,23 @@ describe "Smoke test" do
|
|
29
29
|
expect(datapoints[0][:tags]).to include(:env => "test")
|
30
30
|
expect(datapoints[0][:timestamp]).not_to be_nil
|
31
31
|
|
32
|
-
expect(datapoints[1][:metric]).to eql("meter.testing.
|
32
|
+
expect(datapoints[1][:metric]).to eql("meter.testing.one_minute_rate")
|
33
33
|
expect(datapoints[1][:value]).not_to be_nil
|
34
34
|
expect(datapoints[1][:tags]).to include(:env => "test")
|
35
35
|
expect(datapoints[1][:timestamp]).not_to be_nil
|
36
36
|
|
37
|
-
expect(datapoints[2][:metric]).to eql("meter.testing.
|
37
|
+
expect(datapoints[2][:metric]).to eql("meter.testing.five_minute_rate")
|
38
38
|
expect(datapoints[2][:value]).to eql(0.0)
|
39
39
|
expect(datapoints[2][:tags]).to include(:env => "test")
|
40
40
|
expect(datapoints[2][:timestamp]).not_to be_nil
|
41
41
|
|
42
|
-
expect(datapoints[3][:metric]).to eql("meter.testing.
|
42
|
+
expect(datapoints[3][:metric]).to eql("meter.testing.fifteen_minute_rate")
|
43
43
|
expect(datapoints[3][:value]).to eql(0.0)
|
44
44
|
expect(datapoints[3][:tags]).to include(:env => "test")
|
45
45
|
expect(datapoints[3][:timestamp]).not_to be_nil
|
46
46
|
|
47
|
-
expect(datapoints[4][:metric]).to eql("meter.testing.
|
48
|
-
expect(datapoints[4][:value]).
|
47
|
+
expect(datapoints[4][:metric]).to eql("meter.testing.mean_rate")
|
48
|
+
expect(datapoints[4][:value]).not_to be_nil
|
49
49
|
expect(datapoints[4][:tags]).to include(:env => "test")
|
50
50
|
expect(datapoints[4][:timestamp]).not_to be_nil
|
51
51
|
end
|
@@ -54,7 +54,7 @@ describe "Smoke test" do
|
|
54
54
|
@registry.counter('counter.testing').increment
|
55
55
|
datapoints = @reporter.get_datapoints
|
56
56
|
expect(datapoints.size).to eql(1)
|
57
|
-
expect(datapoints[0][:metric]).to eql("counter.testing")
|
57
|
+
expect(datapoints[0][:metric]).to eql("counter.testing.count")
|
58
58
|
expect(datapoints[0][:value]).to eql(1)
|
59
59
|
expect(datapoints[0][:tags]).to include(:env => "test")
|
60
60
|
expect(datapoints[0][:timestamp]).not_to be_nil
|
@@ -63,78 +63,108 @@ describe "Smoke test" do
|
|
63
63
|
it "timer" do
|
64
64
|
@registry.timer('timer.testing').update(1.5)
|
65
65
|
datapoints = @reporter.get_datapoints
|
66
|
-
expect(datapoints.size).to eql(
|
66
|
+
expect(datapoints.size).to eql(11)
|
67
67
|
expect(datapoints[0][:metric]).to eql("timer.testing.count")
|
68
68
|
expect(datapoints[0][:value]).to eql(1)
|
69
69
|
expect(datapoints[0][:tags]).to include(:env => "test")
|
70
70
|
expect(datapoints[0][:timestamp]).not_to be_nil
|
71
71
|
|
72
|
-
expect(datapoints[1][:metric]).to eql("timer.testing.
|
72
|
+
expect(datapoints[1][:metric]).to eql("timer.testing.one_minute_rate")
|
73
73
|
expect(datapoints[1][:value]).not_to be_nil
|
74
74
|
expect(datapoints[1][:tags]).to include(:env => "test")
|
75
75
|
expect(datapoints[1][:timestamp]).not_to be_nil
|
76
76
|
|
77
|
-
expect(datapoints[2][:metric]).to eql("timer.testing.
|
77
|
+
expect(datapoints[2][:metric]).to eql("timer.testing.five_minute_rate")
|
78
78
|
expect(datapoints[2][:value]).to eql(0.0)
|
79
79
|
expect(datapoints[2][:tags]).to include(:env => "test")
|
80
80
|
expect(datapoints[2][:timestamp]).not_to be_nil
|
81
81
|
|
82
|
-
expect(datapoints[3][:metric]).to eql("timer.testing.
|
82
|
+
expect(datapoints[3][:metric]).to eql("timer.testing.fifteen_minute_rate")
|
83
83
|
expect(datapoints[3][:value]).to eql(0.0)
|
84
84
|
expect(datapoints[3][:tags]).to include(:env => "test")
|
85
85
|
expect(datapoints[3][:timestamp]).not_to be_nil
|
86
86
|
|
87
|
-
expect(datapoints[4][:metric]).to eql("timer.testing.
|
88
|
-
expect(datapoints[4][:value]).
|
87
|
+
expect(datapoints[4][:metric]).to eql("timer.testing.mean_rate")
|
88
|
+
expect(datapoints[4][:value]).not_to be_nil
|
89
89
|
expect(datapoints[4][:tags]).to include(:env => "test")
|
90
90
|
expect(datapoints[4][:timestamp]).not_to be_nil
|
91
91
|
|
92
|
-
expect(datapoints[5][:metric]).to eql("timer.testing.
|
93
|
-
expect(datapoints[5][:value]).
|
92
|
+
expect(datapoints[5][:metric]).to eql("timer.testing.min")
|
93
|
+
expect(datapoints[5][:value]).not_to be_nil
|
94
94
|
expect(datapoints[5][:tags]).to include(:env => "test")
|
95
95
|
expect(datapoints[5][:timestamp]).not_to be_nil
|
96
96
|
|
97
|
-
expect(datapoints[6][:metric]).to eql("timer.testing.
|
98
|
-
expect(datapoints[6][:value]).
|
97
|
+
expect(datapoints[6][:metric]).to eql("timer.testing.max")
|
98
|
+
expect(datapoints[6][:value]).not_to be_nil
|
99
99
|
expect(datapoints[6][:tags]).to include(:env => "test")
|
100
100
|
expect(datapoints[6][:timestamp]).not_to be_nil
|
101
101
|
|
102
|
-
expect(datapoints[7][:metric]).to eql("timer.testing.
|
103
|
-
expect(datapoints[7][:value]).
|
102
|
+
expect(datapoints[7][:metric]).to eql("timer.testing.mean")
|
103
|
+
expect(datapoints[7][:value]).not_to be_nil
|
104
104
|
expect(datapoints[7][:tags]).to include(:env => "test")
|
105
105
|
expect(datapoints[7][:timestamp]).not_to be_nil
|
106
|
+
|
107
|
+
expect(datapoints[8][:metric]).to eql("timer.testing.stddev")
|
108
|
+
expect(datapoints[8][:value]).not_to be_nil
|
109
|
+
expect(datapoints[8][:tags]).to include(:env => "test")
|
110
|
+
expect(datapoints[8][:timestamp]).not_to be_nil
|
111
|
+
|
112
|
+
expect(datapoints[9][:metric]).to eql("timer.testing.median")
|
113
|
+
expect(datapoints[9][:value]).not_to be_nil
|
114
|
+
expect(datapoints[9][:tags]).to include(:env => "test")
|
115
|
+
expect(datapoints[9][:timestamp]).not_to be_nil
|
116
|
+
|
117
|
+
expect(datapoints[10][:metric]).to eql("timer.testing.95th_percentile")
|
118
|
+
expect(datapoints[10][:value]).not_to be_nil
|
119
|
+
expect(datapoints[10][:tags]).to include(:env => "test")
|
120
|
+
expect(datapoints[10][:timestamp]).not_to be_nil
|
106
121
|
end
|
107
122
|
|
108
123
|
it "histogram" do
|
109
124
|
@registry.histogram('histogram.testing').update(1.5)
|
110
125
|
datapoints = @reporter.get_datapoints
|
111
|
-
expect(datapoints.size).to eql(
|
126
|
+
expect(datapoints.size).to eql(7)
|
112
127
|
expect(datapoints[0][:metric]).to eql("histogram.testing.count")
|
113
128
|
expect(datapoints[0][:value]).to eql(1)
|
114
129
|
expect(datapoints[0][:tags]).to include(:env => "test")
|
115
130
|
expect(datapoints[0][:timestamp]).not_to be_nil
|
116
131
|
|
117
|
-
expect(datapoints[1][:metric]).to eql("histogram.testing.
|
118
|
-
expect(datapoints[1][:value]).
|
132
|
+
expect(datapoints[1][:metric]).to eql("histogram.testing.min")
|
133
|
+
expect(datapoints[1][:value]).not_to be_nil
|
119
134
|
expect(datapoints[1][:tags]).to include(:env => "test")
|
120
135
|
expect(datapoints[1][:timestamp]).not_to be_nil
|
121
136
|
|
122
|
-
expect(datapoints[2][:metric]).to eql("histogram.testing.
|
123
|
-
expect(datapoints[2][:value]).
|
137
|
+
expect(datapoints[2][:metric]).to eql("histogram.testing.max")
|
138
|
+
expect(datapoints[2][:value]).not_to be_nil
|
124
139
|
expect(datapoints[2][:tags]).to include(:env => "test")
|
125
140
|
expect(datapoints[2][:timestamp]).not_to be_nil
|
126
141
|
|
127
|
-
expect(datapoints[3][:metric]).to eql("histogram.testing.
|
128
|
-
expect(datapoints[3][:value]).
|
142
|
+
expect(datapoints[3][:metric]).to eql("histogram.testing.mean")
|
143
|
+
expect(datapoints[3][:value]).not_to be_nil
|
129
144
|
expect(datapoints[3][:tags]).to include(:env => "test")
|
130
145
|
expect(datapoints[3][:timestamp]).not_to be_nil
|
146
|
+
|
147
|
+
expect(datapoints[4][:metric]).to eql("histogram.testing.stddev")
|
148
|
+
expect(datapoints[4][:value]).not_to be_nil
|
149
|
+
expect(datapoints[4][:tags]).to include(:env => "test")
|
150
|
+
expect(datapoints[4][:timestamp]).not_to be_nil
|
151
|
+
|
152
|
+
expect(datapoints[5][:metric]).to eql("histogram.testing.median")
|
153
|
+
expect(datapoints[5][:value]).not_to be_nil
|
154
|
+
expect(datapoints[5][:tags]).to include(:env => "test")
|
155
|
+
expect(datapoints[5][:timestamp]).not_to be_nil
|
156
|
+
|
157
|
+
expect(datapoints[6][:metric]).to eql("histogram.testing.95th_percentile")
|
158
|
+
expect(datapoints[6][:value]).not_to be_nil
|
159
|
+
expect(datapoints[6][:tags]).to include(:env => "test")
|
160
|
+
expect(datapoints[6][:timestamp]).not_to be_nil
|
131
161
|
end
|
132
162
|
|
133
163
|
it "gauge" do
|
134
164
|
@registry.gauge('gauge.testing') { 123 }
|
135
165
|
datapoints = @reporter.get_datapoints
|
136
166
|
expect(datapoints.size).to eql(1)
|
137
|
-
expect(datapoints[0][:metric]).to eql("gauge.testing")
|
167
|
+
expect(datapoints[0][:metric]).to eql("gauge.testing.value")
|
138
168
|
expect(datapoints[0][:value]).to eql(123)
|
139
169
|
expect(datapoints[0][:tags]).to include(:env => "test")
|
140
170
|
expect(datapoints[0][:timestamp]).not_to be_nil
|
@@ -147,7 +177,7 @@ describe "Rest Client" do
|
|
147
177
|
@reporter = Metriks::OpenTSDBReporter.new(
|
148
178
|
'http://localhost:4242',
|
149
179
|
{:env => "test"},
|
150
|
-
{ :registry => @registry})
|
180
|
+
{ :registry => @registry, :batch_size => 3})
|
151
181
|
stub_request(:post, "http://localhost:4242/api/put").
|
152
182
|
with(:body => /^\[.*\]$/).
|
153
183
|
to_return(:status => 200, :body => "", :headers => {})
|
@@ -183,7 +213,7 @@ describe "Rest Client" do
|
|
183
213
|
end
|
184
214
|
|
185
215
|
it "Send a five metric" do
|
186
|
-
for i in 0..
|
216
|
+
for i in 0..4 do
|
187
217
|
@registry.counter("counter.testing.#{i}").increment
|
188
218
|
end
|
189
219
|
@reporter.submit @reporter.get_datapoints
|