librato-metrics 0.7.3 → 0.7.4
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.
- data/CHANGELOG.md +4 -0
- data/README.md +0 -7
- data/lib/librato/metrics.rb +3 -2
- data/lib/librato/metrics/aggregator.rb +3 -2
- data/lib/librato/metrics/client.rb +10 -10
- data/lib/librato/metrics/collection.rb +2 -2
- data/lib/librato/metrics/connection.rb +16 -16
- data/lib/librato/metrics/errors.rb +3 -3
- data/lib/librato/metrics/middleware/count_requests.rb +5 -6
- data/lib/librato/metrics/middleware/expects_status.rb +4 -4
- data/lib/librato/metrics/middleware/retry.rb +4 -4
- data/lib/librato/metrics/persistence/direct.rb +4 -4
- data/lib/librato/metrics/processor.rb +10 -9
- data/lib/librato/metrics/queue.rb +6 -5
- data/lib/librato/metrics/smart_json.rb +31 -0
- data/lib/librato/metrics/version.rb +1 -1
- data/librato-metrics.gemspec +2 -2
- data/spec/integration/metrics/connection_spec.rb +4 -4
- data/spec/integration/metrics/middleware/count_requests_spec.rb +6 -6
- data/spec/integration/metrics/queue_spec.rb +9 -9
- data/spec/integration/metrics_spec.rb +11 -11
- data/spec/rackups/status.ru +1 -1
- data/spec/spec_helper.rb +6 -6
- data/spec/unit/metrics/aggregator_spec.rb +24 -9
- data/spec/unit/metrics/connection_spec.rb +10 -10
- data/spec/unit/metrics/queue/autosubmission_spec.rb +4 -4
- data/spec/unit/metrics/queue_spec.rb +38 -23
- metadata +8 -7
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
### Version 0.7.4
|
4
|
+
* Support global measure_time option for Queues/Aggregators
|
5
|
+
* Support all versions of multi_json so we can relax version constraint_
|
6
|
+
|
3
7
|
### Version 0.7.3
|
4
8
|
* Allow prefixes to be changed after instantiation on Queues/Aggregators
|
5
9
|
|
data/README.md
CHANGED
@@ -217,13 +217,6 @@ Once the queue is associated you can use it normally:
|
|
217
217
|
|
218
218
|
The `librato-metrics` gem currently does not do internal locking for thread safety. When used in multi-threaded applications, please add your own mutexes for sensitive operations.
|
219
219
|
|
220
|
-
## Feature Roadmap
|
221
|
-
|
222
|
-
These are features we expect to add in future versions, roughly in the order of current priority. If you feel strongly about a feature, feel free to [create an issue](https://github.com/librato/librato-metrics/issues) or [join us in live chat](https://librato.campfirenow.com/269d3) and talk to us about it.
|
223
|
-
|
224
|
-
* Queue objects support a single default measure_time to use for any measurements which don't have it set
|
225
|
-
* Query actions return a collection object which auto-paginates large result sets
|
226
|
-
|
227
220
|
## Contribution
|
228
221
|
|
229
222
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/lib/librato/metrics.rb
CHANGED
@@ -11,6 +11,7 @@ require 'metrics/connection'
|
|
11
11
|
require 'metrics/errors'
|
12
12
|
require 'metrics/persistence'
|
13
13
|
require 'metrics/queue'
|
14
|
+
require 'metrics/smart_json'
|
14
15
|
require 'metrics/version'
|
15
16
|
|
16
17
|
module Librato
|
@@ -69,8 +70,8 @@ module Librato
|
|
69
70
|
# Expose class methods of Simple via Metrics itself.
|
70
71
|
#
|
71
72
|
def_delegators :client, :agent_identifier, :api_endpoint,
|
72
|
-
:api_endpoint=, :authenticate, :connection, :delete,
|
73
|
-
:fetch, :list, :persistence, :persistence=, :persister,
|
73
|
+
:api_endpoint=, :authenticate, :connection, :delete,
|
74
|
+
:fetch, :list, :persistence, :persistence=, :persister,
|
74
75
|
:submit, :update
|
75
76
|
|
76
77
|
# The Librato::Metrics::Client being used by module-level
|
@@ -6,7 +6,7 @@ module Librato
|
|
6
6
|
|
7
7
|
class Aggregator
|
8
8
|
SOURCE_SEPARATOR = '%%' # must not be in valid source name criteria
|
9
|
-
|
9
|
+
|
10
10
|
include Processor
|
11
11
|
|
12
12
|
attr_reader :source
|
@@ -40,7 +40,7 @@ module Librato
|
|
40
40
|
autosubmit_check
|
41
41
|
self
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# Returns true if aggregate contains no measurements
|
45
45
|
#
|
46
46
|
# @return Boolean
|
@@ -80,6 +80,7 @@ module Librato
|
|
80
80
|
|
81
81
|
req = { :gauges => gauges }
|
82
82
|
req[:source] = @source if @source
|
83
|
+
req[:measure_time] = @measure_time if @measure_time
|
83
84
|
|
84
85
|
req
|
85
86
|
end
|
@@ -59,7 +59,7 @@ 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
|
-
|
62
|
+
|
63
63
|
# Overrride user agent for this client's connections. If you
|
64
64
|
# are trying to specify an agent identifier for developer
|
65
65
|
# program, see #agent_identifier.
|
@@ -68,17 +68,17 @@ module Librato
|
|
68
68
|
@user_agent = agent
|
69
69
|
@connection = nil
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def custom_user_agent
|
73
73
|
@user_agent
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
# Completely delete metrics with the given names. Be
|
77
77
|
# careful with this, this is instant and permanent.
|
78
78
|
#
|
79
79
|
# @example Delete metric 'temperature'
|
80
80
|
# Librato::Metrics.delete :temperature
|
81
|
-
#
|
81
|
+
#
|
82
82
|
# @example Delete metrics 'foo' and 'bar'
|
83
83
|
# Librato::Metrics.delete :foo, :bar
|
84
84
|
def delete(*metric_names)
|
@@ -87,7 +87,7 @@ module Librato
|
|
87
87
|
params = {:names => metric_names }
|
88
88
|
connection.delete do |request|
|
89
89
|
request.url connection.build_url("metrics")
|
90
|
-
request.body =
|
90
|
+
request.body = SmartJSON.write(params)
|
91
91
|
end
|
92
92
|
# expects 204, middleware will raise exception
|
93
93
|
# otherwise.
|
@@ -137,7 +137,7 @@ module Librato
|
|
137
137
|
# expects 200
|
138
138
|
url = connection.build_url("metrics/#{metric}", query)
|
139
139
|
response = connection.get(url)
|
140
|
-
parsed =
|
140
|
+
parsed = SmartJSON.read(response.body)
|
141
141
|
# TODO: pagination support
|
142
142
|
query.empty? ? parsed : parsed["measurements"]
|
143
143
|
end
|
@@ -198,13 +198,13 @@ module Librato
|
|
198
198
|
# Submit all queued metrics.
|
199
199
|
#
|
200
200
|
def submit(args)
|
201
|
-
@queue ||= Queue.new(:client => self,
|
202
|
-
:skip_measurement_times => true,
|
201
|
+
@queue ||= Queue.new(:client => self,
|
202
|
+
:skip_measurement_times => true,
|
203
203
|
:clear_failures => true)
|
204
204
|
@queue.add args
|
205
205
|
@queue.submit
|
206
206
|
end
|
207
|
-
|
207
|
+
|
208
208
|
# Update metric with the given name.
|
209
209
|
#
|
210
210
|
# @example Update metric 'temperature'
|
@@ -216,7 +216,7 @@ module Librato
|
|
216
216
|
def update(metric, options = {})
|
217
217
|
connection.put do |request|
|
218
218
|
request.url connection.build_url("metrics/#{metric}")
|
219
|
-
request.body =
|
219
|
+
request.body = SmartJSON.write(options)
|
220
220
|
end
|
221
221
|
end
|
222
222
|
|
@@ -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 =
|
17
|
+
parsed = SmartJSON.read(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 =
|
25
|
+
parsed = SmartJSON.read(response.body)
|
26
26
|
results.push(*parsed["metrics"])
|
27
27
|
query[:offset] += MAX_RESULTS
|
28
28
|
end while query[:offset] < parsed["query"]["found"]
|
@@ -6,37 +6,37 @@ require 'metrics/middleware/retry'
|
|
6
6
|
|
7
7
|
module Librato
|
8
8
|
module Metrics
|
9
|
-
|
9
|
+
|
10
10
|
class Connection
|
11
11
|
extend Forwardable
|
12
|
-
|
13
|
-
DEFAULT_API_ENDPOINT = 'https://metrics-api.librato.com'
|
14
|
-
|
12
|
+
|
13
|
+
DEFAULT_API_ENDPOINT = 'https://metrics-api.librato.com'
|
14
|
+
|
15
15
|
def_delegators :transport, :get, :post, :head, :put, :delete,
|
16
16
|
:build_url
|
17
|
-
|
17
|
+
|
18
18
|
def initialize(options={})
|
19
19
|
@client = options[:client]
|
20
20
|
@api_endpoint = options[:api_endpoint]
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
# API endpoint that will be used for requests.
|
24
24
|
#
|
25
25
|
def api_endpoint
|
26
26
|
@api_endpoint || DEFAULT_API_ENDPOINT
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def transport
|
30
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
|
34
34
|
f.use Librato::Metrics::Middleware::Retry
|
35
|
-
f.use Librato::Metrics::Middleware::CountRequests
|
36
|
-
|
35
|
+
f.use Librato::Metrics::Middleware::CountRequests
|
36
|
+
|
37
37
|
f.use Librato::Metrics::Middleware::ExpectsStatus
|
38
38
|
#f.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
|
39
|
-
|
39
|
+
|
40
40
|
f.adapter Faraday.default_adapter
|
41
41
|
end.tap do |transport|
|
42
42
|
transport.headers[:user_agent] = user_agent
|
@@ -44,7 +44,7 @@ module Librato
|
|
44
44
|
transport.basic_auth @client.email, @client.api_key
|
45
45
|
end
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
# User-agent used when making requests.
|
49
49
|
#
|
50
50
|
def user_agent
|
@@ -61,7 +61,7 @@ module Librato
|
|
61
61
|
#ua_chunks << "(#{transport_adapter})"
|
62
62
|
ua_chunks.join(' ')
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
private
|
66
66
|
|
67
67
|
def adapter_version
|
@@ -82,17 +82,17 @@ module Librato
|
|
82
82
|
return RUBY_ENGINE if Object.constants.include?(:RUBY_ENGINE)
|
83
83
|
RUBY_DESCRIPTION.split[0]
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
# figure out which adapter faraday is using
|
87
87
|
def transport_adapter
|
88
88
|
transport.builder.handlers.each do |handler|
|
89
89
|
if handler.name[0,16] == "Faraday::Adapter"
|
90
90
|
return handler.name[18..-1]
|
91
|
-
end
|
91
|
+
end
|
92
92
|
end
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
end
|
98
98
|
end
|
@@ -10,15 +10,15 @@ module Librato
|
|
10
10
|
class NoClientProvided < MetricsError; end
|
11
11
|
class InvalidMeasureTime < MetricsError; end
|
12
12
|
class NotMergeable < MetricsError; end
|
13
|
-
|
13
|
+
|
14
14
|
class NetworkError < StandardError; end
|
15
|
-
|
15
|
+
|
16
16
|
class ClientError < NetworkError; end
|
17
17
|
class Unauthorized < ClientError; end
|
18
18
|
class Forbidden < ClientError; end
|
19
19
|
class NotFound < ClientError; end
|
20
20
|
class EntityAlreadyExists < ClientError; end
|
21
|
-
|
21
|
+
|
22
22
|
class ServerError < NetworkError; end
|
23
23
|
|
24
24
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
module Librato
|
2
2
|
module Metrics
|
3
3
|
module Middleware
|
4
|
-
|
4
|
+
|
5
5
|
class CountRequests < Faraday::Response::Middleware
|
6
6
|
@total_requests = 0
|
7
|
-
|
7
|
+
|
8
8
|
class << self
|
9
9
|
attr_reader :total_requests
|
10
|
-
|
10
|
+
|
11
11
|
def increment
|
12
12
|
@total_requests += 1
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def reset
|
16
16
|
@total_requests = 0
|
17
17
|
end
|
@@ -22,8 +22,7 @@ module Librato
|
|
22
22
|
@app.call(env)
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Librato
|
2
2
|
module Metrics
|
3
3
|
module Middleware
|
4
|
-
|
4
|
+
|
5
5
|
class ExpectsStatus < Faraday::Response::Middleware
|
6
|
-
|
6
|
+
|
7
7
|
def on_complete(env)
|
8
8
|
# TODO: make exception output prettier
|
9
9
|
case env[:status]
|
@@ -21,9 +21,9 @@ module Librato
|
|
21
21
|
raise ServerError, env.to_s
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -2,9 +2,9 @@
|
|
2
2
|
module Librato
|
3
3
|
module Metrics
|
4
4
|
module Middleware
|
5
|
-
|
5
|
+
|
6
6
|
class Retry < Faraday::Middleware
|
7
|
-
|
7
|
+
|
8
8
|
def initialize(app, retries = 3)
|
9
9
|
@retries = retries
|
10
10
|
super(app)
|
@@ -21,9 +21,9 @@ module Librato
|
|
21
21
|
raise
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -17,14 +17,14 @@ module Librato
|
|
17
17
|
requests = [queued]
|
18
18
|
end
|
19
19
|
requests.each do |request|
|
20
|
-
payload =
|
20
|
+
payload = SmartJSON.write(request)
|
21
21
|
# expects 200
|
22
22
|
client.connection.post('metrics', payload)
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
private
|
27
|
-
|
27
|
+
|
28
28
|
def chunk_queued(queued, per_request)
|
29
29
|
return [queued] if queue_count(queued) <= per_request
|
30
30
|
reqs = []
|
@@ -42,7 +42,7 @@ module Librato
|
|
42
42
|
end
|
43
43
|
reqs
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
def queue_count(queued)
|
47
47
|
queued.inject(0) { |result, data| result + data.last.size }
|
48
48
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module Librato
|
2
2
|
module Metrics
|
3
|
-
|
3
|
+
|
4
4
|
module Processor
|
5
5
|
MEASUREMENTS_PER_REQUEST = 500
|
6
|
-
|
6
|
+
|
7
7
|
attr_reader :per_request, :last_submit_time
|
8
8
|
attr_accessor :prefix
|
9
|
-
|
9
|
+
|
10
10
|
# The current Client instance this queue is using to authenticate
|
11
11
|
# and connect to Librato Metrics. This will default to the primary
|
12
12
|
# client used by the Librato::Metrics module unless it has been
|
@@ -39,7 +39,7 @@ module Librato
|
|
39
39
|
clear if @clear_on_failure
|
40
40
|
raise
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
# Capture execution time for a block and queue
|
44
44
|
# it as the value for a metric. Times are recorded
|
45
45
|
# in milliseconds.
|
@@ -67,7 +67,7 @@ module Librato
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
alias :benchmark :time
|
70
|
-
|
70
|
+
|
71
71
|
private
|
72
72
|
|
73
73
|
def create_persister
|
@@ -78,25 +78,26 @@ module Librato
|
|
78
78
|
def epoch_time
|
79
79
|
Time.now.to_i
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
def setup_common_options(options)
|
83
83
|
@autosubmit_interval = options[:autosubmit_interval]
|
84
84
|
@client = options[:client] || Librato::Metrics.client
|
85
85
|
@per_request = options[:per_request] || MEASUREMENTS_PER_REQUEST
|
86
86
|
@source = options[:source]
|
87
|
+
@measure_time = options[:measure_time]
|
87
88
|
@create_time = Time.now
|
88
89
|
@clear_on_failure = options[:clear_failures] || false
|
89
90
|
@prefix = options[:prefix]
|
90
91
|
end
|
91
|
-
|
92
|
+
|
92
93
|
def autosubmit_check
|
93
94
|
if @autosubmit_interval
|
94
95
|
last = @last_submit_time || @create_time
|
95
96
|
self.submit if (Time.now - last).to_i >= @autosubmit_interval
|
96
97
|
end
|
97
98
|
end
|
98
|
-
|
99
|
+
|
99
100
|
end
|
100
|
-
|
101
|
+
|
101
102
|
end
|
102
103
|
end
|
@@ -71,7 +71,7 @@ module Librato
|
|
71
71
|
def gauges
|
72
72
|
@queued[:gauges] || []
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
# Combines queueable measures from the given object
|
76
76
|
# into this queue.
|
77
77
|
#
|
@@ -108,6 +108,7 @@ module Librato
|
|
108
108
|
return {} if @queued.empty?
|
109
109
|
globals = {}
|
110
110
|
globals[:source] = @source if @source
|
111
|
+
globals[:measure_time] = @measure_time if @measure_time
|
111
112
|
@queued.merge(globals)
|
112
113
|
end
|
113
114
|
|
@@ -118,15 +119,15 @@ module Librato
|
|
118
119
|
self.queued.inject(0) { |result, data| result + data.last.size }
|
119
120
|
end
|
120
121
|
alias :length :size
|
121
|
-
|
122
|
+
|
122
123
|
private
|
123
|
-
|
124
|
+
|
124
125
|
def check_measure_time(data)
|
125
126
|
if data[:measure_time].to_i < Metrics::MIN_MEASURE_TIME
|
126
127
|
raise InvalidMeasureTime, "Measure time for submitted metric (#{data}) is invalid."
|
127
128
|
end
|
128
129
|
end
|
129
|
-
|
130
|
+
|
130
131
|
def reconcile_source(measurements, source)
|
131
132
|
return measurements if !source || source == @source
|
132
133
|
measurements.map! do |measurement|
|
@@ -137,7 +138,7 @@ module Librato
|
|
137
138
|
end
|
138
139
|
measurements
|
139
140
|
end
|
140
|
-
|
141
|
+
|
141
142
|
def submit_check
|
142
143
|
autosubmit_check # in Processor
|
143
144
|
if @autosubmit_count && self.length >= @autosubmit_count
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# wrap MultiJSON's implementation so we can use any version
|
2
|
+
module Librato
|
3
|
+
module Metrics
|
4
|
+
class SmartJSON
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
# prefer modern syntax; def once at startup
|
9
|
+
if MultiJson.respond_to?(:load)
|
10
|
+
def read(json)
|
11
|
+
MultiJson.load(json)
|
12
|
+
end
|
13
|
+
|
14
|
+
def write(data)
|
15
|
+
MultiJson.dump(data)
|
16
|
+
end
|
17
|
+
else
|
18
|
+
def read(json)
|
19
|
+
MultiJson.decode(json)
|
20
|
+
end
|
21
|
+
|
22
|
+
def write(data)
|
23
|
+
MultiJson.encode(data)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/librato-metrics.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
|
26
26
|
## runtime dependencies
|
27
27
|
s.add_dependency 'faraday', '~> 0.7'
|
28
|
-
s.add_dependency 'multi_json'
|
28
|
+
s.add_dependency 'multi_json'
|
29
29
|
s.add_dependency 'aggregate', '~> 0.2.2'
|
30
30
|
|
31
31
|
## development dependencies
|
@@ -35,7 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
s.add_development_dependency 'yard'
|
36
36
|
s.add_development_dependency 'sinatra'
|
37
37
|
s.add_development_dependency 'popen4'
|
38
|
-
|
38
|
+
|
39
39
|
# omitting for now because jruby-19mode can't handle
|
40
40
|
#s.add_development_dependency 'rdiscount' # for yard
|
41
41
|
|
@@ -3,26 +3,26 @@ require 'spec_helper'
|
|
3
3
|
module Librato
|
4
4
|
module Metrics
|
5
5
|
module Middleware
|
6
|
-
|
6
|
+
|
7
7
|
describe CountRequests do
|
8
8
|
before(:all) { prep_integration_tests }
|
9
|
-
|
9
|
+
|
10
10
|
it "should count requests" do
|
11
11
|
CountRequests.reset
|
12
12
|
Metrics.submit :foo => 123
|
13
13
|
Metrics.submit :foo => 135
|
14
|
-
CountRequests.total_requests.should == 2
|
14
|
+
CountRequests.total_requests.should == 2
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
it "should be resettable" do
|
18
18
|
Metrics.submit :foo => 123
|
19
19
|
CountRequests.total_requests.should > 0
|
20
20
|
CountRequests.reset
|
21
21
|
CountRequests.total_requests.should == 0
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -2,11 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Librato
|
4
4
|
module Metrics
|
5
|
-
|
5
|
+
|
6
6
|
describe Queue do
|
7
7
|
before(:all) { prep_integration_tests }
|
8
8
|
before(:each) { delete_all_metrics }
|
9
|
-
|
9
|
+
|
10
10
|
context "with a large number of metrics" do
|
11
11
|
it "should submit them in multiple requests" do
|
12
12
|
Middleware::CountRequests.reset
|
@@ -17,7 +17,7 @@ module Librato
|
|
17
17
|
queue.submit
|
18
18
|
Middleware::CountRequests.total_requests.should == 4
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it "should persist all metrics" do
|
22
22
|
queue = Queue.new(:per_request => 2)
|
23
23
|
(1..5).each do |i|
|
@@ -27,7 +27,7 @@ module Librato
|
|
27
27
|
queue.add "counter_#{i}" => {:type => :counter, :value => i}
|
28
28
|
end
|
29
29
|
queue.submit
|
30
|
-
|
30
|
+
|
31
31
|
metrics = Metrics.list
|
32
32
|
metrics.length.should == 8
|
33
33
|
counter = Metrics.fetch :counter_3, :count => 1
|
@@ -36,21 +36,21 @@ module Librato
|
|
36
36
|
gauge['unassigned'][0]['value'].should == 5
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
it "should respect default and individual sources" do
|
41
41
|
queue = Queue.new(:source => 'default')
|
42
42
|
queue.add :foo => 123
|
43
43
|
queue.add :bar => {:value => 456, :source => 'barsource'}
|
44
44
|
queue.submit
|
45
|
-
|
45
|
+
|
46
46
|
foo = Metrics.fetch :foo, :count => 2
|
47
47
|
foo['default'][0]['value'].should == 123
|
48
|
-
|
48
|
+
|
49
49
|
bar = Metrics.fetch :bar, :count => 2
|
50
50
|
bar['barsource'][0]['value'].should == 456
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
end
|
56
56
|
end
|
@@ -6,7 +6,7 @@ module Librato
|
|
6
6
|
|
7
7
|
describe "#delete" do
|
8
8
|
before(:each) { delete_all_metrics }
|
9
|
-
|
9
|
+
|
10
10
|
context "with a single argument" do
|
11
11
|
it "should delete named metric" do
|
12
12
|
Metrics.submit :foo => 123
|
@@ -15,7 +15,7 @@ module Librato
|
|
15
15
|
Metrics.list(:name => :foo).should be_empty
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
context "with multiple arguments" do
|
20
20
|
it "should delete named metrics" do
|
21
21
|
Metrics.submit :foo => 123, :bar => 345, :baz => 567
|
@@ -25,7 +25,7 @@ module Librato
|
|
25
25
|
Metrics.list(:name => :baz).should_not be_empty
|
26
26
|
end
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
context "with missing metric" do
|
30
30
|
it "should run cleanly" do
|
31
31
|
# the API currently returns success even if
|
@@ -33,7 +33,7 @@ module Librato
|
|
33
33
|
Metrics.delete :missing
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
context "with no arguments" do
|
38
38
|
it "should not make request" do
|
39
39
|
lambda {
|
@@ -150,7 +150,7 @@ module Librato
|
|
150
150
|
data['baz'][0]['value'] == 456.0
|
151
151
|
end
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
it "should not retain errors" do
|
155
155
|
delete_all_metrics
|
156
156
|
Metrics.submit :foo => {:type => :counter, :value => 12}
|
@@ -163,15 +163,15 @@ module Librato
|
|
163
163
|
end
|
164
164
|
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
describe "#update" do
|
168
|
-
|
168
|
+
|
169
169
|
context "with existing metric" do
|
170
170
|
before do
|
171
171
|
delete_all_metrics
|
172
172
|
Metrics.submit :foo => 123
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
it "should upate the metric" do
|
176
176
|
Metrics.update :foo, :display_name => "Foo Metric",
|
177
177
|
:period => 15,
|
@@ -184,7 +184,7 @@ module Librato
|
|
184
184
|
foo['attributes'].should == {'display_max' => 1000}
|
185
185
|
end
|
186
186
|
end
|
187
|
-
|
187
|
+
|
188
188
|
context "without an existing metric" do
|
189
189
|
it "should create the metric if type specified" do
|
190
190
|
delete_all_metrics
|
@@ -199,7 +199,7 @@ module Librato
|
|
199
199
|
foo['period'].should == 15
|
200
200
|
foo['attributes'].should == {'display_max' => 1000}
|
201
201
|
end
|
202
|
-
|
202
|
+
|
203
203
|
it "should raise error if no type specified" do
|
204
204
|
delete_all_metrics
|
205
205
|
lambda {
|
@@ -211,7 +211,7 @@ module Librato
|
|
211
211
|
}.should raise_error
|
212
212
|
end
|
213
213
|
end
|
214
|
-
|
214
|
+
|
215
215
|
end
|
216
216
|
|
217
217
|
end
|
data/spec/rackups/status.ru
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -10,7 +10,7 @@ require 'set'
|
|
10
10
|
require 'librato/metrics'
|
11
11
|
|
12
12
|
RSpec.configure do |config|
|
13
|
-
|
13
|
+
|
14
14
|
# purge all metrics from test account
|
15
15
|
def delete_all_metrics
|
16
16
|
connection = Librato::Metrics.client.connection
|
@@ -20,7 +20,7 @@ RSpec.configure do |config|
|
|
20
20
|
connection.delete("metrics/#{metric['name']}")
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
# set up test account credentials for integration tests
|
25
25
|
def prep_integration_tests
|
26
26
|
raise 'no TEST_API_USER specified in environment' unless ENV['TEST_API_USER']
|
@@ -30,11 +30,11 @@ RSpec.configure do |config|
|
|
30
30
|
end
|
31
31
|
Librato::Metrics.authenticate ENV['TEST_API_USER'], ENV['TEST_API_KEY']
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def rackup_path(*parts)
|
35
35
|
File.expand_path(File.join(File.dirname(__FILE__), 'rackups', *parts))
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
# fire up a given rackup file for the enclosed tests
|
39
39
|
def with_rackup(name)
|
40
40
|
if RUBY_PLATFORM == 'java'
|
@@ -64,9 +64,9 @@ RSpec::Matchers.define :start_with do |start_string|
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
# Compares hashes of arrays by converting the arrays to
|
67
|
+
# Compares hashes of arrays by converting the arrays to
|
68
68
|
# sets before comparision
|
69
|
-
#
|
69
|
+
#
|
70
70
|
# @example
|
71
71
|
# {:foo => [1,3,2]}.should equal_unordered({:foo => [1,2,3]})
|
72
72
|
RSpec::Matchers.define :equal_unordered do |result|
|
@@ -44,7 +44,7 @@ module Librato
|
|
44
44
|
it "should allow chaining" do
|
45
45
|
subject.add(:foo => 1234).should == subject
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
context "with single hash argument" do
|
49
49
|
it "should record a single aggregate" do
|
50
50
|
subject.add :foo => 3000
|
@@ -76,7 +76,7 @@ module Librato
|
|
76
76
|
}
|
77
77
|
subject.queued.should equal_unordered(expected)
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
it "should respect source argument" do
|
81
81
|
subject.add :foo => {:source => 'alpha', :value => 1}
|
82
82
|
subject.add :foo => 5
|
@@ -85,19 +85,19 @@ module Librato
|
|
85
85
|
expected = { :gauges => [
|
86
86
|
{ :name => 'foo', :source => 'alpha', :count => 2,
|
87
87
|
:sum => 7.0, :min => 1.0, :max => 6.0 },
|
88
|
-
{ :name => 'foo', :count => 2,
|
88
|
+
{ :name => 'foo', :count => 2,
|
89
89
|
:sum => 15.0, :min => 5.0, :max => 10.0 }
|
90
90
|
]}
|
91
91
|
subject.queued.should equal_unordered(expected)
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
context "with a prefix set" do
|
95
95
|
it "should auto-prepend names" do
|
96
96
|
subject = Aggregator.new(:prefix => 'foo')
|
97
97
|
subject.add :bar => 1
|
98
98
|
subject.add :bar => 12
|
99
99
|
expected = {:gauges => [
|
100
|
-
{ :name =>'foo.bar',
|
100
|
+
{ :name =>'foo.bar',
|
101
101
|
:count => 2,
|
102
102
|
:sum => 13.0,
|
103
103
|
:min => 1.0,
|
@@ -114,7 +114,7 @@ module Librato
|
|
114
114
|
it "should record a single aggregate" do
|
115
115
|
subject.add :foo => 3000
|
116
116
|
subject.add :bar => 30
|
117
|
-
expected = {
|
117
|
+
expected = {
|
118
118
|
#:measure_time => @time, TODO: support specific time
|
119
119
|
:gauges => [
|
120
120
|
{ :name => 'foo',
|
@@ -162,6 +162,21 @@ module Librato
|
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
165
|
+
describe "#queued" do
|
166
|
+
it "should include global source if set" do
|
167
|
+
a = Aggregator.new(:source => 'blah')
|
168
|
+
a.add :foo => 12
|
169
|
+
a.queued[:source].should == 'blah'
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should include global measure_time if set" do
|
173
|
+
measure_time = (Time.now-1000).to_i
|
174
|
+
a = Aggregator.new(:measure_time => measure_time)
|
175
|
+
a.add :foo => 12
|
176
|
+
a.queued[:measure_time].should == measure_time
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
165
180
|
describe "#submit" do
|
166
181
|
before(:all) do
|
167
182
|
Librato::Metrics.authenticate 'me@librato.com', 'foo'
|
@@ -210,20 +225,20 @@ module Librato
|
|
210
225
|
end
|
211
226
|
end
|
212
227
|
end
|
213
|
-
|
228
|
+
|
214
229
|
context "with an autosubmit interval" do
|
215
230
|
let(:client) do
|
216
231
|
client = Client.new
|
217
232
|
client.persistence = :test
|
218
233
|
client
|
219
234
|
end
|
220
|
-
|
235
|
+
|
221
236
|
it "should not submit immediately" do
|
222
237
|
timed_agg = Aggregator.new(:client => client, :autosubmit_interval => 1)
|
223
238
|
timed_agg.add :foo => 1
|
224
239
|
timed_agg.persister.persisted.should be_nil # nothing sent
|
225
240
|
end
|
226
|
-
|
241
|
+
|
227
242
|
it "should submit after interval" do
|
228
243
|
timed_agg = Aggregator.new(:client => client, :autosubmit_interval => 1)
|
229
244
|
timed_agg.add :foo => 1
|
@@ -4,21 +4,21 @@ module Librato
|
|
4
4
|
module Metrics
|
5
5
|
|
6
6
|
describe Connection do
|
7
|
-
|
7
|
+
|
8
8
|
describe "#api_endpoint" do
|
9
9
|
context "when not provided" do
|
10
10
|
it "should be default" do
|
11
11
|
subject.api_endpoint.should == 'https://metrics-api.librato.com'
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
context "when provided" do
|
16
16
|
it "should be respected" do
|
17
17
|
connection = Connection.new(:api_endpoint => 'http://test.com/')
|
18
18
|
connection.api_endpoint.should == 'http://test.com/'
|
19
19
|
end
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
22
22
|
|
23
23
|
describe "#user_agent" do
|
24
24
|
context "without an agent_identifier" do
|
@@ -36,7 +36,7 @@ module Librato
|
|
36
36
|
connection.user_agent.should start_with('foo/0.5')
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
context "with a custom user agent set" do
|
41
41
|
it "should use custom user agent" do
|
42
42
|
client = Client.new
|
@@ -45,17 +45,17 @@ module Librato
|
|
45
45
|
connection.user_agent.should == 'foo agent'
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
# TODO: verify user agent is being sent with rackup test
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
describe "network operations" do
|
53
53
|
context "when missing client" do
|
54
54
|
it "should raise exception" do
|
55
55
|
lambda { subject.get 'metrics' }.should raise_error(NoClientProvided)
|
56
56
|
end
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
context "with 400 class errors" do
|
60
60
|
it "should not retry" do
|
61
61
|
Middleware::CountRequests.reset
|
@@ -73,7 +73,7 @@ module Librato
|
|
73
73
|
Middleware::CountRequests.total_requests.should == 2
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
context "with 500 class errors" do
|
78
78
|
it "should retry" do
|
79
79
|
Middleware::CountRequests.reset
|
@@ -89,8 +89,8 @@ module Librato
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
end
|
96
96
|
end
|
@@ -4,7 +4,7 @@ module Librato
|
|
4
4
|
module Metrics
|
5
5
|
|
6
6
|
describe Queue do
|
7
|
-
|
7
|
+
|
8
8
|
let(:client) {
|
9
9
|
client = Client.new
|
10
10
|
client.persistence = :test
|
@@ -18,7 +18,7 @@ module Librato
|
|
18
18
|
vol_queue.add :bar => 2
|
19
19
|
vol_queue.persister.persisted.should_not be_nil # sent
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
it "should not submit if the max has not been reached" do
|
23
23
|
vol_queue = Queue.new(:client => client, :autosubmit_count => 5)
|
24
24
|
vol_queue.add :foo => 1
|
@@ -26,14 +26,14 @@ module Librato
|
|
26
26
|
vol_queue.persister.persisted.should be_nil # nothing sent
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
context "with an autosubmit interval" do
|
31
31
|
it "should not submit immediately" do
|
32
32
|
vol_queue = Queue.new(:client => client, :autosubmit_interval => 1)
|
33
33
|
vol_queue.add :foo => 1
|
34
34
|
vol_queue.persister.persisted.should be_nil # nothing sent
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
it "should submit after interval" do
|
38
38
|
vol_queue = Queue.new(:client => client, :autosubmit_interval => 1)
|
39
39
|
vol_queue.add :foo => 1
|
@@ -31,7 +31,7 @@ module Librato
|
|
31
31
|
it "should allow chaining" do
|
32
32
|
subject.add(:foo => 123).should == subject
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
context "with single hash argument" do
|
36
36
|
it "should record a key-value gauge" do
|
37
37
|
expected = {:gauges => [{:name => 'foo', :value => 3000, :measure_time => @time}]}
|
@@ -71,18 +71,18 @@ module Librato
|
|
71
71
|
:source => 'db2'}]}
|
72
72
|
subject.queued.should equal_unordered(expected)
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
context "with a prefix set" do
|
76
76
|
it "should auto-prepend names" do
|
77
77
|
subject = Queue.new(:prefix => 'foo')
|
78
78
|
subject.add :bar => 1
|
79
79
|
subject.add :baz => {:value => 23}
|
80
|
-
expected = {:gauges => [{:name =>'foo.bar', :value => 1, :measure_time => @time},
|
80
|
+
expected = {:gauges => [{:name =>'foo.bar', :value => 1, :measure_time => @time},
|
81
81
|
{:name => 'foo.baz', :value => 23, :measure_time => @time}]}
|
82
82
|
subject.queued.should equal_unordered(expected)
|
83
83
|
end
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
context "when dynamically changing prefix" do
|
87
87
|
it "should auto-append names" do
|
88
88
|
subject.add :bar => 12
|
@@ -94,7 +94,7 @@ module Librato
|
|
94
94
|
subject.add :bar => 45
|
95
95
|
expected = {:gauges => [
|
96
96
|
{:name => 'bar', :value => 12, :measure_time => @time},
|
97
|
-
{:name => 'foo.bar', :value => 23, :measure_time => @time},
|
97
|
+
{:name => 'foo.bar', :value => 23, :measure_time => @time},
|
98
98
|
{:name => 'foo.bar', :value => 34, :measure_time => @time},
|
99
99
|
{:name => 'bar', :value => 45, :measure_time => @time}]}
|
100
100
|
subject.queued.should equal_unordered(expected)
|
@@ -111,26 +111,26 @@ module Librato
|
|
111
111
|
subject.queued.should equal_unordered(expected)
|
112
112
|
end
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
context "with a measure_time" do
|
116
116
|
it "should accept time objects" do
|
117
117
|
time = Time.now-5
|
118
118
|
subject.add :foo => {:measure_time => time, :value => 123}
|
119
119
|
subject.queued[:gauges][0][:measure_time].should == time
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
it "should accept integers" do
|
123
123
|
time = 1336574713
|
124
124
|
subject.add :foo => {:measure_time => time, :value => 123}
|
125
125
|
subject.queued[:gauges][0][:measure_time].should == time
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
it "should accept strings" do
|
129
129
|
time = '1336574713'
|
130
130
|
subject.add :foo => {:measure_time => time, :value => 123}
|
131
131
|
subject.queued[:gauges][0][:measure_time].should == time
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
it "should raise exception in invalid time" do
|
135
135
|
lambda {
|
136
136
|
subject.add :foo => {:measure_time => '12', :value => 123}
|
@@ -173,17 +173,17 @@ module Librato
|
|
173
173
|
subject.gauges.should eql []
|
174
174
|
end
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
describe "#last_submit_time" do
|
178
178
|
before(:all) do
|
179
179
|
Librato::Metrics.authenticate 'me@librato.com', 'foo'
|
180
180
|
Librato::Metrics.persistence = :test
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
it "should default to nil" do
|
184
184
|
subject.last_submit_time.should be_nil
|
185
185
|
end
|
186
|
-
|
186
|
+
|
187
187
|
it "should store last submission time" do
|
188
188
|
prior = Time.now
|
189
189
|
subject.add :foo => 123
|
@@ -191,7 +191,7 @@ module Librato
|
|
191
191
|
subject.last_submit_time.should >= prior
|
192
192
|
end
|
193
193
|
end
|
194
|
-
|
194
|
+
|
195
195
|
describe "#merge!" do
|
196
196
|
context "with another queue" do
|
197
197
|
it "should merge gauges" do
|
@@ -205,7 +205,7 @@ module Librato
|
|
205
205
|
{:name=>"baz", :value=>678, :measure_time => @time}]}
|
206
206
|
q2.queued.should equal_unordered(expected)
|
207
207
|
end
|
208
|
-
|
208
|
+
|
209
209
|
it "should merge counters" do
|
210
210
|
q1 = Queue.new
|
211
211
|
q1.add :users => {:type => :counter, :value => 1000}
|
@@ -218,7 +218,7 @@ module Librato
|
|
218
218
|
{:name=>"signups", :value=>500, :measure_time => @time}]}
|
219
219
|
q2.queued.should equal_unordered(expected)
|
220
220
|
end
|
221
|
-
|
221
|
+
|
222
222
|
it "should maintain specified sources" do
|
223
223
|
q1 = Queue.new
|
224
224
|
q1.add :neo => {:source => 'matrix', :value => 123}
|
@@ -226,7 +226,7 @@ module Librato
|
|
226
226
|
q2.merge!(q1)
|
227
227
|
q2.queued[:gauges][0][:source].should == 'matrix'
|
228
228
|
end
|
229
|
-
|
229
|
+
|
230
230
|
it "should not change default source" do
|
231
231
|
q1 = Queue.new(:source => 'matrix')
|
232
232
|
q1.add :neo => 456
|
@@ -234,7 +234,7 @@ module Librato
|
|
234
234
|
q2.merge!(q1)
|
235
235
|
q2.queued[:source].should == 'red_pill'
|
236
236
|
end
|
237
|
-
|
237
|
+
|
238
238
|
it "should track previous default source" do
|
239
239
|
q1 = Queue.new(:source => 'matrix')
|
240
240
|
q1.add :neo => 456
|
@@ -247,7 +247,7 @@ module Librato
|
|
247
247
|
end
|
248
248
|
end
|
249
249
|
end
|
250
|
-
|
250
|
+
|
251
251
|
it "should handle empty cases" do
|
252
252
|
q1 = Queue.new
|
253
253
|
q1.add :foo => 123, :users => {:type => :counter, :value => 1000}
|
@@ -258,7 +258,7 @@ module Librato
|
|
258
258
|
q2.queued.should == expected
|
259
259
|
end
|
260
260
|
end
|
261
|
-
|
261
|
+
|
262
262
|
context "with an aggregator" do
|
263
263
|
it "should merge" do
|
264
264
|
aggregator = Aggregator.new(:source => 'aggregator')
|
@@ -267,14 +267,14 @@ module Librato
|
|
267
267
|
queue = Queue.new(:source => 'queue')
|
268
268
|
queue.add :gauge => 42
|
269
269
|
queue.merge!(aggregator)
|
270
|
-
expected = {:gauges=>[{:name=>"gauge", :value=>42, :measure_time=>@time},
|
270
|
+
expected = {:gauges=>[{:name=>"gauge", :value=>42, :measure_time=>@time},
|
271
271
|
{:name=>"timing", :count=>2, :sum=>305.0, :min=>102.0, :max=>203.0, :source=>"aggregator"}],
|
272
272
|
:source=>'queue'}
|
273
273
|
queue.queued.should equal_unordered(expected)
|
274
|
-
|
274
|
+
|
275
275
|
end
|
276
276
|
end
|
277
|
-
|
277
|
+
|
278
278
|
context "with a hash" do
|
279
279
|
it "should merge" do
|
280
280
|
to_merge = {:gauges=>[{:name => 'foo', :value => 123}],
|
@@ -286,13 +286,28 @@ module Librato
|
|
286
286
|
end
|
287
287
|
end
|
288
288
|
end
|
289
|
-
|
289
|
+
|
290
290
|
describe "#per_request" do
|
291
291
|
it "should default to 500" do
|
292
292
|
subject.per_request.should == 500
|
293
293
|
end
|
294
294
|
end
|
295
295
|
|
296
|
+
describe "#queued" do
|
297
|
+
it "should include global source if set" do
|
298
|
+
q = Queue.new(:source => 'blah')
|
299
|
+
q.add :foo => 12
|
300
|
+
q.queued[:source].should == 'blah'
|
301
|
+
end
|
302
|
+
|
303
|
+
it "should include global measure_time if set" do
|
304
|
+
measure_time = (Time.now-1000).to_i
|
305
|
+
q = Queue.new(:measure_time => measure_time)
|
306
|
+
q.add :foo => 12
|
307
|
+
q.queued[:measure_time].should == measure_time
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
296
311
|
describe "#size" do
|
297
312
|
it "should return empty if gauges and counters are emtpy" do
|
298
313
|
subject.size.should eq 0
|
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.7.
|
4
|
+
version: 0.7.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -32,17 +32,17 @@ dependencies:
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
37
|
+
version: '0'
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: '
|
45
|
+
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: aggregate
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -186,6 +186,7 @@ files:
|
|
186
186
|
- lib/librato/metrics/persistence/test.rb
|
187
187
|
- lib/librato/metrics/processor.rb
|
188
188
|
- lib/librato/metrics/queue.rb
|
189
|
+
- lib/librato/metrics/smart_json.rb
|
189
190
|
- lib/librato/metrics/version.rb
|
190
191
|
- librato-metrics.gemspec
|
191
192
|
- spec/integration/metrics/connection_spec.rb
|
@@ -215,7 +216,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
215
216
|
version: '0'
|
216
217
|
segments:
|
217
218
|
- 0
|
218
|
-
hash: -
|
219
|
+
hash: -3428658007385951534
|
219
220
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
220
221
|
none: false
|
221
222
|
requirements:
|