tsd_metrics 0.2.0 → 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +23 -0
- data/.travis.yml +13 -0
- data/CONTRIBUTORS.md +10 -0
- data/DEPENDENCIES.md +15 -0
- data/Gemfile +22 -0
- data/LICENSE +158 -0
- data/README.md +182 -0
- data/Rakefile +5 -0
- data/demo.rb +27 -0
- data/doc/QUERY_LOG_FORMAT.md +59 -0
- data/doc/query-log-schema-2c.json +55 -0
- data/doc/query-log-schema-2d.json +69 -0
- data/doc/query-log-schema-2e.json +103 -0
- data/lib/tsd_metrics/async_queue_writer.rb +40 -0
- data/lib/tsd_metrics/counter.rb +43 -0
- data/lib/tsd_metrics/counter_sample.rb +37 -0
- data/lib/tsd_metrics/exceptions.rb +22 -0
- data/lib/tsd_metrics/json_formatting_sink.rb +63 -0
- data/lib/tsd_metrics/metric_builder_for_single_struct_receiver.rb +24 -0
- data/lib/tsd_metrics/queue_writer.rb +24 -0
- data/lib/tsd_metrics/timer.rb +48 -0
- data/lib/tsd_metrics/timer_sample.rb +69 -0
- data/lib/tsd_metrics/tsd_metric.rb +200 -0
- data/lib/tsd_metrics/units.rb +22 -0
- data/lib/tsd_metrics.rb +63 -15
- data/resources/LICENSE +158 -0
- data/spec/integration_spec.rb +84 -0
- data/spec/json_formatter_spec.rb +99 -0
- data/spec/tsd_metric_spec.rb +289 -0
- data/spec/tsd_metrics_spec.rb +22 -0
- data/spec/units_utils_spec.rb +29 -0
- data/tsd_metrics.gemspec +35 -0
- metadata +124 -82
@@ -0,0 +1,289 @@
|
|
1
|
+
# Copyright 2014 Groupon.com
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'tsd_metrics/tsd_metric'
|
16
|
+
require 'timecop'
|
17
|
+
include TsdMetrics
|
18
|
+
|
19
|
+
describe "TsdMetric" do
|
20
|
+
let(:sink) { double(:sink, :record => nil) }
|
21
|
+
let(:mutexer) do
|
22
|
+
mock = double()
|
23
|
+
allow(mock).to receive(:synchronize).and_yield()
|
24
|
+
mock
|
25
|
+
end
|
26
|
+
let(:startTime) { Time.now }
|
27
|
+
let(:metric) { TsdMetric.new(startTime, sink, mutexer) }
|
28
|
+
def closeAndGetEvent(metric=metric)
|
29
|
+
event = nil
|
30
|
+
allow(sink).to receive(:record) do |metricEvent|
|
31
|
+
event = metricEvent
|
32
|
+
end
|
33
|
+
metric.close()
|
34
|
+
event
|
35
|
+
end
|
36
|
+
def pickValuesFrom(metric)
|
37
|
+
metric.map do |sample|
|
38
|
+
sample[:value]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
def pickUnitsFrom(metric)
|
42
|
+
metric.map do |sample|
|
43
|
+
sample[:unit]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with the minumum state" do
|
48
|
+
let(:gaugeName) { "myGauge"}
|
49
|
+
let(:simplestMetric) do
|
50
|
+
metric.tap{|m| m.setGauge(gaugeName, 100)}
|
51
|
+
end
|
52
|
+
|
53
|
+
it "outputs the minimum state for a metric" do
|
54
|
+
event = nil
|
55
|
+
expect(sink).to receive(:record) do |metricEvent|
|
56
|
+
event = metricEvent
|
57
|
+
end
|
58
|
+
beforeCloseTime = Time.now()
|
59
|
+
simplestMetric.close()
|
60
|
+
afterCloseTime = Time.now()
|
61
|
+
|
62
|
+
event.should_not be_nil
|
63
|
+
annotations = event.annotations
|
64
|
+
annotations.should_not be_nil
|
65
|
+
annotations[:initTimestamp].should == startTime
|
66
|
+
annotations[:finalTimestamp].should >= beforeCloseTime
|
67
|
+
annotations[:finalTimestamp].should <= afterCloseTime
|
68
|
+
end
|
69
|
+
|
70
|
+
it "throws an exception if any operations are done after closing" do
|
71
|
+
closeAndGetEvent(simplestMetric)
|
72
|
+
expect { simplestMetric.setGauge("something", 1) }.to raise_error TsdMetrics::Error
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "open?" do
|
76
|
+
it "works as expected" do
|
77
|
+
expect { closeAndGetEvent(simplestMetric) }
|
78
|
+
.to change(simplestMetric, :open?).from(true).to(false)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "gauges" do
|
84
|
+
let(:gaugeName) { "myGauge"}
|
85
|
+
let(:gaugeName2) { "myOtherGauge"}
|
86
|
+
it "can be set" do
|
87
|
+
metric.setGauge(gaugeName, 100, :byte)
|
88
|
+
metric.setGauge(gaugeName, 307, :byte)
|
89
|
+
|
90
|
+
metric.setGauge(gaugeName2, 50, :week)
|
91
|
+
metric.setGauge(gaugeName2, 23, :week)
|
92
|
+
|
93
|
+
event = closeAndGetEvent
|
94
|
+
event.gauges[gaugeName].should =~ [{value: 100, unit: :byte}, {value: 307, unit: :byte}]
|
95
|
+
event.gauges[gaugeName2].should =~ [{value: 50, unit: :week}, {value: 23, unit: :week}]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "timers" do
|
100
|
+
let(:timerName) { :myTimer }
|
101
|
+
it "can be started and stopped multiple times" do
|
102
|
+
Timecop.freeze(Time.now)
|
103
|
+
metric.startTimer(timerName)
|
104
|
+
Timecop.freeze(Time.now + 10)
|
105
|
+
metric.stopTimer(timerName)
|
106
|
+
Timecop.freeze(Time.now + 5)
|
107
|
+
metric.startTimer(timerName)
|
108
|
+
Timecop.freeze(Time.now + 25)
|
109
|
+
metric.stopTimer(timerName)
|
110
|
+
Timecop.return
|
111
|
+
|
112
|
+
event = closeAndGetEvent
|
113
|
+
values = pickValuesFrom(event.timers[timerName])
|
114
|
+
values.should include(10000000000)
|
115
|
+
values.should include(25000000000)
|
116
|
+
end
|
117
|
+
|
118
|
+
its "default unit is nanoseconds" do
|
119
|
+
Timecop.freeze(Time.now)
|
120
|
+
metric.startTimer(timerName)
|
121
|
+
Timecop.freeze(Time.now + 12)
|
122
|
+
metric.stopTimer(timerName)
|
123
|
+
Timecop.return
|
124
|
+
event = closeAndGetEvent
|
125
|
+
event.timers[timerName].should == [{value: 12e9, unit: :nanosecond}]
|
126
|
+
end
|
127
|
+
|
128
|
+
it "only record timers that are stopped when metric is closed" do
|
129
|
+
Timecop.freeze(Time.now)
|
130
|
+
metric.startTimer(timerName)
|
131
|
+
Timecop.freeze(Time.now + 10)
|
132
|
+
metric.stopTimer(timerName)
|
133
|
+
Timecop.freeze(Time.now + 5)
|
134
|
+
metric.startTimer(timerName)
|
135
|
+
Timecop.freeze(Time.now + 25)
|
136
|
+
|
137
|
+
event = closeAndGetEvent
|
138
|
+
values = pickValuesFrom(event.timers[timerName])
|
139
|
+
values.should == [10e9]
|
140
|
+
|
141
|
+
Timecop.return
|
142
|
+
end
|
143
|
+
|
144
|
+
it "can be added manually" do
|
145
|
+
metric.setTimer(timerName, 20.5, :second)
|
146
|
+
event = closeAndGetEvent
|
147
|
+
pickValuesFrom(event.timers[timerName]).should include(20.5)
|
148
|
+
end
|
149
|
+
|
150
|
+
it "keeps whole sample groups when no samples are stopped" do
|
151
|
+
otherTimerName = "myOtherTimer"
|
152
|
+
metric.startTimer(timerName)
|
153
|
+
metric.startTimer(otherTimerName)
|
154
|
+
|
155
|
+
metric.stopTimer(otherTimerName)
|
156
|
+
|
157
|
+
event = closeAndGetEvent
|
158
|
+
event.timers.should include(timerName)
|
159
|
+
end
|
160
|
+
|
161
|
+
it "orders timer samples by start time" do
|
162
|
+
# Procedural interface first
|
163
|
+
Timecop.freeze(Time.now)
|
164
|
+
metric.startTimer(timerName)
|
165
|
+
|
166
|
+
# Then start an OO one
|
167
|
+
Timecop.freeze(Time.now + 2)
|
168
|
+
timerSample1 = metric.createTimer(timerName)
|
169
|
+
|
170
|
+
# And another
|
171
|
+
Timecop.freeze(Time.now + 4)
|
172
|
+
timerSample2 = metric.createTimer(timerName)
|
173
|
+
|
174
|
+
# Now stop them in reverse order
|
175
|
+
Timecop.freeze(Time.now + 8)
|
176
|
+
timerSample2.stop()
|
177
|
+
Timecop.freeze(Time.now + 16)
|
178
|
+
timerSample1.stop()
|
179
|
+
Timecop.freeze(Time.now + 32)
|
180
|
+
metric.stopTimer(timerName)
|
181
|
+
|
182
|
+
# Ensure the order of samples is the same as the timer-starting order
|
183
|
+
event = closeAndGetEvent
|
184
|
+
values = pickValuesFrom(event.timers[timerName])
|
185
|
+
values.should == [62e9, 28e9, 8e9]
|
186
|
+
|
187
|
+
Timecop.return
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
it "can be obtained as an object" do
|
192
|
+
timerSample = nil
|
193
|
+
expect { timerSample = metric.createTimer(:timerName) }.not_to raise_error
|
194
|
+
timerSample.should_not == nil
|
195
|
+
end
|
196
|
+
|
197
|
+
it "contains the unit for each timer" do
|
198
|
+
metric.setTimer(timerName, 17.5, :second)
|
199
|
+
event = closeAndGetEvent
|
200
|
+
pickUnitsFrom(event.timers[timerName]).should include(:second)
|
201
|
+
[{:a => "b"}].should include({:a => "b"})
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "OO interface" do
|
205
|
+
let(:ooTimer) { metric.createTimer(timerName) }
|
206
|
+
it "can be created and stopped to record a sample" do
|
207
|
+
Timecop.freeze(Time.now)
|
208
|
+
# Causes creation of the timer; 'let' is lazy
|
209
|
+
ooTimer
|
210
|
+
Timecop.freeze(Time.now + 12)
|
211
|
+
ooTimer.stop
|
212
|
+
Timecop.return
|
213
|
+
event = closeAndGetEvent
|
214
|
+
pickValuesFrom(event.timers[timerName]).should include(12000000000)
|
215
|
+
end
|
216
|
+
|
217
|
+
describe "stopped?" do
|
218
|
+
it "works as expected" do
|
219
|
+
expect { ooTimer.stop }.to change(ooTimer, :stopped?).from(false).to(true)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
describe "counters" do
|
226
|
+
let(:counterName) { :myCounter }
|
227
|
+
|
228
|
+
it "default to start at 0" do
|
229
|
+
metric.incrementCounter(counterName)
|
230
|
+
event = closeAndGetEvent
|
231
|
+
pickValuesFrom(event.counters[counterName]).should == [1]
|
232
|
+
end
|
233
|
+
|
234
|
+
it "can be incremented and decremented" do
|
235
|
+
metric.resetCounter(counterName)
|
236
|
+
12.times { metric.decrementCounter(counterName) }
|
237
|
+
# Now at -12
|
238
|
+
2.times { metric.decrementCounter(counterName, 3) }
|
239
|
+
# Now at -18
|
240
|
+
2.times { metric.incrementCounter(counterName) }
|
241
|
+
# Now at -16
|
242
|
+
3.times { metric.incrementCounter(counterName, 23) }
|
243
|
+
# Now at 53
|
244
|
+
event = closeAndGetEvent
|
245
|
+
pickValuesFrom(event.counters[counterName]).should include 53
|
246
|
+
end
|
247
|
+
|
248
|
+
it "can be reset to create multiple values" do
|
249
|
+
metric.resetCounter(counterName)
|
250
|
+
metric.incrementCounter(counterName)
|
251
|
+
metric.resetCounter(counterName)
|
252
|
+
3.times { metric.incrementCounter(counterName) }
|
253
|
+
metric.resetCounter(counterName)
|
254
|
+
# Test for existance of array items without testing order
|
255
|
+
pickValuesFrom(closeAndGetEvent.counters[counterName]).should =~ [3,0,1]
|
256
|
+
end
|
257
|
+
|
258
|
+
it "can be obtained as an object" do
|
259
|
+
counterSample = nil
|
260
|
+
expect { counterSample = metric.createCounter(:counterName) }.not_to raise_error
|
261
|
+
counterSample.should_not == nil
|
262
|
+
end
|
263
|
+
|
264
|
+
describe "OO interface" do
|
265
|
+
let(:ooCounter) { metric.createCounter(counterName) }
|
266
|
+
it "can be incremented and decremented to produce a sample" do
|
267
|
+
12.times { ooCounter.decrement() }
|
268
|
+
# Now at -12
|
269
|
+
2.times { ooCounter.decrement(3) }
|
270
|
+
# Now at -18
|
271
|
+
2.times { ooCounter.increment() }
|
272
|
+
# Now at -16
|
273
|
+
3.times { ooCounter.increment(23) }
|
274
|
+
# Now at 53
|
275
|
+
event = closeAndGetEvent
|
276
|
+
pickValuesFrom(event.counters[counterName]).should include 53
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
describe "annotations" do
|
282
|
+
let(:annotationName) { :myAnnotation }
|
283
|
+
let(:annotationString) { "it was the worst of times, it was the blurst of times" }
|
284
|
+
it "can be set on the metric" do
|
285
|
+
metric.annotate(annotationName, annotationString)
|
286
|
+
closeAndGetEvent.annotations[annotationName].should == annotationString
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Copyright 2014 Groupon.com
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'tsd_metrics'
|
16
|
+
describe "TsdMetrics" do
|
17
|
+
it "can build a TsdMetric object" do
|
18
|
+
metric = TsdMetrics.buildMetric
|
19
|
+
metric.should_not be_nil
|
20
|
+
metric.should be_a(TsdMetric)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Copyright 2014 Groupon.com
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'tsd_metrics/units'
|
16
|
+
|
17
|
+
describe "UnitsUtils" do
|
18
|
+
describe "isValidUnitValue?" do
|
19
|
+
it "allows noUnit as a valid value" do
|
20
|
+
TsdMetrics::UnitsUtils.isValidUnitValue?(:noUnit).should be_true
|
21
|
+
end
|
22
|
+
it "validates a valid unit" do
|
23
|
+
TsdMetrics::UnitsUtils.isValidUnitValue?(:second).should be_true
|
24
|
+
end
|
25
|
+
it "invalidates a non-valid unit" do
|
26
|
+
TsdMetrics::UnitsUtils.isValidUnitValue?(:parsecs).should be_false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/tsd_metrics.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright 2014 Groupon.com
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
Gem::Specification.new do |s|
|
16
|
+
s.name = 'tsd_metrics'
|
17
|
+
s.version = '0.2.8'
|
18
|
+
s.date = '2015-01-15'
|
19
|
+
s.summary = "TSD Metrics client for Ruby"
|
20
|
+
s.description = "A client for logging to TSD-Aggregation-logging-compatible JSON files"
|
21
|
+
s.authors = ["Matthew Hayter"]
|
22
|
+
s.email = 'matthewhayter@gmail.com'
|
23
|
+
s.licenses = ['Apache License, Version 2.0']
|
24
|
+
|
25
|
+
s.files = `git ls-files`.split($/)
|
26
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
27
|
+
s.test_files = s.files.grep(%r{^spec/})
|
28
|
+
s.require_paths = ["lib", "resources"]
|
29
|
+
|
30
|
+
s.add_development_dependency 'rspec', '2.14.1'
|
31
|
+
s.add_development_dependency 'timecop', '0.7.1'
|
32
|
+
s.add_development_dependency 'pry', '0.9.12.6'
|
33
|
+
s.add_development_dependency 'json-schema', '2.4.1'
|
34
|
+
s.add_development_dependency 'rake', '10.4.2'
|
35
|
+
end
|
metadata
CHANGED
@@ -1,109 +1,151 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: tsd_metrics
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.8
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Matthew Hayter
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2015-01-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: rspec
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 31
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
- 14
|
32
|
-
version: "2.14"
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.14.1
|
33
20
|
type: :development
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: timecop
|
37
21
|
prerelease: false
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.14.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: timecop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.7.1
|
48
34
|
type: :development
|
49
|
-
|
50
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.7.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
51
42
|
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.9.12.6
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.12.6
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: json-schema
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.4.1
|
62
|
+
type: :development
|
52
63
|
prerelease: false
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.4.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 10.4.2
|
63
76
|
type: :development
|
64
|
-
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 10.4.2
|
65
83
|
description: A client for logging to TSD-Aggregation-logging-compatible JSON files
|
66
84
|
email: matthewhayter@gmail.com
|
67
85
|
executables: []
|
68
|
-
|
69
86
|
extensions: []
|
70
|
-
|
71
87
|
extra_rdoc_files: []
|
72
|
-
|
73
|
-
|
88
|
+
files:
|
89
|
+
- .gitignore
|
90
|
+
- .travis.yml
|
91
|
+
- CONTRIBUTORS.md
|
92
|
+
- DEPENDENCIES.md
|
93
|
+
- Gemfile
|
94
|
+
- LICENSE
|
95
|
+
- README.md
|
96
|
+
- Rakefile
|
97
|
+
- demo.rb
|
98
|
+
- doc/QUERY_LOG_FORMAT.md
|
99
|
+
- doc/query-log-schema-2c.json
|
100
|
+
- doc/query-log-schema-2d.json
|
101
|
+
- doc/query-log-schema-2e.json
|
74
102
|
- lib/tsd_metrics.rb
|
103
|
+
- lib/tsd_metrics/async_queue_writer.rb
|
104
|
+
- lib/tsd_metrics/counter.rb
|
105
|
+
- lib/tsd_metrics/counter_sample.rb
|
106
|
+
- lib/tsd_metrics/exceptions.rb
|
107
|
+
- lib/tsd_metrics/json_formatting_sink.rb
|
108
|
+
- lib/tsd_metrics/metric_builder_for_single_struct_receiver.rb
|
109
|
+
- lib/tsd_metrics/queue_writer.rb
|
110
|
+
- lib/tsd_metrics/timer.rb
|
111
|
+
- lib/tsd_metrics/timer_sample.rb
|
112
|
+
- lib/tsd_metrics/tsd_metric.rb
|
113
|
+
- lib/tsd_metrics/units.rb
|
114
|
+
- resources/LICENSE
|
115
|
+
- spec/integration_spec.rb
|
116
|
+
- spec/json_formatter_spec.rb
|
117
|
+
- spec/tsd_metric_spec.rb
|
118
|
+
- spec/tsd_metrics_spec.rb
|
119
|
+
- spec/units_utils_spec.rb
|
120
|
+
- tsd_metrics.gemspec
|
75
121
|
homepage:
|
76
|
-
licenses:
|
77
|
-
|
122
|
+
licenses:
|
123
|
+
- Apache License, Version 2.0
|
124
|
+
metadata: {}
|
78
125
|
post_install_message:
|
79
126
|
rdoc_options: []
|
80
|
-
|
81
|
-
require_paths:
|
127
|
+
require_paths:
|
82
128
|
- lib
|
83
|
-
|
84
|
-
|
85
|
-
requirements:
|
86
|
-
- -
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
requirements:
|
95
|
-
- - ">="
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
hash: 3
|
98
|
-
segments:
|
99
|
-
- 0
|
100
|
-
version: "0"
|
129
|
+
- resources
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ! '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
101
140
|
requirements: []
|
102
|
-
|
103
141
|
rubyforge_project:
|
104
|
-
rubygems_version:
|
142
|
+
rubygems_version: 2.4.5
|
105
143
|
signing_key:
|
106
|
-
specification_version:
|
144
|
+
specification_version: 4
|
107
145
|
summary: TSD Metrics client for Ruby
|
108
|
-
test_files:
|
109
|
-
|
146
|
+
test_files:
|
147
|
+
- spec/integration_spec.rb
|
148
|
+
- spec/json_formatter_spec.rb
|
149
|
+
- spec/tsd_metric_spec.rb
|
150
|
+
- spec/tsd_metrics_spec.rb
|
151
|
+
- spec/units_utils_spec.rb
|