dogapi 1.8.1 → 1.9.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.
Files changed (36) hide show
  1. data/.rspec +2 -0
  2. data/.tailor +106 -0
  3. data/CHANGELOG.md +3 -0
  4. data/Gemfile +7 -0
  5. data/README.rdoc +4 -1
  6. data/Rakefile +31 -2
  7. data/lib/capistrano/datadog.rb +6 -10
  8. data/lib/dogapi/common.rb +1 -1
  9. data/lib/dogapi/event.rb +6 -6
  10. data/lib/dogapi/facade.rb +34 -45
  11. data/lib/dogapi/v1/alert.rb +1 -1
  12. data/lib/dogapi/v1/comment.rb +3 -3
  13. data/lib/dogapi/v1/dash.rb +1 -2
  14. data/lib/dogapi/v1/event.rb +1 -1
  15. data/lib/dogapi/v1/metric.rb +3 -3
  16. data/lib/dogapi/v1/user.rb +1 -1
  17. data/lib/dogapi/version.rb +1 -1
  18. data/spec/alerts_spec.rb +33 -0
  19. data/spec/common_spec.rb +16 -0
  20. data/spec/facade_spec.rb +122 -0
  21. data/spec/spec_helper.rb +28 -0
  22. data/spec/support/cassettes/Alerts/create/returns_HTTP_code_201.yml +90 -0
  23. data/spec/support/cassettes/Alerts/create/returns_a_valid_event_ID.yml +90 -0
  24. data/spec/support/cassettes/Alerts/create/returns_the_same_query_as_sent.yml +90 -0
  25. data/spec/support/cassettes/Facade/Client/emit_point_can_pass_nil_host.yml +32 -0
  26. data/spec/support/cassettes/Facade/Client/emit_point_passes_data.yml +32 -0
  27. data/spec/support/cassettes/Facade/Client/emit_point_uses_localhost_default.yml +32 -0
  28. data/spec/support/cassettes/Facade/Client/emits_point_with_localhost.yml +32 -0
  29. data/spec/support/cassettes/Facade/Events/emits_aggregate_events.yml +131 -0
  30. data/spec/support/cassettes/Facade/Events/emits_events_and_retrieves_them.yml +67 -0
  31. data/spec/support/cassettes/Facade/Events/emits_events_with_specified_priority.yml +67 -0
  32. data/spec/support/cassettes/Facade/Tags/adds_updates_and_detaches_tags.yml +352 -0
  33. data/tests/test_alerts.rb +3 -3
  34. data/tests/test_client.rb +0 -114
  35. data/tests/test_dashes.rb +3 -2
  36. metadata +38 -7
@@ -0,0 +1,352 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://app.datadoghq.com/api/v1/series?api_key=9775a026f1ca7d1c6c5af9d94d9595a4
6
+ body:
7
+ encoding: UTF-8
8
+ string: ! '{"series":[{"metric":"test.tag.metric","points":[[1377814456,1.0]],"type":"gauge","host":"test.tag.host","device":null}]}'
9
+ headers:
10
+ Accept:
11
+ - ! '*/*'
12
+ User-Agent:
13
+ - Ruby
14
+ Content-Type:
15
+ - application/json
16
+ response:
17
+ status:
18
+ code: 202
19
+ message: Accepted
20
+ headers:
21
+ Content-Type:
22
+ - text/json; charset=UTF-8
23
+ Date:
24
+ - Thu, 29 Aug 2013 22:14:17 GMT
25
+ Server:
26
+ - dogdispatcher/4.7.0
27
+ Content-Length:
28
+ - '15'
29
+ Connection:
30
+ - keep-alive
31
+ body:
32
+ encoding: US-ASCII
33
+ string: ! '{"status":"ok"}'
34
+ http_version:
35
+ recorded_at: Thu, 29 Aug 2013 22:14:17 GMT
36
+ - request:
37
+ method: delete
38
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
39
+ body:
40
+ encoding: US-ASCII
41
+ string: ''
42
+ headers:
43
+ Accept:
44
+ - ! '*/*'
45
+ User-Agent:
46
+ - Ruby
47
+ response:
48
+ status:
49
+ code: 204
50
+ message: No Content
51
+ headers:
52
+ Cache-Control:
53
+ - no-cache
54
+ Content-Length:
55
+ - '4'
56
+ Content-Type:
57
+ - application/json
58
+ Date:
59
+ - Thu, 29 Aug 2013 22:15:11 GMT
60
+ Pragma:
61
+ - no-cache
62
+ Server:
63
+ - gunicorn/0.17.4
64
+ Set-Cookie:
65
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
66
+ X-Dd-Version:
67
+ - 31.161-301-21fcab4
68
+ Connection:
69
+ - keep-alive
70
+ body:
71
+ encoding: US-ASCII
72
+ string: ''
73
+ http_version:
74
+ recorded_at: Thu, 29 Aug 2013 22:15:11 GMT
75
+ - request:
76
+ method: get
77
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
78
+ body:
79
+ encoding: US-ASCII
80
+ string: ''
81
+ headers:
82
+ Accept:
83
+ - ! '*/*'
84
+ User-Agent:
85
+ - Ruby
86
+ response:
87
+ status:
88
+ code: 200
89
+ message: OK
90
+ headers:
91
+ Cache-Control:
92
+ - no-cache
93
+ Content-Type:
94
+ - application/json
95
+ Date:
96
+ - Thu, 29 Aug 2013 22:15:26 GMT
97
+ Pragma:
98
+ - no-cache
99
+ Server:
100
+ - gunicorn/0.17.4
101
+ Set-Cookie:
102
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
103
+ X-Dd-Version:
104
+ - 31.161-301-21fcab4
105
+ Content-Length:
106
+ - '12'
107
+ Connection:
108
+ - keep-alive
109
+ body:
110
+ encoding: US-ASCII
111
+ string: ! '{"tags": []}'
112
+ http_version:
113
+ recorded_at: Thu, 29 Aug 2013 22:15:26 GMT
114
+ - request:
115
+ method: post
116
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
117
+ body:
118
+ encoding: UTF-8
119
+ string: ! '{"tags":["test.tag.1","test.tag.2"]}'
120
+ headers:
121
+ Accept:
122
+ - ! '*/*'
123
+ User-Agent:
124
+ - Ruby
125
+ Content-Type:
126
+ - application/json
127
+ response:
128
+ status:
129
+ code: 201
130
+ message: Created
131
+ headers:
132
+ Cache-Control:
133
+ - no-cache
134
+ Content-Type:
135
+ - application/json
136
+ Date:
137
+ - Thu, 29 Aug 2013 22:17:11 GMT
138
+ Pragma:
139
+ - no-cache
140
+ Server:
141
+ - gunicorn/0.17.4
142
+ Set-Cookie:
143
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
144
+ X-Dd-Version:
145
+ - 31.161-301-21fcab4
146
+ Content-Length:
147
+ - '63'
148
+ Connection:
149
+ - keep-alive
150
+ body:
151
+ encoding: US-ASCII
152
+ string: ! '{"host": "test.tag.host", "tags": ["test.tag.2", "test.tag.1"]}'
153
+ http_version:
154
+ recorded_at: Thu, 29 Aug 2013 22:17:11 GMT
155
+ - request:
156
+ method: get
157
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
158
+ body:
159
+ encoding: US-ASCII
160
+ string: ''
161
+ headers:
162
+ Accept:
163
+ - ! '*/*'
164
+ User-Agent:
165
+ - Ruby
166
+ response:
167
+ status:
168
+ code: 200
169
+ message: OK
170
+ headers:
171
+ Cache-Control:
172
+ - no-cache
173
+ Content-Type:
174
+ - application/json
175
+ Date:
176
+ - Thu, 29 Aug 2013 22:17:11 GMT
177
+ Pragma:
178
+ - no-cache
179
+ Server:
180
+ - gunicorn/0.17.4
181
+ Set-Cookie:
182
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
183
+ X-Dd-Version:
184
+ - 31.161-301-21fcab4
185
+ Content-Length:
186
+ - '38'
187
+ Connection:
188
+ - keep-alive
189
+ body:
190
+ encoding: US-ASCII
191
+ string: ! '{"tags": ["test.tag.2", "test.tag.1"]}'
192
+ http_version:
193
+ recorded_at: Thu, 29 Aug 2013 22:17:11 GMT
194
+ - request:
195
+ method: post
196
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
197
+ body:
198
+ encoding: UTF-8
199
+ string: ! '{"tags":["test.tag.3"]}'
200
+ headers:
201
+ Accept:
202
+ - ! '*/*'
203
+ User-Agent:
204
+ - Ruby
205
+ Content-Type:
206
+ - application/json
207
+ response:
208
+ status:
209
+ code: 201
210
+ message: Created
211
+ headers:
212
+ Cache-Control:
213
+ - no-cache
214
+ Content-Type:
215
+ - application/json
216
+ Date:
217
+ - Thu, 29 Aug 2013 22:22:15 GMT
218
+ Pragma:
219
+ - no-cache
220
+ Server:
221
+ - gunicorn/0.17.4
222
+ Set-Cookie:
223
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
224
+ X-Dd-Version:
225
+ - 31.161-301-21fcab4
226
+ Content-Length:
227
+ - '77'
228
+ Connection:
229
+ - keep-alive
230
+ body:
231
+ encoding: US-ASCII
232
+ string: ! '{"host": "test.tag.host", "tags": ["test.tag.2", "test.tag.3", "test.tag.1"]}'
233
+ http_version:
234
+ recorded_at: Thu, 29 Aug 2013 22:22:15 GMT
235
+ - request:
236
+ method: get
237
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
238
+ body:
239
+ encoding: US-ASCII
240
+ string: ''
241
+ headers:
242
+ Accept:
243
+ - ! '*/*'
244
+ User-Agent:
245
+ - Ruby
246
+ response:
247
+ status:
248
+ code: 200
249
+ message: OK
250
+ headers:
251
+ Cache-Control:
252
+ - no-cache
253
+ Content-Type:
254
+ - application/json
255
+ Date:
256
+ - Thu, 29 Aug 2013 22:22:16 GMT
257
+ Pragma:
258
+ - no-cache
259
+ Server:
260
+ - gunicorn/0.17.4
261
+ Set-Cookie:
262
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
263
+ X-Dd-Version:
264
+ - 31.161-301-21fcab4
265
+ Content-Length:
266
+ - '52'
267
+ Connection:
268
+ - keep-alive
269
+ body:
270
+ encoding: US-ASCII
271
+ string: ! '{"tags": ["test.tag.2", "test.tag.3", "test.tag.1"]}'
272
+ http_version:
273
+ recorded_at: Thu, 29 Aug 2013 22:22:16 GMT
274
+ - request:
275
+ method: delete
276
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
277
+ body:
278
+ encoding: US-ASCII
279
+ string: ''
280
+ headers:
281
+ Accept:
282
+ - ! '*/*'
283
+ User-Agent:
284
+ - Ruby
285
+ response:
286
+ status:
287
+ code: 204
288
+ message: No Content
289
+ headers:
290
+ Cache-Control:
291
+ - no-cache
292
+ Content-Length:
293
+ - '4'
294
+ Content-Type:
295
+ - application/json
296
+ Date:
297
+ - Thu, 29 Aug 2013 22:23:47 GMT
298
+ Pragma:
299
+ - no-cache
300
+ Server:
301
+ - gunicorn/0.17.4
302
+ Set-Cookie:
303
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
304
+ X-Dd-Version:
305
+ - 31.161-301-21fcab4
306
+ Connection:
307
+ - keep-alive
308
+ body:
309
+ encoding: US-ASCII
310
+ string: ''
311
+ http_version:
312
+ recorded_at: Thu, 29 Aug 2013 22:23:47 GMT
313
+ - request:
314
+ method: get
315
+ uri: https://app.datadoghq.com/api/v1/tags/hosts/test.tag.host?api_key=9775a026f1ca7d1c6c5af9d94d9595a4&application_key=87ce4a24b5553d2e482ea8a8500e71b8ad4554ff
316
+ body:
317
+ encoding: US-ASCII
318
+ string: ''
319
+ headers:
320
+ Accept:
321
+ - ! '*/*'
322
+ User-Agent:
323
+ - Ruby
324
+ response:
325
+ status:
326
+ code: 200
327
+ message: OK
328
+ headers:
329
+ Cache-Control:
330
+ - no-cache
331
+ Content-Type:
332
+ - application/json
333
+ Date:
334
+ - Thu, 29 Aug 2013 22:23:47 GMT
335
+ Pragma:
336
+ - no-cache
337
+ Server:
338
+ - gunicorn/0.17.4
339
+ Set-Cookie:
340
+ - user={"org":{"id":1499},"_type":"User","id":3658}; Path=/
341
+ X-Dd-Version:
342
+ - 31.161-301-21fcab4
343
+ Content-Length:
344
+ - '12'
345
+ Connection:
346
+ - keep-alive
347
+ body:
348
+ encoding: US-ASCII
349
+ string: ! '{"tags": []}'
350
+ http_version:
351
+ recorded_at: Thu, 29 Aug 2013 22:23:48 GMT
352
+ recorded_with: VCR 2.5.0
@@ -8,7 +8,7 @@ class TestAlerts < Test::Unit::TestCase
8
8
  def test_alerts
9
9
  dog = Dogapi::Client.new(@api_key, @app_key)
10
10
 
11
- query = 'sum(last_1d):sum:system.net.bytes_rcvd{host:host0} > 100'
11
+ query = 'avg(last_1h):sum:system.net.bytes_rcvd{host:host0} > 100'
12
12
 
13
13
  alert_id = dog.alert(query)[1]['id']
14
14
  status, alert = dog.get_alert(alert_id)
@@ -22,8 +22,8 @@ class TestAlerts < Test::Unit::TestCase
22
22
 
23
23
  dog.delete_alert(alert_id)
24
24
 
25
- query1 = 'sum(last_1d):sum:system.net.bytes_rcvd{host:host0} > 100'
26
- query2 = 'sum(last_1d):sum:system.net.bytes_rcvd{host:host0} > 200'
25
+ query1 = 'avg(last_1h):sum:system.net.bytes_rcvd{host:host0} > 100'
26
+ query2 = 'avg(last_1h):sum:system.net.bytes_rcvd{host:host0} > 200'
27
27
 
28
28
  alert_id1 = dog.alert(query1)[1]['id']
29
29
  alert_id2 = dog.alert(query2)[1]['id']
@@ -12,120 +12,6 @@ class TestClient < Test::Unit::TestCase
12
12
  assert Dogapi.find_localhost == %x[hostname -f].strip
13
13
  end
14
14
 
15
- def test_tags
16
- hostname = "test.tag.host.#{job_number}"
17
- dog = Dogapi::Client.new(@api_key, @app_key)
18
-
19
- # post a metric to make sure the test host context exists
20
- dog.emit_point('test.tag.metric', 1, :host => hostname)
21
-
22
- # Disable this call until we fix the timeouts
23
- # dog.all_tags()
24
-
25
- sleep 3
26
-
27
- dog.detach_tags(hostname)
28
- code, resp = dog.host_tags(hostname)
29
- assert resp["tags"].size == 0
30
-
31
- dog.add_tags(hostname, ['test.tag.1', 'test.tag.2'])
32
- code, resp = dog.host_tags(hostname)
33
- new_tags = resp["tags"]
34
- assert new_tags.size == 2
35
- assert new_tags.include?('test.tag.1')
36
- assert new_tags.include?('test.tag.2')
37
-
38
- dog.add_tags(hostname, ['test.tag.3'])
39
- code, resp = dog.host_tags(hostname)
40
- new_tags = resp["tags"]
41
- assert new_tags.size == 3
42
- assert new_tags.include?('test.tag.1')
43
- assert new_tags.include?('test.tag.2')
44
- assert new_tags.include?('test.tag.3')
45
-
46
- dog.update_tags(hostname, ['test.tag.4'])
47
- code, resp = dog.host_tags(hostname)
48
- new_tags = resp["tags"]
49
- assert new_tags.size == 1
50
- assert new_tags.include?('test.tag.4')
51
-
52
- dog.detach_tags(hostname)
53
- code, resp = dog.host_tags(hostname)
54
- assert resp["tags"].size == 0
55
- end
56
-
57
- def test_events
58
- now = Time.now()
59
-
60
- # Tag the events with the build number, because Travis parallel testing
61
- # can cause problems with the event stream
62
- tags = ["test-run:#{job_number}"]
63
-
64
- now_ts = now
65
- now_title = 'dogapi-rb end test title ' + now_ts.to_i.to_s
66
- now_message = 'test message ' + now_ts.to_i.to_s
67
-
68
- before_ts = (now - 5*60)
69
- before_title = 'dogapi-rb start test title ' + before_ts.to_i.to_s
70
- before_message = 'test message ' + before_ts.to_i.to_s
71
-
72
- dog = Dogapi::Client.new(@api_key, @app_key)
73
- dog_r = Dogapi::Client.new(@api_key)
74
-
75
- e1 = Dogapi::Event.new(now_message, :msg_title => now_title,
76
- :date_happened => now_ts, :tags => tags)
77
- e2 = Dogapi::Event.new(before_message, :msg_title => before_title,
78
- :date_happened => before_ts, :tags => tags)
79
-
80
- code, resp = dog_r.emit_event(e1)
81
- now_event_id = resp["event"]["id"]
82
- code, resp = dog_r.emit_event(e2)
83
- before_event_id = resp["event"]["id"]
84
-
85
- sleep 5
86
-
87
- code, resp = dog.stream(before_ts, now_ts + 1, :tags => tags)
88
- stream = resp["events"]
89
-
90
- code, resp = dog.get_event(now_event_id)
91
- assert !resp['event'].nil?
92
- now_event = resp['event']
93
-
94
- code, resp = dog.get_event(before_event_id)
95
- assert !resp['event'].nil?
96
- before_event = resp['event']
97
-
98
- assert now_event['text'] == now_message
99
- assert before_event['text'] == before_message
100
-
101
- # Testing priorities
102
- code, resp = dog_r.emit_event(Dogapi::Event.new(now_message, :msg_title => now_title, :date_happened => now_ts, :priority => "low"))
103
- low_event_id = resp["event"]["id"]
104
-
105
- sleep 5
106
-
107
- code, resp = dog.get_event(low_event_id)
108
- assert !resp['event'].nil?
109
- low_event = resp['event']
110
- assert low_event['priority'] == "low"
111
-
112
- # Testing aggregates
113
- agg_ts = Time.now()
114
- code, resp = dog_r.emit_event(Dogapi::Event.new("Testing Aggregation (first)", :aggregation_key => now_ts.to_i))
115
- first = resp["event"]["id"]
116
- code, resp = dog_r.emit_event(Dogapi::Event.new("Testing Aggregation (second)", :aggregation_key => now_ts.to_i))
117
- second = resp["event"]["id"]
118
-
119
- sleep 3
120
-
121
- code, resp = dog.get_event(first)
122
- agg1 = resp["event"]
123
- code, resp = dog.get_event(second)
124
- agg2 = resp["event"]
125
-
126
- # FIXME Need to export is_aggregate/children fields
127
- end
128
-
129
15
  def test_metrics
130
16
  # FIXME: actually verify this once there's a way to look at metrics through the api
131
17
  dog = Dogapi::Client.new(@api_key, @app_key)