librato-metrics 1.0.2 → 1.0.3
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/lib/librato/metrics/connection.rb +0 -3
- data/lib/librato/metrics/errors.rb +8 -1
- data/lib/librato/metrics/middleware/expects_status.rb +6 -6
- data/lib/librato/metrics/middleware/retry.rb +3 -1
- data/lib/librato/metrics/version.rb +1 -1
- data/spec/integration/metrics/annotator_spec.rb +2 -1
- data/spec/integration/metrics_spec.rb +1 -1
- data/spec/rackups/status.ru +9 -0
- data/spec/unit/metrics/connection_spec.rb +26 -9
- metadata +3 -3
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
### Version 1.0.3
|
4
|
+
* Fix bug where retries of POST requests could 400
|
5
|
+
* Network related exceptions capture response state better
|
6
|
+
|
3
7
|
### Version 1.0.2
|
4
8
|
* Fix bug with some versions of MultiJson (Thomas Dippel)
|
5
9
|
* Use delegation for JSON handling
|
@@ -30,13 +30,10 @@ module Librato
|
|
30
30
|
def transport
|
31
31
|
raise(NoClientProvided, "No client provided.") unless @client
|
32
32
|
@transport ||= Faraday::Connection.new(:url => api_endpoint + "/v1/") do |f|
|
33
|
-
#f.use FaradayMiddleware::EncodeJson
|
34
33
|
f.use Librato::Metrics::Middleware::RequestBody
|
35
34
|
f.use Librato::Metrics::Middleware::Retry
|
36
35
|
f.use Librato::Metrics::Middleware::CountRequests
|
37
|
-
|
38
36
|
f.use Librato::Metrics::Middleware::ExpectsStatus
|
39
|
-
#f.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
|
40
37
|
|
41
38
|
f.adapter @adapter || Metrics.faraday_adapter
|
42
39
|
end.tap do |transport|
|
@@ -10,7 +10,14 @@ module Librato
|
|
10
10
|
class InvalidMeasureTime < MetricsError; end
|
11
11
|
class NotMergeable < MetricsError; end
|
12
12
|
|
13
|
-
class NetworkError < StandardError
|
13
|
+
class NetworkError < StandardError
|
14
|
+
attr_reader :response
|
15
|
+
|
16
|
+
def initialize(msg, response = nil)
|
17
|
+
super(msg)
|
18
|
+
@response = response
|
19
|
+
end
|
20
|
+
end
|
14
21
|
|
15
22
|
class ClientError < NetworkError; end
|
16
23
|
class Unauthorized < ClientError; end
|
@@ -8,17 +8,17 @@ module Librato
|
|
8
8
|
# TODO: make exception output prettier
|
9
9
|
case env[:status]
|
10
10
|
when 401
|
11
|
-
raise Unauthorized, env
|
11
|
+
raise Unauthorized.new(env.to_s, env)
|
12
12
|
when 403
|
13
|
-
raise Forbidden, env
|
13
|
+
raise Forbidden.new(env.to_s, env)
|
14
14
|
when 404
|
15
|
-
raise NotFound, env
|
15
|
+
raise NotFound.new(env.to_s, env)
|
16
16
|
when 422
|
17
|
-
raise EntityAlreadyExists, env
|
17
|
+
raise EntityAlreadyExists.new(env.to_s, env)
|
18
18
|
when 400..499
|
19
|
-
raise ClientError, env
|
19
|
+
raise ClientError.new(env.to_s, env)
|
20
20
|
when 500..599
|
21
|
-
raise ServerError, env
|
21
|
+
raise ServerError.new(env.to_s, env)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -11,9 +11,11 @@ module Librato
|
|
11
11
|
|
12
12
|
def call(env)
|
13
13
|
retries = @retries
|
14
|
+
request_body = env[:body]
|
14
15
|
begin
|
16
|
+
env[:body] = request_body # after failure is set to response body
|
15
17
|
@app.call(env)
|
16
|
-
rescue Librato::Metrics::ServerError, Timeout::Error,
|
18
|
+
rescue Librato::Metrics::ServerError, Timeout::Error,
|
17
19
|
Faraday::Error::ConnectionFailed
|
18
20
|
if retries > 0
|
19
21
|
retries -= 1 and retry
|
@@ -60,8 +60,9 @@ module Librato
|
|
60
60
|
subject.add :deployment, 'deployed v47'
|
61
61
|
events = subject.fetch(:deployment, :start_time => Time.now.to_i-60)
|
62
62
|
events = events['events']['unassigned']
|
63
|
-
ids = events.
|
63
|
+
ids = events.reduce({}) do |hash, event|
|
64
64
|
hash[event['title']] = event['id']
|
65
|
+
hash
|
65
66
|
end
|
66
67
|
subject.delete_event :deployment, ids['deployed v47']
|
67
68
|
events = subject.fetch(:deployment, :start_time => Time.now.to_i-60)
|
@@ -228,7 +228,7 @@ module Librato
|
|
228
228
|
it "should create the metric if type specified" do
|
229
229
|
delete_all_metrics
|
230
230
|
Metrics.update :foo, :display_name => "Foo Metric",
|
231
|
-
:type =>
|
231
|
+
:type => 'gauge',
|
232
232
|
:period => 15,
|
233
233
|
:attributes => {
|
234
234
|
:display_max => 1000
|
data/spec/rackups/status.ru
CHANGED
@@ -16,6 +16,15 @@ class App < Sinatra::Base
|
|
16
16
|
post('/v1/service_unavailable') do
|
17
17
|
status 503
|
18
18
|
end
|
19
|
+
|
20
|
+
post('/v1/retry_body') do
|
21
|
+
body = request.env["rack.input"].read
|
22
|
+
if body.empty?
|
23
|
+
status 504 # body not sent
|
24
|
+
else
|
25
|
+
status 502 # body sent
|
26
|
+
end
|
27
|
+
end
|
19
28
|
end
|
20
29
|
|
21
30
|
run App
|
@@ -56,12 +56,16 @@ module Librato
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
+
let(:client) do
|
60
|
+
client = Client.new
|
61
|
+
client.api_endpoint = 'http://127.0.0.1:9296'
|
62
|
+
client.authenticate 'foo', 'bar'
|
63
|
+
client
|
64
|
+
end
|
65
|
+
|
59
66
|
context "with 400 class errors" do
|
60
67
|
it "should not retry" do
|
61
68
|
Middleware::CountRequests.reset
|
62
|
-
client = Client.new
|
63
|
-
client.api_endpoint = 'http://127.0.0.1:9296'
|
64
|
-
client.authenticate 'foo', 'bar'
|
65
69
|
with_rackup('status.ru') do
|
66
70
|
lambda {
|
67
71
|
client.connection.transport.post 'not_found'
|
@@ -70,26 +74,39 @@ module Librato
|
|
70
74
|
client.connection.transport.post 'forbidden'
|
71
75
|
}.should raise_error(ClientError)
|
72
76
|
end
|
73
|
-
Middleware::CountRequests.total_requests.should == 2
|
77
|
+
Middleware::CountRequests.total_requests.should == 2 # no retries
|
74
78
|
end
|
75
79
|
end
|
76
80
|
|
77
81
|
context "with 500 class errors" do
|
78
82
|
it "should retry" do
|
79
83
|
Middleware::CountRequests.reset
|
80
|
-
client = Client.new
|
81
|
-
client.api_endpoint = 'http://127.0.0.1:9296'
|
82
|
-
client.authenticate 'foo', 'bar'
|
83
84
|
with_rackup('status.ru') do
|
84
85
|
lambda {
|
85
86
|
client.connection.transport.post 'service_unavailable'
|
86
87
|
}.should raise_error(ServerError)
|
87
88
|
end
|
88
|
-
Middleware::CountRequests.total_requests.should == 4
|
89
|
+
Middleware::CountRequests.total_requests.should == 4 # did retries
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should send consistent body with retries" do
|
93
|
+
Middleware::CountRequests.reset
|
94
|
+
status = 0
|
95
|
+
begin
|
96
|
+
with_rackup('status.ru') do
|
97
|
+
response = client.connection.transport.post do |req|
|
98
|
+
req.url 'retry_body'
|
99
|
+
req.body = '{"foo": "bar", "baz": "kaboom"}'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
rescue Exception => error
|
103
|
+
status = error.response[:status].to_i
|
104
|
+
end
|
105
|
+
Middleware::CountRequests.total_requests.should == 4 # did retries
|
106
|
+
status.should be(502)#, 'body should be sent for retries'
|
89
107
|
end
|
90
108
|
end
|
91
109
|
end
|
92
|
-
|
93
110
|
end
|
94
111
|
|
95
112
|
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: 1.0.
|
4
|
+
version: 1.0.3
|
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:
|
12
|
+
date: 2013-01-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -218,7 +218,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
218
218
|
version: '0'
|
219
219
|
segments:
|
220
220
|
- 0
|
221
|
-
hash:
|
221
|
+
hash: 3023872404930290893
|
222
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
223
|
none: false
|
224
224
|
requirements:
|