librato-metrics 0.6.0.pre2 → 0.6.0.pre3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +37 -6
- data/lib/librato/metrics.rb +1 -0
- data/lib/librato/metrics/aggregator.rb +68 -0
- data/lib/librato/metrics/client.rb +1 -1
- data/lib/librato/metrics/collection.rb +2 -2
- data/lib/librato/metrics/persistence/direct.rb +1 -1
- data/lib/librato/metrics/processor.rb +78 -0
- data/lib/librato/metrics/queue.rb +5 -69
- data/lib/librato/metrics/version.rb +1 -1
- data/librato-metrics.gemspec +2 -1
- data/spec/unit/metrics/aggregator_spec.rb +173 -0
- metadata +37 -22
data/README.md
CHANGED
@@ -40,9 +40,9 @@ Make sure you have [an account for Metrics](https://metrics.librato.com/) and th
|
|
40
40
|
|
41
41
|
Librato::Metrics.authenticate 'email', 'api_key'
|
42
42
|
|
43
|
-
## Sending
|
43
|
+
## Sending Measurements
|
44
44
|
|
45
|
-
If you are sending very many
|
45
|
+
If you are sending very many measurements or sending them very often, it will be much higher performance to bundle them up together to reduce your request volume. Use `Queue` for this.
|
46
46
|
|
47
47
|
Queue up a simple gauge metric named `temperature`:
|
48
48
|
|
@@ -65,15 +65,46 @@ Save all queued metrics:
|
|
65
65
|
|
66
66
|
queue.submit
|
67
67
|
|
68
|
+
## Aggregate Measurements
|
69
|
+
|
70
|
+
If you are measuring something very frequently e.g. per-request in a web application (order mS) you may not want to send each individual measurement, but rather periodically send a [single aggregate measurement](http://dev.librato.com/v1/post/metrics#gauge_specific), spanning multiple seconds or even minutes. Use an `Aggregator` for this.
|
71
|
+
|
72
|
+
Aggregate a simple gauge metric named `response_latency`:
|
73
|
+
|
74
|
+
aggregator = Librato::Metrics::Aggregator.new
|
75
|
+
aggregator.add :response_latency => 85.0
|
76
|
+
aggregator.add :response_latency => 100.5
|
77
|
+
aggregator.add :response_latency => 150.2
|
78
|
+
aggregator.add :response_latency => 90.1
|
79
|
+
aggregator.add :response_latency => 92.0
|
80
|
+
|
81
|
+
Which would result in a gauge measurement like:
|
82
|
+
|
83
|
+
{:name => "response_latency", :count => 5, :sum => 517.8, :min => 85.0, :max => 150.2}
|
84
|
+
|
85
|
+
You can specify a source during aggregate construction:
|
86
|
+
|
87
|
+
aggregator = Librato::Metrics::Aggregator.new(:source => 'foobar')
|
88
|
+
|
89
|
+
You can aggregate multiple metrics at once:
|
90
|
+
|
91
|
+
aggregator.add :app_latency => 35.2, :db_latency => 120.7
|
92
|
+
|
93
|
+
Send the current aggregated metrics to Metrics:
|
94
|
+
|
95
|
+
aggregator.submit
|
96
|
+
|
68
97
|
## Benchmarking
|
69
98
|
|
70
|
-
If you have operations in your application you want to record execution time for,
|
99
|
+
If you have operations in your application you want to record execution time for, both `Queue` and `Aggregator` support the `#time` method:
|
71
100
|
|
72
|
-
|
101
|
+
aggregator.time :my_measurement do
|
73
102
|
# do work...
|
74
103
|
end
|
75
104
|
|
76
|
-
|
105
|
+
The difference between the two is that `Queue` submits each timing measurement individually, while `Aggregator` submits a single timing measurement spanning all executions.
|
106
|
+
|
107
|
+
If you need extra attributes for a `Queue` timing measurement, simply add them on:
|
77
108
|
|
78
109
|
queue.time :my_measurement, :source => 'app1' do
|
79
110
|
# do work...
|
@@ -162,4 +193,4 @@ These are features we expect to add in future versions, roughly in the order of
|
|
162
193
|
|
163
194
|
## Copyright
|
164
195
|
|
165
|
-
Copyright (c) 2011-2012 [Librato Inc.](http://librato.com) See LICENSE for details.
|
196
|
+
Copyright (c) 2011-2012 [Librato Inc.](http://librato.com) See LICENSE for details.
|
data/lib/librato/metrics.rb
CHANGED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'aggregate'
|
2
|
+
require 'metrics/processor'
|
3
|
+
|
4
|
+
module Librato
|
5
|
+
module Metrics
|
6
|
+
|
7
|
+
class Aggregator
|
8
|
+
include Processor
|
9
|
+
|
10
|
+
attr_reader :source
|
11
|
+
|
12
|
+
def initialize(options={})
|
13
|
+
@aggregated = {}
|
14
|
+
@client = options[:client] || Librato::Metrics.client
|
15
|
+
@source = options[:source]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Add a metric entry to the metric set:
|
19
|
+
#
|
20
|
+
# @param Hash metrics metrics to add
|
21
|
+
def add(args)
|
22
|
+
args.each do |k, v|
|
23
|
+
value = v.respond_to?(:each) ? v[:value] : v
|
24
|
+
|
25
|
+
@aggregated[k] ||= Aggregate.new
|
26
|
+
@aggregated[k] << value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns true if aggregate contains no measurements
|
31
|
+
#
|
32
|
+
# @return Boolean
|
33
|
+
def empty?
|
34
|
+
@aggregated.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
# Remove all queued metrics
|
38
|
+
#
|
39
|
+
def flush
|
40
|
+
@aggregated = {}
|
41
|
+
end
|
42
|
+
alias :clear :flush
|
43
|
+
|
44
|
+
def queued
|
45
|
+
gauges = []
|
46
|
+
|
47
|
+
@aggregated.each do |k,v|
|
48
|
+
gauges << {
|
49
|
+
:name => k.to_s,
|
50
|
+
:count => v.count,
|
51
|
+
:sum => v.sum,
|
52
|
+
|
53
|
+
# TODO: make float/non-float consistent in the gem
|
54
|
+
:min => v.min.to_f,
|
55
|
+
:max => v.max.to_f
|
56
|
+
# TODO: expose v.sum2 and include
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
req = { :gauges => gauges }
|
61
|
+
req[:source] = @source if @source
|
62
|
+
|
63
|
+
req
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -103,7 +103,7 @@ module Librato
|
|
103
103
|
# expects 200
|
104
104
|
url = connection.build_url("metrics/#{metric}", query)
|
105
105
|
response = connection.get(url)
|
106
|
-
parsed = MultiJson.
|
106
|
+
parsed = MultiJson.load(response.body)
|
107
107
|
# TODO: pagination support
|
108
108
|
query.empty? ? parsed : parsed["measurements"]
|
109
109
|
end
|
@@ -14,7 +14,7 @@ module Librato
|
|
14
14
|
# expects 200
|
15
15
|
url = connection.build_url(path, query)
|
16
16
|
response = connection.get(url)
|
17
|
-
parsed = MultiJson.
|
17
|
+
parsed = MultiJson.load(response.body)
|
18
18
|
results = parsed["metrics"]
|
19
19
|
return results if parsed["query"]["found"] <= MAX_RESULTS
|
20
20
|
query[:offset] = MAX_RESULTS
|
@@ -22,7 +22,7 @@ module Librato
|
|
22
22
|
# expects 200
|
23
23
|
url = connection.build_url(path, query)
|
24
24
|
response = connection.get(url)
|
25
|
-
parsed = MultiJson.
|
25
|
+
parsed = MultiJson.load(response.body)
|
26
26
|
results.push(*parsed["metrics"])
|
27
27
|
query[:offset] += MAX_RESULTS
|
28
28
|
end while query[:offset] < parsed["query"]["found"]
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Librato
|
2
|
+
module Metrics
|
3
|
+
|
4
|
+
module Processor
|
5
|
+
MEASUREMENTS_PER_REQUEST = 500
|
6
|
+
|
7
|
+
attr_reader :per_request
|
8
|
+
|
9
|
+
# The current Client instance this queue is using to authenticate
|
10
|
+
# and connect to Librato Metrics. This will default to the primary
|
11
|
+
# client used by the Librato::Metrics module unless it has been
|
12
|
+
# set to something else.
|
13
|
+
#
|
14
|
+
# @return [Librato::Metrics::Client]
|
15
|
+
def client
|
16
|
+
@client ||= Librato::Metrics.client
|
17
|
+
end
|
18
|
+
|
19
|
+
# The object this MetricSet will use to persist
|
20
|
+
#
|
21
|
+
def persister
|
22
|
+
@persister ||= create_persister
|
23
|
+
end
|
24
|
+
|
25
|
+
# Persist currently queued metrics
|
26
|
+
#
|
27
|
+
# @return Boolean
|
28
|
+
def submit
|
29
|
+
raise NoMetricsQueued if self.queued.empty?
|
30
|
+
options = {:per_request => @per_request}
|
31
|
+
if persister.persist(self.client, self.queued, options)
|
32
|
+
flush and return true
|
33
|
+
end
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
37
|
+
# Capture execution time for a block and queue
|
38
|
+
# it as the value for a metric. Times are recorded
|
39
|
+
# in milliseconds.
|
40
|
+
#
|
41
|
+
# Options are the same as for {#add}.
|
42
|
+
#
|
43
|
+
# @example Queue API request response time
|
44
|
+
# queue.time :api_request_time do
|
45
|
+
# # API request..
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# @example Queue API request response time w/ source
|
49
|
+
# queue.time :api_request_time, :source => 'app1' do
|
50
|
+
# # API request..
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# @param [Symbol|String] name Metric name
|
54
|
+
# @param [Hash] options Metric options
|
55
|
+
def time(name, options={})
|
56
|
+
start = Time.now
|
57
|
+
yield
|
58
|
+
duration = (Time.now - start) * 1000.0 # milliseconds
|
59
|
+
metric = {name => options.merge({:value => duration})}
|
60
|
+
add metric
|
61
|
+
end
|
62
|
+
alias :benchmark :time
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def create_persister
|
67
|
+
type = self.client.persistence.to_s.capitalize
|
68
|
+
Librato::Metrics::Persistence.const_get(type).new
|
69
|
+
end
|
70
|
+
|
71
|
+
def epoch_time
|
72
|
+
Time.now.to_i
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
@@ -1,16 +1,18 @@
|
|
1
|
+
require 'metrics/processor'
|
2
|
+
|
3
|
+
|
1
4
|
module Librato
|
2
5
|
module Metrics
|
3
6
|
class Queue
|
4
|
-
|
7
|
+
include Processor
|
5
8
|
|
6
|
-
attr_reader :per_request
|
7
9
|
attr_accessor :skip_measurement_times
|
8
10
|
|
9
11
|
def initialize(options={})
|
10
12
|
@queued = {}
|
13
|
+
@client = options[:client] || Librato::Metrics.client
|
11
14
|
@per_request = options[:per_request] || MEASUREMENTS_PER_REQUEST
|
12
15
|
@skip_measurement_times = options[:skip_measurement_times]
|
13
|
-
@client = options[:client] || Librato::Metrics.client
|
14
16
|
end
|
15
17
|
|
16
18
|
# Add a metric entry to the metric set:
|
@@ -37,16 +39,6 @@ module Librato
|
|
37
39
|
queued
|
38
40
|
end
|
39
41
|
|
40
|
-
# The current Client instance this queue is using to authenticate
|
41
|
-
# and connect to Librato Metrics. This will default to the primary
|
42
|
-
# client used by the Librato::Metrics module unless it has been
|
43
|
-
# set to something else.
|
44
|
-
#
|
45
|
-
# @return [Librato::Metrics::Client]
|
46
|
-
def client
|
47
|
-
@client ||= Librato::Metrics.client
|
48
|
-
end
|
49
|
-
|
50
42
|
# Currently queued counters
|
51
43
|
#
|
52
44
|
# @return [Array]
|
@@ -69,12 +61,6 @@ module Librato
|
|
69
61
|
alias :clear :flush
|
70
62
|
alias :flush_queued :flush
|
71
63
|
|
72
|
-
# The object this MetricSet will use to persist
|
73
|
-
#
|
74
|
-
def persister
|
75
|
-
@persister ||= create_persister
|
76
|
-
end
|
77
|
-
|
78
64
|
# Currently queued gauges
|
79
65
|
#
|
80
66
|
# @return Array
|
@@ -97,56 +83,6 @@ module Librato
|
|
97
83
|
end
|
98
84
|
alias :length :size
|
99
85
|
|
100
|
-
# Persist currently queued metrics
|
101
|
-
#
|
102
|
-
# @return Boolean
|
103
|
-
def submit
|
104
|
-
raise NoMetricsQueued if self.queued.empty?
|
105
|
-
options = {:per_request => @per_request}
|
106
|
-
if persister.persist(self.client, self.queued, options)
|
107
|
-
flush and return true
|
108
|
-
end
|
109
|
-
false
|
110
|
-
end
|
111
|
-
|
112
|
-
# Capture execution time for a block and queue
|
113
|
-
# it as the value for a metric. Times are recorded
|
114
|
-
# in milliseconds.
|
115
|
-
#
|
116
|
-
# Options are the same as for {#add}.
|
117
|
-
#
|
118
|
-
# @example Queue API request response time
|
119
|
-
# queue.time :api_request_time do
|
120
|
-
# # API request..
|
121
|
-
# end
|
122
|
-
#
|
123
|
-
# @example Queue API request response time w/ source
|
124
|
-
# queue.time :api_request_time, :source => 'app1' do
|
125
|
-
# # API request..
|
126
|
-
# end
|
127
|
-
#
|
128
|
-
# @param [Symbol|String] name Metric name
|
129
|
-
# @param [Hash] options Metric options
|
130
|
-
def time(name, options={})
|
131
|
-
start = Time.now
|
132
|
-
yield
|
133
|
-
duration = (Time.now - start) * 1000.0 # milliseconds
|
134
|
-
metric = {name => options.merge({:value => duration})}
|
135
|
-
add metric
|
136
|
-
end
|
137
|
-
alias :benchmark :time
|
138
|
-
|
139
|
-
private
|
140
|
-
|
141
|
-
def create_persister
|
142
|
-
type = self.client.persistence.to_s.capitalize
|
143
|
-
Librato::Metrics::Persistence.const_get(type).new
|
144
|
-
end
|
145
|
-
|
146
|
-
def epoch_time
|
147
|
-
Time.now.to_i
|
148
|
-
end
|
149
|
-
|
150
86
|
end
|
151
87
|
end
|
152
88
|
end
|
data/librato-metrics.gemspec
CHANGED
@@ -25,7 +25,8 @@ Gem::Specification.new do |s|
|
|
25
25
|
|
26
26
|
## runtime dependencies
|
27
27
|
s.add_dependency 'faraday', '~>0.7.6'
|
28
|
-
s.add_dependency 'multi_json'
|
28
|
+
s.add_dependency 'multi_json', '~>1.3.1'
|
29
|
+
s.add_dependency 'aggregate', '~>0.2.2'
|
29
30
|
|
30
31
|
## development dependencies
|
31
32
|
s.add_development_dependency 'rake'
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require "spec_helper.rb"
|
2
|
+
module Librato
|
3
|
+
module Metrics
|
4
|
+
|
5
|
+
describe Aggregator do
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
@time = Time.now.to_i
|
9
|
+
Aggregator.stub(:epoch_time).and_return(@time)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "initialization" do
|
13
|
+
context "with specified client" do
|
14
|
+
it "should set to client" do
|
15
|
+
barney = Client.new
|
16
|
+
a = Aggregator.new(:client => barney)
|
17
|
+
a.client.should be barney
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "without specified client" do
|
22
|
+
it "should use Librato::Metrics client" do
|
23
|
+
a = Aggregator.new
|
24
|
+
a.client.should be Librato::Metrics.client
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "with specified source" do
|
29
|
+
it "should set to source" do
|
30
|
+
a = Aggregator.new(:source => 'rubble')
|
31
|
+
a.source.should == 'rubble'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "without specified source" do
|
36
|
+
it "should not have a source" do
|
37
|
+
a = Aggregator.new
|
38
|
+
a.source.should be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#add" do
|
44
|
+
context "with single hash argument" do
|
45
|
+
it "should record a single aggregate" do
|
46
|
+
subject.add :foo => 3000
|
47
|
+
expected = { #:measure_time => @time, TODO: support specific time
|
48
|
+
:gauges => [
|
49
|
+
{ :name => 'foo',
|
50
|
+
:count => 1,
|
51
|
+
:sum => 3000.0,
|
52
|
+
:min => 3000.0,
|
53
|
+
:max => 3000.0}
|
54
|
+
]
|
55
|
+
}
|
56
|
+
subject.queued.should equal_unordered(expected)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should aggregate multiple measurements" do
|
60
|
+
subject.add :foo => 1
|
61
|
+
subject.add :foo => 2
|
62
|
+
subject.add :foo => 3
|
63
|
+
subject.add :foo => 4
|
64
|
+
subject.add :foo => 5
|
65
|
+
expected = { :gauges => [
|
66
|
+
{ :name => 'foo',
|
67
|
+
:count => 5,
|
68
|
+
:sum => 15.0,
|
69
|
+
:min => 1.0,
|
70
|
+
:max => 5.0}
|
71
|
+
]
|
72
|
+
}
|
73
|
+
subject.queued.should equal_unordered(expected)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "with multiple hash arguments" do
|
78
|
+
it "should record a single aggregate" do
|
79
|
+
subject.add :foo => 3000
|
80
|
+
subject.add :bar => 30
|
81
|
+
expected = {
|
82
|
+
#:measure_time => @time, TODO: support specific time
|
83
|
+
:gauges => [
|
84
|
+
{ :name => 'foo',
|
85
|
+
:count => 1,
|
86
|
+
:sum => 3000.0,
|
87
|
+
:min => 3000.0,
|
88
|
+
:max => 3000.0},
|
89
|
+
{ :name => 'bar',
|
90
|
+
:count => 1,
|
91
|
+
:sum => 30.0,
|
92
|
+
:min => 30.0,
|
93
|
+
:max => 30.0},
|
94
|
+
]
|
95
|
+
}
|
96
|
+
subject.queued.should equal_unordered(expected)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should aggregate multiple measurements" do
|
100
|
+
subject.add :foo => 1
|
101
|
+
subject.add :foo => 2
|
102
|
+
subject.add :foo => 3
|
103
|
+
subject.add :foo => 4
|
104
|
+
subject.add :foo => 5
|
105
|
+
|
106
|
+
subject.add :bar => 6
|
107
|
+
subject.add :bar => 7
|
108
|
+
subject.add :bar => 8
|
109
|
+
subject.add :bar => 9
|
110
|
+
subject.add :bar => 10
|
111
|
+
expected = { :gauges => [
|
112
|
+
{ :name => 'foo',
|
113
|
+
:count => 5,
|
114
|
+
:sum => 15.0,
|
115
|
+
:min => 1.0,
|
116
|
+
:max => 5.0},
|
117
|
+
{ :name => 'bar',
|
118
|
+
:count => 5,
|
119
|
+
:sum => 40.0,
|
120
|
+
:min => 6.0,
|
121
|
+
:max => 10.0}
|
122
|
+
]
|
123
|
+
}
|
124
|
+
subject.queued.should equal_unordered(expected)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "#submit" do
|
130
|
+
before(:all) do
|
131
|
+
Librato::Metrics.authenticate 'me@librato.com', 'foo'
|
132
|
+
Librato::Metrics.persistence = :test
|
133
|
+
end
|
134
|
+
|
135
|
+
context "when successful" do
|
136
|
+
it "should flush queued metrics and return true" do
|
137
|
+
subject.add :steps => 2042, :distance => 1234
|
138
|
+
subject.submit.should be_true
|
139
|
+
subject.empty?.should be_true
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context "when failed" do
|
144
|
+
it "should preserve queue and return false" do
|
145
|
+
subject.add :steps => 2042, :distance => 1234
|
146
|
+
subject.persister.return_value(false)
|
147
|
+
subject.submit.should be_false
|
148
|
+
subject.empty?.should be_false
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "#time" do
|
154
|
+
context "with metric name only" do
|
155
|
+
it "should queue metric with timed value" do
|
156
|
+
1.upto(5) do
|
157
|
+
subject.time :sleeping do
|
158
|
+
sleep 0.1
|
159
|
+
end
|
160
|
+
end
|
161
|
+
queued = subject.queued[:gauges][0]
|
162
|
+
queued[:name].should == 'sleeping'
|
163
|
+
queued[:count].should be 5
|
164
|
+
queued[:sum].should be > 500
|
165
|
+
queued[:sum].should be_within(150).of(500)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: librato-metrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.0.
|
4
|
+
version: 0.6.0.pre3
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-26 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
16
|
-
requirement: &
|
16
|
+
requirement: &70105435038240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,32 @@ dependencies:
|
|
21
21
|
version: 0.7.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70105435038240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: multi_json
|
27
|
-
requirement: &
|
27
|
+
requirement: &70105435037740 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
|
-
- -
|
30
|
+
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: 1.3.1
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70105435037740
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: aggregate
|
38
|
+
requirement: &70105435037280 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.2.2
|
33
44
|
type: :runtime
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70105435037280
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: rake
|
38
|
-
requirement: &
|
49
|
+
requirement: &70105435036900 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70105435036900
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: rspec
|
49
|
-
requirement: &
|
60
|
+
requirement: &70105435068860 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ~>
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: 2.6.0
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70105435068860
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: pry
|
60
|
-
requirement: &
|
71
|
+
requirement: &70105435068440 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70105435068440
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: yard
|
71
|
-
requirement: &
|
82
|
+
requirement: &70105435067980 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,10 +87,10 @@ dependencies:
|
|
76
87
|
version: '0'
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70105435067980
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: rdiscount
|
82
|
-
requirement: &
|
93
|
+
requirement: &70105435067560 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ! '>='
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: '0'
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *70105435067560
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: sinatra
|
93
|
-
requirement: &
|
104
|
+
requirement: &70105435067140 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: '0'
|
99
110
|
type: :development
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *70105435067140
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: popen4
|
104
|
-
requirement: &
|
115
|
+
requirement: &70105435066720 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ! '>='
|
@@ -109,7 +120,7 @@ dependencies:
|
|
109
120
|
version: '0'
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *70105435066720
|
113
124
|
description: An easy to use ruby wrapper for Librato's Metrics API
|
114
125
|
email: matt@librato.com
|
115
126
|
executables: []
|
@@ -126,6 +137,7 @@ files:
|
|
126
137
|
- Rakefile
|
127
138
|
- benchmarks/array_vs_set.rb
|
128
139
|
- lib/librato/metrics.rb
|
140
|
+
- lib/librato/metrics/aggregator.rb
|
129
141
|
- lib/librato/metrics/client.rb
|
130
142
|
- lib/librato/metrics/collection.rb
|
131
143
|
- lib/librato/metrics/connection.rb
|
@@ -137,6 +149,7 @@ files:
|
|
137
149
|
- lib/librato/metrics/persistence.rb
|
138
150
|
- lib/librato/metrics/persistence/direct.rb
|
139
151
|
- lib/librato/metrics/persistence/test.rb
|
152
|
+
- lib/librato/metrics/processor.rb
|
140
153
|
- lib/librato/metrics/queue.rb
|
141
154
|
- lib/librato/metrics/version.rb
|
142
155
|
- librato-metrics.gemspec
|
@@ -146,6 +159,7 @@ files:
|
|
146
159
|
- spec/integration/metrics_spec.rb
|
147
160
|
- spec/rackups/status.ru
|
148
161
|
- spec/spec_helper.rb
|
162
|
+
- spec/unit/metrics/aggregator_spec.rb
|
149
163
|
- spec/unit/metrics/client_spec.rb
|
150
164
|
- spec/unit/metrics/connection_spec.rb
|
151
165
|
- spec/unit/metrics/queue_spec.rb
|
@@ -182,6 +196,7 @@ test_files:
|
|
182
196
|
- spec/integration/metrics_spec.rb
|
183
197
|
- spec/rackups/status.ru
|
184
198
|
- spec/spec_helper.rb
|
199
|
+
- spec/unit/metrics/aggregator_spec.rb
|
185
200
|
- spec/unit/metrics/client_spec.rb
|
186
201
|
- spec/unit/metrics/connection_spec.rb
|
187
202
|
- spec/unit/metrics/queue_spec.rb
|