metriks-opentsdb 1.1.3 → 1.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 +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
|