dogapi 1.22.0 → 1.23.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +1 -1
- data/.rubocop.yml +13 -0
- data/.travis.yml +3 -1
- data/CHANGELOG.md +16 -1
- data/Gemfile +6 -3
- data/README.rdoc +1 -1
- data/Rakefile +8 -15
- data/lib/capistrano/datadog.rb +12 -12
- data/lib/capistrano/datadog/v2.rb +5 -5
- data/lib/capistrano/datadog/v3.rb +9 -4
- data/lib/dogapi/common.rb +43 -39
- data/lib/dogapi/event.rb +4 -4
- data/lib/dogapi/facade.rb +57 -54
- data/lib/dogapi/metric.rb +2 -2
- data/lib/dogapi/v1/alert.rb +17 -80
- data/lib/dogapi/v1/comment.rb +8 -39
- data/lib/dogapi/v1/dash.rb +20 -67
- data/lib/dogapi/v1/embed.rb +11 -57
- data/lib/dogapi/v1/event.rb +37 -72
- data/lib/dogapi/v1/metric.rb +17 -46
- data/lib/dogapi/v1/monitor.rb +54 -194
- data/lib/dogapi/v1/screenboard.rb +8 -77
- data/lib/dogapi/v1/search.rb +5 -11
- data/lib/dogapi/v1/service_check.rb +6 -15
- data/lib/dogapi/v1/snapshot.rb +10 -15
- data/lib/dogapi/v1/tag.rb +39 -99
- data/lib/dogapi/v1/user.rb +15 -69
- data/lib/dogapi/version.rb +1 -1
- data/spec/integration/alert_spec.rb +48 -0
- data/spec/integration/comment_spec.rb +32 -0
- data/spec/integration/common_spec.rb +32 -0
- data/spec/integration/dash_spec.rb +60 -0
- data/spec/integration/embed_spec.rb +43 -0
- data/spec/integration/event_spec.rb +73 -0
- data/spec/integration/metric_spec.rb +96 -0
- data/spec/integration/monitor_spec.rb +106 -0
- data/spec/integration/screenboard_spec.rb +61 -0
- data/spec/integration/search_spec.rb +11 -0
- data/spec/integration/service_check_spec.rb +12 -0
- data/spec/integration/snapshot_spec.rb +24 -0
- data/spec/integration/tag_spec.rb +66 -0
- data/spec/integration/user_spec.rb +46 -0
- data/spec/spec_helper.rb +85 -16
- data/spec/unit/common_spec.rb +101 -0
- data/spec/unit/facade_spec.rb +79 -0
- metadata +55 -52
- data/spec/alerts_spec.rb +0 -33
- data/spec/common_spec.rb +0 -37
- data/spec/facade_spec.rb +0 -166
- data/spec/support/cassettes/Alerts/create/returns_HTTP_code_200.yml +0 -114
- data/spec/support/cassettes/Alerts/create/returns_a_valid_event_ID.yml +0 -114
- data/spec/support/cassettes/Alerts/create/returns_the_same_query_as_sent.yml +0 -114
- data/spec/support/cassettes/Facade/Events/emits_aggregate_events.yml +0 -193
- data/spec/support/cassettes/Facade/Events/emits_events_and_retrieves_them.yml +0 -100
- data/spec/support/cassettes/Facade/Events/emits_events_with_specified_priority.yml +0 -98
- data/spec/support/cassettes/Facade/Tags/adds_updates_and_detaches_tags.yml +0 -442
- data/tests/test_alerts.rb +0 -38
- data/tests/test_base.rb +0 -30
- data/tests/test_client.rb +0 -23
- data/tests/test_comments.rb +0 -39
- data/tests/test_dashes.rb +0 -85
- data/tests/test_embed.rb +0 -194
- data/tests/test_monitors.rb +0 -192
- data/tests/test_screenboard.rb +0 -90
- data/tests/test_search.rb +0 -20
- data/tests/test_snapshot.rb +0 -28
- data/tests/test_users.rb +0 -65
@@ -0,0 +1,12 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe Dogapi::Client do
|
4
|
+
SC_BODY = { check: 'app.is_ok', host_name: 'app1', status: 0 }.freeze
|
5
|
+
SC_ARGS = SC_BODY.values
|
6
|
+
|
7
|
+
describe '#service_check' do
|
8
|
+
it_behaves_like 'an api method with options',
|
9
|
+
:service_check, SC_ARGS,
|
10
|
+
:post, '/check_run', SC_BODY
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe Dogapi::Client do
|
4
|
+
SNAP_QUERY = 'system.load.1{*}'.freeze
|
5
|
+
START_TS = Time.now.to_i
|
6
|
+
END_TS = START_TS + 10
|
7
|
+
EVENT_QUERY = 'hotfixes'.freeze
|
8
|
+
|
9
|
+
PARAMS = { metric_query: SNAP_QUERY, start: START_TS, end: END_TS }.freeze
|
10
|
+
EXTENDED_PARAMS = PARAMS.merge(event_query: EVENT_QUERY)
|
11
|
+
|
12
|
+
describe '#snapshot' do
|
13
|
+
context 'when creating a simple graph' do
|
14
|
+
it_behaves_like 'an api method with params',
|
15
|
+
:graph_snapshot, [],
|
16
|
+
:get, '/graph/snapshot', PARAMS
|
17
|
+
end
|
18
|
+
context 'when adding an event overlay' do
|
19
|
+
it_behaves_like 'an api method with params',
|
20
|
+
:graph_snapshot, [],
|
21
|
+
:get, '/graph/snapshot', EXTENDED_PARAMS
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe Dogapi::Client do
|
4
|
+
HOST_NAME = 'test.example.com'.freeze
|
5
|
+
SOURCE = 'chef_custom'.freeze
|
6
|
+
TAGS = ['role:web', 'environment:test'].freeze
|
7
|
+
|
8
|
+
describe '#add_tags' do
|
9
|
+
context 'whithout precising the source' do
|
10
|
+
it_behaves_like 'an api method',
|
11
|
+
:add_tags, [HOST_NAME, TAGS],
|
12
|
+
:post, "/tags/hosts/#{HOST_NAME}", tags: TAGS
|
13
|
+
end
|
14
|
+
context 'while precising the source' do
|
15
|
+
it_behaves_like 'an api method with params',
|
16
|
+
:add_tags, [HOST_NAME, TAGS],
|
17
|
+
:post, "/tags/hosts/#{HOST_NAME}", source: SOURCE
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#update_tags' do
|
22
|
+
context 'whithout precising the source' do
|
23
|
+
it_behaves_like 'an api method',
|
24
|
+
:update_tags, [HOST_NAME, TAGS],
|
25
|
+
:put, "/tags/hosts/#{HOST_NAME}", tags: TAGS
|
26
|
+
end
|
27
|
+
context 'while precising the source' do
|
28
|
+
it_behaves_like 'an api method with params',
|
29
|
+
:update_tags, [HOST_NAME, TAGS],
|
30
|
+
:put, "/tags/hosts/#{HOST_NAME}", source: SOURCE
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#host_tags' do
|
35
|
+
context 'whithout precising the source' do
|
36
|
+
it_behaves_like 'an api method',
|
37
|
+
:host_tags, [HOST_NAME],
|
38
|
+
:get, "/tags/hosts/#{HOST_NAME}"
|
39
|
+
end
|
40
|
+
context 'while precising the source' do
|
41
|
+
it_behaves_like 'an api method with params',
|
42
|
+
:host_tags, [HOST_NAME],
|
43
|
+
:get, "/tags/hosts/#{HOST_NAME}", source: SOURCE, by_source: true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#detach_tags' do
|
48
|
+
context 'whithout precising the source' do
|
49
|
+
it_behaves_like 'an api method',
|
50
|
+
:detach_tags, [HOST_NAME],
|
51
|
+
:delete, "/tags/hosts/#{HOST_NAME}"
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'while precising the source' do
|
55
|
+
it_behaves_like 'an api method with params',
|
56
|
+
:detach_tags, [HOST_NAME],
|
57
|
+
:delete, "/tags/hosts/#{HOST_NAME}", source: SOURCE
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#all_tags' do
|
62
|
+
it_behaves_like 'an api method',
|
63
|
+
:all_tags, [],
|
64
|
+
:get, '/tags/hosts'
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe Dogapi::Client do
|
4
|
+
USER_HANDLE = 'test@example.com'.freeze
|
5
|
+
USER_DESCRIPTION = {
|
6
|
+
handle: USER_HANDLE,
|
7
|
+
name: 'TEST'
|
8
|
+
}.freeze
|
9
|
+
USER_EMAILS = (1..4).map { |i| "test#{i}@example.com" }
|
10
|
+
|
11
|
+
describe '#invite' do
|
12
|
+
it_behaves_like 'an api method with options',
|
13
|
+
:invite, [USER_EMAILS],
|
14
|
+
:post, '/invite_users', 'emails' => USER_EMAILS
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#create_user' do
|
18
|
+
it_behaves_like 'an api method',
|
19
|
+
:create_user, [USER_DESCRIPTION],
|
20
|
+
:post, '/user', USER_DESCRIPTION
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#get_user' do
|
24
|
+
it_behaves_like 'an api method',
|
25
|
+
:get_user, [USER_HANDLE],
|
26
|
+
:get, "/user/#{USER_HANDLE}"
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#get_all_users' do
|
30
|
+
it_behaves_like 'an api method',
|
31
|
+
:get_all_users, [],
|
32
|
+
:get, '/user'
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#update_user' do
|
36
|
+
it_behaves_like 'an api method',
|
37
|
+
:update_user, [USER_HANDLE, USER_DESCRIPTION],
|
38
|
+
:put, "/user/#{USER_HANDLE}", USER_DESCRIPTION
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#disable_user' do
|
42
|
+
it_behaves_like 'an api method',
|
43
|
+
:disable_user, [USER_HANDLE],
|
44
|
+
:delete, "/user/#{USER_HANDLE}"
|
45
|
+
end
|
46
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,30 +1,99 @@
|
|
1
1
|
require 'rspec'
|
2
|
-
require '
|
2
|
+
require 'simplecov'
|
3
|
+
require 'webmock/rspec'
|
4
|
+
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter 'spec'
|
7
|
+
end
|
8
|
+
|
9
|
+
WebMock.disable_net_connect!(allow_localhost: false)
|
3
10
|
|
4
11
|
# include our code and methods
|
5
12
|
require 'dogapi'
|
6
13
|
|
7
|
-
|
8
|
-
|
14
|
+
DATADOG_HOST = 'app.datadoghq.com'.freeze
|
15
|
+
ENV['DATADOG_HOST'] = 'http://' + DATADOG_HOST
|
16
|
+
|
17
|
+
module SpecDog
|
18
|
+
extend RSpec::SharedContext
|
19
|
+
|
20
|
+
let(:api_key) { 'API_KEY' }
|
21
|
+
let(:app_key) { 'APP_KEY' }
|
22
|
+
let(:dog) { Dogapi::Client.new(api_key, app_key, 'data.dog', nil, false) }
|
23
|
+
let(:api_url) { "#{DATADOG_HOST}/api/v1" }
|
24
|
+
let(:default_query) { { api_key: api_key, application_key: app_key } }
|
25
|
+
|
26
|
+
shared_examples 'an api method' do |command, args, request, endpoint, body|
|
27
|
+
it 'queries the api' do
|
28
|
+
url = api_url + endpoint
|
29
|
+
stub_request(request, /#{url}/).to_return(body: '{}').then.to_raise(StandardError)
|
30
|
+
expect(dog.send(command, *args)).to eq ['200', {}]
|
31
|
+
|
32
|
+
body = MultiJson.dump(body) if body
|
33
|
+
|
34
|
+
expect(WebMock).to have_requested(request, url).with(
|
35
|
+
query: default_query,
|
36
|
+
body: body
|
37
|
+
)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
shared_examples 'an api method with options' do |command, args, request, endpoint, body|
|
42
|
+
include_examples 'an api method', command, args, request, endpoint, body
|
43
|
+
it 'queries the api with options' do
|
44
|
+
url = api_url + endpoint
|
45
|
+
options = { 'zzz' => 'aaa' }
|
46
|
+
stub_request(request, /#{url}/).to_return(body: '{}').then.to_raise(StandardError)
|
47
|
+
expect(dog.send(command, *args, options)).to eq ['200', {}]
|
48
|
+
|
49
|
+
body = MultiJson.dump(body ? (body.merge options) : options)
|
50
|
+
|
51
|
+
expect(WebMock).to have_requested(request, url).with(
|
52
|
+
query: default_query,
|
53
|
+
body: body
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
shared_examples 'an api method with params' do |command, args, request, endpoint, params|
|
59
|
+
it 'queries the api with params' do
|
60
|
+
url = api_url + endpoint
|
61
|
+
stub_request(request, /#{url}/).to_return(body: '{}').then.to_raise(StandardError)
|
62
|
+
expect(dog.send(command, *args, *params.values)).to eq ['200', {}]
|
63
|
+
|
64
|
+
params.each { |k, v| params[k] = v.join(',') if v.is_a? Array }
|
65
|
+
params = params.merge default_query
|
66
|
+
|
67
|
+
expect(WebMock).to have_requested(request, url).with(
|
68
|
+
query: params
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
shared_examples 'an api method with optional params' do |command, args, request, endpoint, opt_params|
|
74
|
+
include_examples 'an api method', command, args, request, endpoint
|
75
|
+
it 'queries the api with optional params' do
|
76
|
+
url = api_url + endpoint
|
77
|
+
stub_request(request, /#{url}/).to_return(body: '{}').then.to_raise(StandardError)
|
78
|
+
expect(dog.send(command, *args, opt_params)).to eq ['200', {}]
|
79
|
+
|
80
|
+
opt_params.each { |k, v| opt_params[k] = v.join(',') if v.is_a? Array }
|
81
|
+
params = opt_params.merge default_query
|
82
|
+
|
83
|
+
expect(WebMock).to have_requested(request, url).with(
|
84
|
+
query: params
|
85
|
+
)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
9
89
|
|
10
90
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
11
91
|
RSpec.configure do |config|
|
12
|
-
|
13
|
-
config.
|
14
|
-
config.filter_run :focus
|
15
|
-
|
92
|
+
# Global let
|
93
|
+
config.include SpecDog
|
16
94
|
# Run specs in random order to surface order dependencies. If you find an
|
17
95
|
# order dependency and want to debug it, you can fix the order by providing
|
18
96
|
# the seed, which is printed after each run.
|
19
97
|
# --seed 1234
|
20
98
|
config.order = 'random'
|
21
99
|
end
|
22
|
-
|
23
|
-
VCR.configure do |c|
|
24
|
-
c.cassette_library_dir = 'spec/support/cassettes'
|
25
|
-
c.configure_rspec_metadata!
|
26
|
-
c.default_cassette_options = { :record => :new_episodes, :re_record_interval => 7776000 } # 90 days, in seconds
|
27
|
-
c.hook_into :webmock
|
28
|
-
c.filter_sensitive_data('<DATADOG_API_KEY>') { ENV["DATADOG_API_KEY"] }
|
29
|
-
c.filter_sensitive_data('<DATADOG_APP_KEY>') { ENV["DATADOG_APP_KEY"] }
|
30
|
-
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe 'Common' do
|
4
|
+
context 'Scope' do
|
5
|
+
it 'validates the Scope class' do
|
6
|
+
obj = Dogapi::Scope.new('somehost', 'somedevice')
|
7
|
+
|
8
|
+
expect(obj.host).to eq 'somehost'
|
9
|
+
expect(obj.device).to eq 'somedevice'
|
10
|
+
end
|
11
|
+
end # end Scope
|
12
|
+
|
13
|
+
context 'HttpConnection' do
|
14
|
+
it 'respects the proxy configuration' do
|
15
|
+
service = Dogapi::APIService.new('api_key', 'app_key')
|
16
|
+
|
17
|
+
service.connect do |conn|
|
18
|
+
expect(conn.proxy_address).to be(nil)
|
19
|
+
expect(conn.proxy_port).to be(nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
ENV['http_proxy'] = 'https://www.proxy.com:443'
|
23
|
+
|
24
|
+
service.connect do |conn|
|
25
|
+
expect(conn.proxy_address).to eq 'www.proxy.com'
|
26
|
+
expect(conn.proxy_port).to eq 443
|
27
|
+
end
|
28
|
+
|
29
|
+
ENV['http_proxy'] = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'respects the endpoint configuration' do
|
33
|
+
service = Dogapi::APIService.new('api_key', 'app_key', true, nil, 'https://app.example.com')
|
34
|
+
|
35
|
+
service.connect do |conn|
|
36
|
+
expect(conn.address).to eq 'app.example.com'
|
37
|
+
expect(conn.port).to eq 443
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class FakeResponse
|
44
|
+
attr_accessor :code, :body
|
45
|
+
def initialize(code, body)
|
46
|
+
# Instance variables
|
47
|
+
@code = code
|
48
|
+
@body = body
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe Dogapi::APIService do
|
53
|
+
let(:dogapi_service_silent) { Dogapi::APIService.new 'API_KEY', 'APP_KEY' }
|
54
|
+
let(:dogapi_service) { Dogapi::APIService.new 'API_KEY', 'APP_KEY', false }
|
55
|
+
let(:std_error) { StandardError.new('test3') }
|
56
|
+
|
57
|
+
describe '#suppress_error_if_silent' do
|
58
|
+
context 'when silent' do
|
59
|
+
it "doesn't raise an error" do
|
60
|
+
dog = dogapi_service_silent
|
61
|
+
expect { dog.suppress_error_if_silent(std_error) }.not_to raise_error
|
62
|
+
expect { dog.suppress_error_if_silent(std_error) }.to output("test3\n").to_stderr
|
63
|
+
expect(dog.suppress_error_if_silent(std_error)).to eq([-1, {}])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
context 'when not silent' do
|
67
|
+
it 'raises an error' do
|
68
|
+
dog = dogapi_service
|
69
|
+
expect { dog.suppress_error_if_silent(std_error) }.to raise_error(std_error)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#handle_response' do
|
75
|
+
context 'when receiving a correct reponse with valid json' do
|
76
|
+
it 'parses it and return code and parsed body' do
|
77
|
+
dog = dogapi_service
|
78
|
+
resp = FakeResponse.new 202, '{"test2": "test3"}'
|
79
|
+
expect(dog.handle_response(resp)).to eq([202, { 'test2' => 'test3' }])
|
80
|
+
end
|
81
|
+
end
|
82
|
+
context 'when receiving a response with invalid json' do
|
83
|
+
it 'raises an error' do
|
84
|
+
dog = dogapi_service
|
85
|
+
resp = FakeResponse.new 202, "{'test2': }"
|
86
|
+
expect { dog.handle_response(resp) }.to raise_error(RuntimeError, "Invalid JSON Response: {'test2': }")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
context 'when receiving a bad response' do
|
90
|
+
it 'returns the error code and an empty body' do
|
91
|
+
dog = dogapi_service
|
92
|
+
resp = FakeResponse.new 204, ''
|
93
|
+
expect(dog.handle_response(resp)).to eq([204, {}])
|
94
|
+
resp = FakeResponse.new 202, nil
|
95
|
+
expect(dog.handle_response(resp)).to eq([202, {}])
|
96
|
+
resp = FakeResponse.new 202, 'null'
|
97
|
+
expect(dog.handle_response(resp)).to eq([202, {}])
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Dogapi::Client do
|
4
|
+
before(:each) do
|
5
|
+
@dogmock = Dogapi::Client.new(api_key, app_key)
|
6
|
+
@service = @dogmock.instance_variable_get(:@metric_svc)
|
7
|
+
@service.instance_variable_set(:@uploaded, [])
|
8
|
+
def @service.upload(payload)
|
9
|
+
@uploaded << payload
|
10
|
+
[200, {}]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#emit_point' do
|
15
|
+
it 'passes data' do
|
16
|
+
@dogmock.emit_point('metric.name', 0, host: 'myhost')
|
17
|
+
|
18
|
+
uploaded = @service.instance_variable_get(:@uploaded)
|
19
|
+
expect(uploaded.length).to eq 1
|
20
|
+
series = uploaded.first
|
21
|
+
expect(series.class).to eq Array
|
22
|
+
expect(series[0][:metric]).to eq 'metric.name'
|
23
|
+
expect(series[0][:points][0][1]).to eq 0
|
24
|
+
expect(series[0][:host]).to eq 'myhost'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'uses localhost default' do
|
28
|
+
@dogmock.emit_point('metric.name', 0)
|
29
|
+
|
30
|
+
uploaded = @service.instance_variable_get(:@uploaded)
|
31
|
+
series = uploaded.first
|
32
|
+
expect(series[0][:host]).to eq Dogapi.find_localhost
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'can pass nil host' do
|
36
|
+
@dogmock.emit_point('metric.name', 0, host: nil)
|
37
|
+
|
38
|
+
uploaded = @service.instance_variable_get(:@uploaded)
|
39
|
+
series = uploaded.first
|
40
|
+
expect(series[0][:host]).to be_nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'can be batched' do
|
44
|
+
code, = @dogmock.batch_metrics do
|
45
|
+
@dogmock.emit_point('metric.name', 1, type: 'counter')
|
46
|
+
@dogmock.emit_point('othermetric.name', 2, type: 'counter')
|
47
|
+
end
|
48
|
+
expect(code).to eq 200
|
49
|
+
# Verify that we uploaded what we expected
|
50
|
+
uploaded = @service.instance_variable_get(:@uploaded)
|
51
|
+
expect(uploaded.length).to eq 1
|
52
|
+
series = uploaded.first
|
53
|
+
expect(series.class).to eq Array
|
54
|
+
expect(series[0][:metric]).to eq 'metric.name'
|
55
|
+
expect(series[0][:points][0][1]).to eq 1
|
56
|
+
expect(series[0][:type]).to eq 'counter'
|
57
|
+
expect(series[1][:metric]).to eq 'othermetric.name'
|
58
|
+
expect(series[1][:points][0][1]).to eq 2
|
59
|
+
expect(series[1][:type]).to eq 'counter'
|
60
|
+
|
61
|
+
# Verify that the buffer was correclty emptied
|
62
|
+
buffer = @service.instance_variable_get(:@buffer)
|
63
|
+
expect(buffer).to be nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'flushes the buffer even if an exception is raised' do
|
67
|
+
buffer = []
|
68
|
+
begin
|
69
|
+
@dogmock.batch_metrics do
|
70
|
+
@dogmock.emit_point('metric.name', 1, type: 'counter')
|
71
|
+
raise 'Oh no, something went wrong'
|
72
|
+
end
|
73
|
+
rescue
|
74
|
+
buffer = @service.instance_variable_get(:@buffer)
|
75
|
+
end
|
76
|
+
expect(buffer).to be nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|