librato-metrics 0.6.0.pre3 → 0.6.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.
@@ -3,5 +3,12 @@ rvm:
3
3
  - ree
4
4
  - 1.9.2
5
5
  - 1.9.3
6
- - jruby
7
- - rbx
6
+ - jruby-19mode
7
+ - jruby-18mode
8
+ - rbx-19mode
9
+ - rbx-18mode
10
+ - ruby-head
11
+
12
+ matrix:
13
+ allow_failures:
14
+ - rvm: ruby-head
@@ -1,5 +1,16 @@
1
1
  ## Changelog
2
2
 
3
+ ### Version 0.6.0
4
+ * Add Aggregator class for aggregating measurements client-side
5
+ * Queue and Aggregator can auto-submit on a time interval
6
+ * Queue can auto-submit on a specified volume of measurements
7
+ * Support deleting individual metrics
8
+ * Validate user-specified measurement times
9
+ * Update to MultiJSON 1.3 syntax
10
+ * Run tests for rubinius and jruby in both 1.8 and 1.9 modes
11
+ * Include request body in output for failed requests
12
+ * Documentation improvements
13
+
3
14
  ### Version 0.5.0
4
15
  * Support using multiple accounts simultaneously via Client
5
16
  * Switch network library to faraday for broader platform support and flexibility
data/README.md CHANGED
@@ -48,8 +48,20 @@ Queue up a simple gauge metric named `temperature`:
48
48
 
49
49
  queue = Librato::Metrics::Queue.new
50
50
  queue.add :temperature => 32.2
51
+
52
+ While symbols are used by convention for metric names, strings will work just as well:
53
+
54
+ queue.add 'myapp.request_time' => 86.7
55
+
56
+ If you are tracking measurements over several seconds/minutes, the queue will handle storing measurement time for you (otherwise all metrics will be recorded as measured when they are submitted).
51
57
 
52
- If you are tracking measurements over several seconds/minutes, the queue will handle storing measurement time for you (otherwise all metrics will be recorded as measured when they are submitted).
58
+ If you want to specify a time other than queuing time for the measurement:
59
+
60
+ # use a epoch integer
61
+ queue.add :humidity => {:measure_time => 1336508422, :value => 48.2}
62
+
63
+ # use a Time object to correct for a 5 second delay
64
+ queue.add :humidity => {:measure_time => Time.now-5, :value => 37.6}
53
65
 
54
66
  You can queue multiple metrics at once. Here's a gauge (`load`) and a counter (`visits`):
55
67
 
@@ -61,7 +73,7 @@ Queue up a metric with a specified source:
61
73
 
62
74
  A complete [list of metric attributes](http://dev.librato.com/v1/metrics) is available in the [API documentation](http://dev.librato.com/v1).
63
75
 
64
- Save all queued metrics:
76
+ Send currently queued measurements to Metrics:
65
77
 
66
78
  queue.submit
67
79
 
@@ -90,7 +102,7 @@ You can aggregate multiple metrics at once:
90
102
 
91
103
  aggregator.add :app_latency => 35.2, :db_latency => 120.7
92
104
 
93
- Send the current aggregated metrics to Metrics:
105
+ Send the currently aggregated metrics to Metrics:
94
106
 
95
107
  aggregator.submit
96
108
 
@@ -109,6 +121,25 @@ If you need extra attributes for a `Queue` timing measurement, simply add them o
109
121
  queue.time :my_measurement, :source => 'app1' do
110
122
  # do work...
111
123
  end
124
+
125
+ ## Auto-Submitting Metrics
126
+
127
+ Both `Queue` and `Aggregator` support automatically submitting measurements on a given time interval:
128
+
129
+ # submit once per minute
130
+ timed_queue = Librato::Metrics::Queue.new(:autosubmit_interval => 60)
131
+
132
+ # submit every 5 minutes
133
+ timed_aggregator = Librato::Metrics::Aggregator.new(:autosubmit_interval => 300)
134
+
135
+ `Queue` also supports auto-submission based on measurement volume:
136
+
137
+ # submit when the 400th measurement is queued
138
+ volume_queue = Librato::Metrics::Queue.new(:autosubmit_count => 400)
139
+
140
+ These options can also be combined for more flexible behavior.
141
+
142
+ Both options are driven by the addition of measurements. Specifically for time-based autosubmission if you are adding measurements irregularly (less than once per second), submission may lag past your specified interval until the next measurement is added.
112
143
 
113
144
  ## Querying Metrics
114
145
 
@@ -140,6 +171,15 @@ Get the 20 most recent 15 minute data point rollups for `temperature`:
140
171
 
141
172
  There are many more options supported for querying, take a look at the [REST API docs](http://dev.librato.com/v1/get/gauges/:name) or the [fetch documentation](http://rubydoc.info/github/librato/librato-metrics/master/Librato/Metrics.fetch) for more details.
142
173
 
174
+ ## Deleting Metrics
175
+
176
+ If you ever need to remove a metric and all of its measurements, doing so is easy:
177
+
178
+ # Delete the metrics 'temperature' and 'humidity'
179
+ Librato::Metrics.delete :temperature, :humidity
180
+
181
+ Note that deleted metrics and their measurements are unrecoverable, so use with care.
182
+
143
183
  ## Using Multiple Accounts Simultaneously
144
184
 
145
185
  If you need to use metrics with multiple sets of authentication credentials simultaneously, you can do it with `Client`:
@@ -63,12 +63,14 @@ module Librato
63
63
  extend SingleForwardable
64
64
 
65
65
  TYPES = [:counter, :gauge]
66
+ MIN_MEASURE_TIME = (Time.now-(3600*24*365)).to_i
66
67
 
67
68
  # Expose class methods of Simple via Metrics itself.
68
69
  #
69
70
  def_delegators :client, :agent_identifier, :api_endpoint,
70
- :api_endpoint=, :authenticate, :connection, :fetch,
71
- :list, :persistence, :persistence=, :persister, :submit
71
+ :api_endpoint=, :authenticate, :connection, :delete,
72
+ :fetch, :list, :persistence, :persistence=, :persister,
73
+ :submit
72
74
 
73
75
  # The Librato::Metrics::Client being used by module-level
74
76
  # access.
@@ -11,13 +11,13 @@ module Librato
11
11
 
12
12
  def initialize(options={})
13
13
  @aggregated = {}
14
- @client = options[:client] || Librato::Metrics.client
15
- @source = options[:source]
14
+ setup_common_options(options)
16
15
  end
17
16
 
18
17
  # Add a metric entry to the metric set:
19
18
  #
20
19
  # @param Hash metrics metrics to add
20
+ # @return Aggregator returns self
21
21
  def add(args)
22
22
  args.each do |k, v|
23
23
  value = v.respond_to?(:each) ? v[:value] : v
@@ -25,6 +25,8 @@ module Librato
25
25
  @aggregated[k] ||= Aggregate.new
26
26
  @aggregated[k] << value
27
27
  end
28
+ autosubmit_check
29
+ self
28
30
  end
29
31
 
30
32
  # Returns true if aggregate contains no measurements
@@ -59,6 +59,26 @@ module Librato
59
59
  raise CredentialsMissing unless (self.email and self.api_key)
60
60
  @connection ||= Connection.new(:client => self, :api_endpoint => api_endpoint)
61
61
  end
62
+
63
+ # Completely delete metrics with the given names. Be
64
+ # careful with this, this is instant and permanent.
65
+ #
66
+ # @example Delete metric 'temperature'
67
+ # Librato::Metrics.delete :temperature
68
+ #
69
+ # @example Delete metrics 'foo' and 'bar'
70
+ # Librato::Metrics.delete :foo, :bar
71
+ def delete(*metric_names)
72
+ raise(NoMetricsProvided, 'Metric name missing.') if metric_names.empty?
73
+ params = {:names => metric_names}
74
+ connection.delete do |request|
75
+ request.url connection.build_url("metrics")
76
+ request.body = MultiJson.dump(params)
77
+ end
78
+ # expects 204, middleware will raise exception
79
+ # otherwise.
80
+ true
81
+ end
62
82
 
63
83
  # Query metric data
64
84
  #
@@ -27,7 +27,7 @@ module Librato
27
27
  end
28
28
 
29
29
  def transport
30
- raise NoClientProvided unless @client
30
+ raise(NoClientProvided, "No client provided.") unless @client
31
31
  @transport ||= Faraday::Connection.new(:url => api_endpoint + "/v1/") do |f|
32
32
  #f.use FaradayMiddleware::EncodeJson
33
33
  f.use Librato::Metrics::Middleware::RequestBody
@@ -5,9 +5,10 @@ module Librato
5
5
  class MetricsError < StandardError; end
6
6
 
7
7
  class CredentialsMissing < MetricsError; end
8
- class AgentInfoMissing < MetricsError; end
9
8
  class NoMetricsQueued < MetricsError; end
9
+ class NoMetricsProvided < MetricsError; end
10
10
  class NoClientProvided < MetricsError; end
11
+ class InvalidMeasureTime < MetricsError; end
11
12
 
12
13
  class NetworkError < StandardError; end
13
14
 
@@ -4,7 +4,7 @@ module Librato
4
4
  module Processor
5
5
  MEASUREMENTS_PER_REQUEST = 500
6
6
 
7
- attr_reader :per_request
7
+ attr_reader :per_request, :last_submit_time
8
8
 
9
9
  # The current Client instance this queue is using to authenticate
10
10
  # and connect to Librato Metrics. This will default to the primary
@@ -26,9 +26,10 @@ module Librato
26
26
  #
27
27
  # @return Boolean
28
28
  def submit
29
- raise NoMetricsQueued if self.queued.empty?
29
+ raise(NoMetricsQueued, "No metrics queued.") if self.queued.empty?
30
30
  options = {:per_request => @per_request}
31
31
  if persister.persist(self.client, self.queued, options)
32
+ @last_submit_time = Time.now
32
33
  flush and return true
33
34
  end
34
35
  false
@@ -72,6 +73,21 @@ module Librato
72
73
  Time.now.to_i
73
74
  end
74
75
 
76
+ def setup_common_options(options)
77
+ @autosubmit_interval = options[:autosubmit_interval]
78
+ @client = options[:client] || Librato::Metrics.client
79
+ @per_request = options[:per_request] || MEASUREMENTS_PER_REQUEST
80
+ @source = options[:source]
81
+ @create_time = Time.now
82
+ end
83
+
84
+ def autosubmit_check
85
+ if @autosubmit_interval
86
+ last = @last_submit_time || @create_time
87
+ self.submit if (Time.now - last).to_i >= @autosubmit_interval
88
+ end
89
+ end
90
+
75
91
  end
76
92
 
77
93
  end
@@ -1,6 +1,5 @@
1
1
  require 'metrics/processor'
2
2
 
3
-
4
3
  module Librato
5
4
  module Metrics
6
5
  class Queue
@@ -10,15 +9,15 @@ module Librato
10
9
 
11
10
  def initialize(options={})
12
11
  @queued = {}
13
- @client = options[:client] || Librato::Metrics.client
14
- @per_request = options[:per_request] || MEASUREMENTS_PER_REQUEST
12
+ @autosubmit_count = options[:autosubmit_count]
15
13
  @skip_measurement_times = options[:skip_measurement_times]
14
+ setup_common_options(options)
16
15
  end
17
16
 
18
17
  # Add a metric entry to the metric set:
19
18
  #
20
19
  # @param Hash metrics metrics to add
21
- # @return Hash queued_metrics the currently queued metrics
20
+ # @return Queue returns self
22
21
  def add(args)
23
22
  args.each do |key, value|
24
23
  if value.respond_to?(:each)
@@ -30,13 +29,16 @@ module Librato
30
29
  type = :gauge
31
30
  end
32
31
  type = ("#{type}s").to_sym
33
- unless skip_measurement_times
34
- metric[:measure_time] ||= epoch_time
32
+ if metric[:measure_time]
33
+ check_measure_time(metric)
34
+ elsif !skip_measurement_times
35
+ metric[:measure_time] = epoch_time
35
36
  end
36
37
  @queued[type] ||= []
37
38
  @queued[type] << metric
38
39
  end
39
- queued
40
+ submit_check
41
+ self
40
42
  end
41
43
 
42
44
  # Currently queued counters
@@ -82,6 +84,21 @@ module Librato
82
84
  self.queued.inject(0) { |result, data| result + data.last.size }
83
85
  end
84
86
  alias :length :size
87
+
88
+ private
89
+
90
+ def check_measure_time(data)
91
+ if data[:measure_time].to_i < Metrics::MIN_MEASURE_TIME
92
+ raise InvalidMeasureTime, "Measure time for submitted metric (#{data}) is invalid."
93
+ end
94
+ end
95
+
96
+ def submit_check
97
+ autosubmit_check # in Processor
98
+ if @autosubmit_count && self.length >= @autosubmit_count
99
+ self.submit
100
+ end
101
+ end
85
102
 
86
103
  end
87
104
  end
@@ -1,5 +1,5 @@
1
1
  module Librato
2
2
  module Metrics
3
- VERSION = "0.6.0.pre3"
3
+ VERSION = "0.6.0"
4
4
  end
5
5
  end
@@ -33,9 +33,11 @@ Gem::Specification.new do |s|
33
33
  s.add_development_dependency 'rspec', '~>2.6.0'
34
34
  s.add_development_dependency 'pry'
35
35
  s.add_development_dependency 'yard'
36
- s.add_development_dependency 'rdiscount' # for yard
37
36
  s.add_development_dependency 'sinatra'
38
37
  s.add_development_dependency 'popen4'
38
+
39
+ # omitting for now because jruby-19mode can't handle
40
+ #s.add_development_dependency 'rdiscount' # for yard
39
41
 
40
42
  s.files = `git ls-files`.split("\n")
41
43
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -37,6 +37,7 @@ module Librato
37
37
  gauge['unassigned'][0]['value'].should == 5
38
38
  end
39
39
  end
40
+
40
41
  end
41
42
 
42
43
  end
@@ -4,6 +4,45 @@ module Librato
4
4
  describe Metrics do
5
5
  before(:all) { prep_integration_tests }
6
6
 
7
+ describe "#delete" do
8
+ before(:each) { delete_all_metrics }
9
+
10
+ context "with a single argument" do
11
+ it "should delete named metric" do
12
+ Metrics.submit :foo => 123
13
+ Metrics.list(:name => :foo).should_not be_empty
14
+ Metrics.delete :foo
15
+ Metrics.list(:name => :foo).should be_empty
16
+ end
17
+ end
18
+
19
+ context "with multiple arguments" do
20
+ it "should delete named metrics" do
21
+ Metrics.submit :foo => 123, :bar => 345, :baz => 567
22
+ Metrics.delete :foo, :bar
23
+ Metrics.list(:name => :foo).should be_empty
24
+ Metrics.list(:name => :bar).should be_empty
25
+ Metrics.list(:name => :baz).should_not be_empty
26
+ end
27
+ end
28
+
29
+ context "with missing metric" do
30
+ it "should run cleanly" do
31
+ # the API currently returns success even if
32
+ # the metric has already been deleted or is absent.
33
+ Metrics.delete :missing
34
+ end
35
+ end
36
+
37
+ context "with no arguments" do
38
+ it "should not make request" do
39
+ lambda {
40
+ Metrics.delete
41
+ }.should raise_error(Metrics::NoMetricsProvided)
42
+ end
43
+ end
44
+ end
45
+
7
46
  describe "#fetch" do
8
47
  before(:all) do
9
48
  delete_all_metrics
@@ -41,6 +41,10 @@ module Librato
41
41
  end
42
42
 
43
43
  describe "#add" do
44
+ it "should allow chaining" do
45
+ subject.add(:foo => 1234).should == subject
46
+ end
47
+
44
48
  context "with single hash argument" do
45
49
  it "should record a single aggregate" do
46
50
  subject.add :foo => 3000
@@ -161,11 +165,33 @@ module Librato
161
165
  queued = subject.queued[:gauges][0]
162
166
  queued[:name].should == 'sleeping'
163
167
  queued[:count].should be 5
164
- queued[:sum].should be > 500
168
+ queued[:sum].should be >= 500.0
165
169
  queued[:sum].should be_within(150).of(500)
166
170
  end
167
171
  end
168
172
  end
173
+
174
+ context "with an autosubmit interval" do
175
+ let(:client) do
176
+ client = Client.new
177
+ client.persistence = :test
178
+ client
179
+ end
180
+
181
+ it "should not submit immediately" do
182
+ timed_agg = Aggregator.new(:client => client, :autosubmit_interval => 1)
183
+ timed_agg.add :foo => 1
184
+ timed_agg.persister.persisted.should be_nil # nothing sent
185
+ end
186
+
187
+ it "should submit after interval" do
188
+ timed_agg = Aggregator.new(:client => client, :autosubmit_interval => 1)
189
+ timed_agg.add :foo => 1
190
+ sleep 1
191
+ timed_agg.add :foo => 2
192
+ timed_agg.persister.persisted.should_not be_nil # sent
193
+ end
194
+ end
169
195
 
170
196
  end
171
197
 
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+
3
+ module Librato
4
+ module Metrics
5
+
6
+ describe Queue do
7
+
8
+ let(:client) {
9
+ client = Client.new
10
+ client.persistence = :test
11
+ client
12
+ }
13
+
14
+ context "with an autosubmit count" do
15
+ it "should submit when the max is reached" do
16
+ vol_queue = Queue.new(:client => client, :autosubmit_count => 2)
17
+ vol_queue.add :foo => 1
18
+ vol_queue.add :bar => 2
19
+ vol_queue.persister.persisted.should_not be_nil # sent
20
+ end
21
+
22
+ it "should not submit if the max has not been reached" do
23
+ vol_queue = Queue.new(:client => client, :autosubmit_count => 5)
24
+ vol_queue.add :foo => 1
25
+ vol_queue.add :bar => 2
26
+ vol_queue.persister.persisted.should be_nil # nothing sent
27
+ end
28
+ end
29
+
30
+ context "with an autosubmit interval" do
31
+ it "should not submit immediately" do
32
+ vol_queue = Queue.new(:client => client, :autosubmit_interval => 1)
33
+ vol_queue.add :foo => 1
34
+ vol_queue.persister.persisted.should be_nil # nothing sent
35
+ end
36
+
37
+ it "should submit after interval" do
38
+ vol_queue = Queue.new(:client => client, :autosubmit_interval => 1)
39
+ vol_queue.add :foo => 1
40
+ sleep 1
41
+ vol_queue.add :foo => 2
42
+ vol_queue.persister.persisted.should_not be_nil # sent
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -28,6 +28,10 @@ module Librato
28
28
  end
29
29
 
30
30
  describe "#add" do
31
+ it "should allow chaining" do
32
+ subject.add(:foo => 123).should == subject
33
+ end
34
+
31
35
  context "with single hash argument" do
32
36
  it "should record a key-value gauge" do
33
37
  expected = {:gauges => [{:name => 'foo', :value => 3000, :measure_time => @time}]}
@@ -78,6 +82,32 @@ module Librato
78
82
  subject.queued.should equal_unordered(expected)
79
83
  end
80
84
  end
85
+
86
+ context "with a measure_time" do
87
+ it "should accept time objects" do
88
+ time = Time.now-5
89
+ subject.add :foo => {:measure_time => time, :value => 123}
90
+ subject.queued[:gauges][0][:measure_time].should == time
91
+ end
92
+
93
+ it "should accept integers" do
94
+ time = 1336574713
95
+ subject.add :foo => {:measure_time => time, :value => 123}
96
+ subject.queued[:gauges][0][:measure_time].should == time
97
+ end
98
+
99
+ it "should accept strings" do
100
+ time = '1336574713'
101
+ subject.add :foo => {:measure_time => time, :value => 123}
102
+ subject.queued[:gauges][0][:measure_time].should == time
103
+ end
104
+
105
+ it "should raise exception in invalid time" do
106
+ lambda {
107
+ subject.add :foo => {:measure_time => '12', :value => 123}
108
+ }.should raise_error(InvalidMeasureTime)
109
+ end
110
+ end
81
111
  end
82
112
 
83
113
  describe "#counters" do
@@ -115,6 +145,19 @@ module Librato
115
145
  end
116
146
  end
117
147
 
148
+ describe "#last_submit_time" do
149
+ it "should default to nil" do
150
+ subject.last_submit_time.should be_nil
151
+ end
152
+
153
+ it "should store last submission time" do
154
+ prior = Time.now
155
+ subject.add :foo => 123
156
+ subject.submit
157
+ subject.last_submit_time.should >= prior
158
+ end
159
+ end
160
+
118
161
  describe "#per_request" do
119
162
  it "should default to 500" do
120
163
  subject.per_request.should == 500
@@ -186,7 +229,7 @@ module Librato
186
229
  end
187
230
  end
188
231
 
189
- end # MetricSet
232
+ end # Queue
190
233
 
191
234
  end
192
235
  end
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: librato-metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0.pre3
5
- prerelease: 6
4
+ version: 0.6.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Matt Sanders
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-26 00:00:00.000000000Z
12
+ date: 2012-05-09 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
16
- requirement: &70105435038240 !ruby/object:Gem::Requirement
16
+ requirement: &70349186771660 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.7.6
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70105435038240
24
+ version_requirements: *70349186771660
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: multi_json
27
- requirement: &70105435037740 !ruby/object:Gem::Requirement
27
+ requirement: &70349186771180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.3.1
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70105435037740
35
+ version_requirements: *70349186771180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: aggregate
38
- requirement: &70105435037280 !ruby/object:Gem::Requirement
38
+ requirement: &70349186770720 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.2.2
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70105435037280
46
+ version_requirements: *70349186770720
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &70105435036900 !ruby/object:Gem::Requirement
49
+ requirement: &70349186802320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70105435036900
57
+ version_requirements: *70349186802320
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &70105435068860 !ruby/object:Gem::Requirement
60
+ requirement: &70349186801780 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 2.6.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70105435068860
68
+ version_requirements: *70349186801780
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
- requirement: &70105435068440 !ruby/object:Gem::Requirement
71
+ requirement: &70349186801360 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70105435068440
79
+ version_requirements: *70349186801360
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: yard
82
- requirement: &70105435067980 !ruby/object:Gem::Requirement
82
+ requirement: &70349186800900 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,21 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70105435067980
91
- - !ruby/object:Gem::Dependency
92
- name: rdiscount
93
- requirement: &70105435067560 !ruby/object:Gem::Requirement
94
- none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
99
- type: :development
100
- prerelease: false
101
- version_requirements: *70105435067560
90
+ version_requirements: *70349186800900
102
91
  - !ruby/object:Gem::Dependency
103
92
  name: sinatra
104
- requirement: &70105435067140 !ruby/object:Gem::Requirement
93
+ requirement: &70349186800480 !ruby/object:Gem::Requirement
105
94
  none: false
106
95
  requirements:
107
96
  - - ! '>='
@@ -109,10 +98,10 @@ dependencies:
109
98
  version: '0'
110
99
  type: :development
111
100
  prerelease: false
112
- version_requirements: *70105435067140
101
+ version_requirements: *70349186800480
113
102
  - !ruby/object:Gem::Dependency
114
103
  name: popen4
115
- requirement: &70105435066720 !ruby/object:Gem::Requirement
104
+ requirement: &70349186800060 !ruby/object:Gem::Requirement
116
105
  none: false
117
106
  requirements:
118
107
  - - ! '>='
@@ -120,7 +109,7 @@ dependencies:
120
109
  version: '0'
121
110
  type: :development
122
111
  prerelease: false
123
- version_requirements: *70105435066720
112
+ version_requirements: *70349186800060
124
113
  description: An easy to use ruby wrapper for Librato's Metrics API
125
114
  email: matt@librato.com
126
115
  executables: []
@@ -162,6 +151,7 @@ files:
162
151
  - spec/unit/metrics/aggregator_spec.rb
163
152
  - spec/unit/metrics/client_spec.rb
164
153
  - spec/unit/metrics/connection_spec.rb
154
+ - spec/unit/metrics/queue/autosubmission_spec.rb
165
155
  - spec/unit/metrics/queue_spec.rb
166
156
  - spec/unit/metrics_spec.rb
167
157
  homepage: https://github.com/librato/librato-metrics
@@ -180,9 +170,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
170
  required_rubygems_version: !ruby/object:Gem::Requirement
181
171
  none: false
182
172
  requirements:
183
- - - ! '>'
173
+ - - ! '>='
184
174
  - !ruby/object:Gem::Version
185
- version: 1.3.1
175
+ version: '0'
186
176
  requirements: []
187
177
  rubyforge_project:
188
178
  rubygems_version: 1.8.16
@@ -199,6 +189,7 @@ test_files:
199
189
  - spec/unit/metrics/aggregator_spec.rb
200
190
  - spec/unit/metrics/client_spec.rb
201
191
  - spec/unit/metrics/connection_spec.rb
192
+ - spec/unit/metrics/queue/autosubmission_spec.rb
202
193
  - spec/unit/metrics/queue_spec.rb
203
194
  - spec/unit/metrics_spec.rb
204
195
  has_rdoc: