mackerel-client 0.3.0 → 0.4.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/example/01_invitation.rb +12 -0
  4. data/example/02_dashboard.rb +29 -0
  5. data/example/03_host.rb +97 -0
  6. data/example/04_metrics.rb +44 -0
  7. data/example/05_service_role.rb +10 -0
  8. data/example/06_annotation.rb +26 -0
  9. data/example/07_monitoring.rb +100 -0
  10. data/example/08_alert.rb +10 -0
  11. data/example/Gemfile +6 -0
  12. data/lib/mackerel/alert.rb +48 -0
  13. data/lib/mackerel/annotation.rb +61 -0
  14. data/lib/mackerel/api_command.rb +67 -0
  15. data/lib/mackerel/channel.rb +32 -0
  16. data/lib/mackerel/client.rb +30 -154
  17. data/lib/mackerel/dashboard.rb +71 -0
  18. data/lib/mackerel/host.rb +62 -0
  19. data/lib/mackerel/invitation.rb +20 -0
  20. data/lib/mackerel/metadata.rb +15 -47
  21. data/lib/mackerel/metric.rb +50 -0
  22. data/lib/mackerel/monitor.rb +23 -53
  23. data/lib/mackerel/monitoring.rb +13 -0
  24. data/lib/mackerel/notification_group.rb +58 -0
  25. data/lib/mackerel/organization.rb +33 -0
  26. data/lib/mackerel/role.rb +24 -0
  27. data/lib/mackerel/service.rb +51 -0
  28. data/lib/mackerel/user.rb +42 -0
  29. data/lib/mackerel/version.rb +3 -0
  30. data/lib/mackerel.rb +2 -3
  31. data/spec/mackerel/alert_spec.rb +103 -0
  32. data/spec/mackerel/annotation_spec.rb +208 -0
  33. data/spec/mackerel/channel_spec.rb +50 -0
  34. data/spec/mackerel/client_spec.rb +69 -103
  35. data/spec/mackerel/dashboard_spec.rb +252 -0
  36. data/spec/mackerel/invitation_spec.rb +93 -0
  37. data/spec/mackerel/metric_spec.rb +287 -0
  38. data/spec/mackerel/monitor_spec.rb +4 -4
  39. data/spec/mackerel/monitoring_spec.rb +71 -0
  40. data/spec/mackerel/notification_group_spec.rb +274 -0
  41. data/spec/mackerel/organization_spec.rb +47 -0
  42. data/spec/mackerel/service_spec.rb +155 -0
  43. data/spec/mackerel/user_spec.rb +99 -0
  44. metadata +47 -2
@@ -54,6 +54,49 @@ describe Mackerel::Client do
54
54
  end
55
55
  end
56
56
 
57
+
58
+ describe '#update_host' do
59
+ let(:stubbed_response) {
60
+ [
61
+ 200,
62
+ {},
63
+ JSON.dump(response_object)
64
+ ]
65
+ }
66
+
67
+ let(:test_client) {
68
+ Faraday.new do |builder|
69
+ builder.adapter :test do |stubs|
70
+ stubs.put(api_path) { stubbed_response }
71
+ end
72
+ end
73
+ }
74
+
75
+ let(:hostId) { '21obeF4PhZN' }
76
+
77
+ let(:api_path) { "/api/v0/hosts/#{hostId}" }
78
+
79
+ let(:host) {
80
+ {
81
+ 'name' => 'host001',
82
+ 'meta' => {"abcd" => "abcdefghijklmnopqlstu"}
83
+ }
84
+ }
85
+
86
+ let(:response_object) {
87
+ { 'id' => hostId }
88
+ }
89
+
90
+ before do
91
+ allow(client).to receive(:http_client).and_return(test_client)
92
+ end
93
+
94
+ it "successfully update host" do
95
+ expect(client.update_host(hostId, host)).to eq(response_object)
96
+ end
97
+ end
98
+
99
+
57
100
  describe '#get_host' do
58
101
  let(:stubbed_response) {
59
102
  [
@@ -143,7 +186,8 @@ describe Mackerel::Client do
143
186
  end
144
187
  end
145
188
 
146
- describe '#retire_host' do
189
+
190
+ describe '#update_host_roles' do
147
191
  let(:stubbed_response) {
148
192
  [
149
193
  200,
@@ -155,110 +199,37 @@ describe Mackerel::Client do
155
199
  let(:test_client) {
156
200
  Faraday.new do |builder|
157
201
  builder.adapter :test do |stubs|
158
- stubs.post(api_path) { stubbed_response }
202
+ stubs.put(api_path) { stubbed_response }
159
203
  end
160
204
  end
161
205
  }
162
206
 
163
207
  let(:hostId) { '21obeF4PhZN' }
164
208
 
165
- let(:api_path) { "/api/v0/hosts/#{hostId}/retire" }
209
+ let(:api_path) { "/api/v0/hosts/#{hostId}/role-fullnames" }
166
210
 
167
- let(:response_object) {
168
- { 'success' => true }
169
- }
170
-
171
- before do
172
- allow(client).to receive(:http_client).and_return(test_client)
173
- end
174
-
175
- it "successfully retire a host" do
176
- expect(client.retire_host(hostId)).to eq(response_object)
177
- end
178
- end
179
-
180
- describe '#post_metrics' do
181
- let(:stubbed_response) {
182
- [
183
- 200,
184
- {},
185
- JSON.dump(response_object)
186
- ]
187
- }
188
-
189
- let(:test_client) {
190
- Faraday.new do |builder|
191
- builder.adapter :test do |stubs|
192
- stubs.post(api_path) { stubbed_response }
193
- end
194
- end
211
+ let(:roles) {
212
+ [
213
+ 'Web', 'Linux', 'NetworkG1'
214
+ ]
195
215
  }
196
216
 
197
- let(:hostId) { '21obeF4PhZN' }
198
-
199
- let(:api_path) { "/api/v0/tsdb" }
200
-
201
217
  let(:response_object) {
202
- { 'success' => true }
218
+ { 'success' => true}
203
219
  }
204
220
 
205
- let(:metrics) { [
206
- { 'hostId' => hostId, 'name' => 'custom.metrics.loadavg', 'time' => 1401537844, 'value' => 1.4 },
207
- { 'hostId' => hostId, 'name' => 'custom.metrics.uptime', 'time' => 1401537844, 'value' => 500 },
208
- ] }
209
-
210
221
  before do
211
222
  allow(client).to receive(:http_client).and_return(test_client)
212
223
  end
213
224
 
214
- it "successfully post metrics" do
215
- expect(client.post_metrics(metrics)).to eq(response_object)
225
+ it "successfully update host" do
226
+ expect(client.update_host_roles(hostId, roles)).to eq({'success' => true})
216
227
  end
217
228
  end
218
229
 
219
- describe "#get_latest_metrics" do
220
- let(:stubbed_response) {
221
- [
222
- 200,
223
- {},
224
- JSON.dump(response_object)
225
- ]
226
- }
227
-
228
- let(:test_client) {
229
- Faraday.new do |builder|
230
- builder.adapter :test do |stubs|
231
- stubs.get(api_path) { stubbed_response }
232
- end
233
- end
234
- }
235
-
236
- let(:hostId) { '21obeF4PhZN' }
237
230
 
238
- let(:metric_name) { "loadavg5" }
239
231
 
240
- let(:api_path) { "/api/v0/tsdb/latest" }
241
-
242
- let(:response_object) {
243
- {
244
- "tsdbLatest" => {
245
- hostId => {
246
- metric_name => {"time"=>1407898200, "value"=>0.03666666666666667},
247
- }
248
- }
249
- }
250
- }
251
-
252
- before do
253
- allow(client).to receive(:http_client).and_return(test_client)
254
- end
255
-
256
- it "successfully post metrics" do
257
- expect(client.get_latest_metrics([hostId], [metric_name])).to eq(response_object["tsdbLatest"])
258
- end
259
- end
260
-
261
- describe '#post_service_metrics' do
232
+ describe '#retire_host' do
262
233
  let(:stubbed_response) {
263
234
  [
264
235
  200,
@@ -275,25 +246,20 @@ describe Mackerel::Client do
275
246
  end
276
247
  }
277
248
 
278
- let(:service_name) { 'service_name' }
249
+ let(:hostId) { '21obeF4PhZN' }
279
250
 
280
- let(:api_path) { "/api/v0/services/#{service_name}/tsdb" }
251
+ let(:api_path) { "/api/v0/hosts/#{hostId}/retire" }
281
252
 
282
253
  let(:response_object) {
283
254
  { 'success' => true }
284
255
  }
285
256
 
286
- let(:metrics) { [
287
- { 'name' => 'custom.metrics.latency', 'time' => 1401537844, 'value' => 0.5 },
288
- { 'name' => 'custom.metrics.uptime', 'time' => 1401537844, 'value' => 500 },
289
- ] }
290
-
291
257
  before do
292
258
  allow(client).to receive(:http_client).and_return(test_client)
293
259
  end
294
260
 
295
- it "successfully post metrics" do
296
- expect(client.post_service_metrics(service_name, metrics)).to eq(response_object)
261
+ it "successfully retire a host" do
262
+ expect(client.retire_host(hostId)).to eq(response_object)
297
263
  end
298
264
  end
299
265
 
@@ -435,7 +401,7 @@ describe Mackerel::Client do
435
401
  let(:api_path) { '/api/v0/graph-annotations' }
436
402
 
437
403
  let(:response_object) {
438
- {
404
+ Mackerel::Annotation.new({
439
405
  'id' => 'XXX',
440
406
  'service' => 'myService',
441
407
  'roles' => ['role1', 'role2'],
@@ -443,17 +409,17 @@ describe Mackerel::Client do
443
409
  'to' => 123457,
444
410
  'title' => 'Some event',
445
411
  'description' => 'Something happend!'
446
- }
412
+ })
447
413
  }
448
414
 
449
415
  let(:annotation) {
450
416
  {
451
- service: 'myService',
452
- roles: ['role1', 'role2'],
453
- from: 123456,
454
- to: 123457,
455
- title: 'Some event',
456
- description: 'Something happend!'
417
+ 'service' => 'myService',
418
+ 'roles' => ['role1', 'role2'],
419
+ 'from' => 123456,
420
+ 'to' => 123457,
421
+ 'title' => 'Some event',
422
+ 'description' => 'Something happend!'
457
423
  }
458
424
  }
459
425
 
@@ -461,8 +427,8 @@ describe Mackerel::Client do
461
427
  allow(client).to receive(:http_client).and_return(test_client)
462
428
  end
463
429
 
464
- it "successfully post annotations" do
465
- expect(client.post_graph_annotation(annotation)).to eq(response_object)
430
+ it "successfully post graph annotations" do
431
+ expect(client.post_graph_annotation(annotation).to_h).to eq(annotation.merge({ "id" => "XXX" }))
466
432
  end
467
433
  end
468
434
 
@@ -0,0 +1,252 @@
1
+ require 'mackerel'
2
+ require 'mackerel/host'
3
+ require 'json'
4
+
5
+ describe Mackerel::Client do
6
+ let(:api_key) { 'xxxxxxxx' }
7
+ let(:client) { Mackerel::Client.new(:mackerel_api_key => api_key) }
8
+
9
+ describe '#post_dashboard' do
10
+ let(:stubbed_response) {
11
+ [
12
+ 200,
13
+ {},
14
+ JSON.dump(response_object)
15
+ ]
16
+ }
17
+
18
+ let(:test_client) {
19
+ Faraday.new do |builder|
20
+ builder.adapter :test do |stubs|
21
+ stubs.post(api_path) { stubbed_response }
22
+ end
23
+ end
24
+ }
25
+
26
+ let(:id) { 'abcxyz' }
27
+ let(:api_path) { '/api/v0/dashboards' }
28
+ let(:title) { 'HogeHoge' }
29
+ let(:bodyMarkdown) { '#HogeHoge' }
30
+ let(:urlPath) { 'Hoge' }
31
+
32
+ let(:dashboard) {
33
+ {
34
+ 'title' => title,
35
+ 'bodyMarkdown' => bodyMarkdown,
36
+ 'urlPath' => urlPath,
37
+ 'createdAt' => 1234567890,
38
+ 'updatedAt' => 1234567891
39
+ }
40
+ }
41
+
42
+ let(:response_object) {
43
+ dashboard
44
+ }
45
+
46
+ before do
47
+ allow(client).to receive(:http_client).and_return(test_client)
48
+ end
49
+
50
+ it "successfully post dashboard" do
51
+ expect(client.post_dashboard(title, bodyMarkdown, urlPath).to_h).to eq(response_object)
52
+ end
53
+ end
54
+
55
+
56
+
57
+ describe '#update_dashboard' do
58
+ let(:stubbed_response) {
59
+ [
60
+ 200,
61
+ {},
62
+ JSON.dump(response_object)
63
+ ]
64
+ }
65
+
66
+ let(:test_client) {
67
+ Faraday.new do |builder|
68
+ builder.adapter :test do |stubs|
69
+ stubs.put(api_path) { stubbed_response }
70
+ end
71
+ end
72
+ }
73
+
74
+ let(:id) { 'abcxyz' }
75
+ let(:api_path) { "/api/v0/dashboards/#{id}" }
76
+ let(:title) { 'HogeHoge' }
77
+ let(:bodyMarkdown) { '#HogeHoge' }
78
+ let(:urlPath) { 'Hoge' }
79
+
80
+ let(:dashboard) {
81
+ {
82
+ 'id' => id,
83
+ 'title' => title,
84
+ 'bodyMarkdown' => bodyMarkdown,
85
+ 'urlPath' => urlPath,
86
+ 'createdAt' => 1234567890,
87
+ 'updatedAt' => 1234567891
88
+ }
89
+ }
90
+
91
+ let(:response_object) {
92
+ dashboard
93
+ }
94
+
95
+ before do
96
+ allow(client).to receive(:http_client).and_return(test_client)
97
+ end
98
+
99
+ it "successfully update dashboard" do
100
+ expect(client.update_dashboard(id, title, bodyMarkdown, urlPath).to_h).to eq(response_object)
101
+ end
102
+ end
103
+
104
+
105
+
106
+ describe '#get_dashboards' do
107
+ let(:stubbed_response) {
108
+ [
109
+ 200,
110
+ {},
111
+ JSON.dump(response_object)
112
+ ]
113
+ }
114
+
115
+ let(:test_client) {
116
+ Faraday.new do |builder|
117
+ builder.adapter :test do |stubs|
118
+ stubs.get(api_path) { stubbed_response }
119
+ end
120
+ end
121
+ }
122
+
123
+ let(:id) { 'abcxyz' }
124
+ let(:api_path) { "/api/v0/dashboards" }
125
+ let(:title) { 'HogeHoge' }
126
+ let(:bodyMarkdown) { '#HogeHoge' }
127
+ let(:urlPath) { 'Hoge' }
128
+
129
+ let(:dashboards) {
130
+ [
131
+ {
132
+ 'id' => id,
133
+ 'title' => title,
134
+ 'bodyMarkdown' => bodyMarkdown,
135
+ 'urlPath' => urlPath,
136
+ 'createdAt' => 1234567890,
137
+ 'updatedAt' => 1234567891
138
+ }
139
+ ]
140
+ }
141
+
142
+ let(:response_object) {
143
+ { 'dashboards' => dashboards }
144
+ }
145
+
146
+ before do
147
+ allow(client).to receive(:http_client).and_return(test_client)
148
+ end
149
+
150
+ it "successfully get dashboards" do
151
+ expect(client.get_dashboards().map(&:to_h)).to eq(response_object['dashboards'])
152
+ end
153
+ end
154
+
155
+
156
+ describe '#get_dashboard' do
157
+ let(:stubbed_response) {
158
+ [
159
+ 200,
160
+ {},
161
+ JSON.dump(response_object)
162
+ ]
163
+ }
164
+
165
+ let(:test_client) {
166
+ Faraday.new do |builder|
167
+ builder.adapter :test do |stubs|
168
+ stubs.get(api_path) { stubbed_response }
169
+ end
170
+ end
171
+ }
172
+
173
+ let(:id) { 'abcxyz' }
174
+ let(:api_path) { "/api/v0/dashboards/#{id}" }
175
+ let(:title) { 'HogeHoge' }
176
+ let(:bodyMarkdown) { '#HogeHoge' }
177
+ let(:urlPath) { 'Hoge' }
178
+
179
+ let(:dashboard) {
180
+ {
181
+ 'id' => id,
182
+ 'title' => title,
183
+ 'bodyMarkdown' => bodyMarkdown,
184
+ 'urlPath' => urlPath,
185
+ 'createdAt' => 1234567890,
186
+ 'updatedAt' => 1234567891
187
+ }
188
+ }
189
+
190
+ let(:response_object) {
191
+ dashboard
192
+ }
193
+
194
+ before do
195
+ allow(client).to receive(:http_client).and_return(test_client)
196
+ end
197
+
198
+ it "successfully get dashboard" do
199
+ expect(client.get_dashboard(id).to_h).to eq(response_object)
200
+ end
201
+ end
202
+
203
+
204
+ describe '#delete_dashboard' do
205
+ let(:stubbed_response) {
206
+ [
207
+ 200,
208
+ {},
209
+ JSON.dump(response_object)
210
+ ]
211
+ }
212
+
213
+ let(:test_client) {
214
+ Faraday.new do |builder|
215
+ builder.adapter :test do |stubs|
216
+ stubs.delete(api_path) { stubbed_response }
217
+ end
218
+ end
219
+ }
220
+
221
+ let(:id) { 'abcxyz' }
222
+ let(:api_path) { "/api/v0/dashboards/#{id}" }
223
+ let(:title) { 'HogeHoge' }
224
+ let(:bodyMarkdown) { '#HogeHoge' }
225
+ let(:urlPath) { 'Hoge' }
226
+
227
+ let(:dashboard) {
228
+ {
229
+ 'id' => id,
230
+ 'title' => title,
231
+ 'bodyMarkdown' => bodyMarkdown,
232
+ 'urlPath' => urlPath,
233
+ 'createdAt' => 1234567890,
234
+ 'updatedAt' => 1234567891
235
+ }
236
+ }
237
+
238
+ let(:response_object) {
239
+ dashboard
240
+ }
241
+
242
+ before do
243
+ allow(client).to receive(:http_client).and_return(test_client)
244
+ end
245
+
246
+ it "successfully delete dashboard" do
247
+ expect(client.delete_dashboard(id).to_h).to eq(response_object)
248
+ end
249
+ end
250
+
251
+
252
+ end
@@ -0,0 +1,93 @@
1
+ require 'mackerel'
2
+ require 'mackerel/host'
3
+ require 'json'
4
+
5
+ describe Mackerel::Client do
6
+ let(:api_key) { 'xxxxxxxx' }
7
+ let(:client) { Mackerel::Client.new(:mackerel_api_key => api_key) }
8
+
9
+ describe '#post_invitation' do
10
+
11
+ let(:api_path) { "/api/v0/invitations" }
12
+ let(:stubbed_response) {
13
+ [
14
+ 200,
15
+ {},
16
+ JSON.dump(response_object)
17
+ ]
18
+ }
19
+
20
+ let(:test_client) {
21
+ Faraday.new do |builder|
22
+ builder.adapter :test do |stubs|
23
+ stubs.post(api_path) { stubbed_response }
24
+ end
25
+ end
26
+ }
27
+
28
+ let(:email) { "example@example.com" }
29
+ let(:authority) { "viewer" }
30
+ let(:invitation) {
31
+ {
32
+ "email" => email,
33
+ "authority" => authority
34
+ }
35
+ }
36
+
37
+ let(:response_object) {
38
+ invitation
39
+ }
40
+
41
+ before do
42
+ allow(client).to receive(:http_client).and_return(test_client)
43
+ end
44
+
45
+ it "successfully post invitation" do
46
+ expect(client.post_invitation(email, authority)).to eq(response_object)
47
+ end
48
+ end
49
+
50
+
51
+
52
+ describe '#revoke_invitation' do
53
+ let(:stubbed_response) {
54
+ [
55
+ 200,
56
+ {},
57
+ JSON.dump(response_object)
58
+ ]
59
+ }
60
+
61
+ let(:test_client) {
62
+ Faraday.new do |builder|
63
+ builder.adapter :test do |stubs|
64
+ stubs.post(api_path) { stubbed_response }
65
+ end
66
+ end
67
+ }
68
+
69
+ let(:id) { 'abcxyz' }
70
+ let(:email) { "example@example.com" }
71
+ let(:api_path) { "/api/v0/invitations/revoke" }
72
+
73
+ let(:invitation) {
74
+ {
75
+ "email" => email,
76
+ "authority" => "viewer",
77
+ }
78
+ }
79
+
80
+ let(:response_object) {
81
+ invitation.merge({ "expiresAt" => 1492393387 })
82
+ }
83
+
84
+ before do
85
+ allow(client).to receive(:http_client).and_return(test_client)
86
+ end
87
+
88
+ it "successfully revoke invitation" do
89
+ expect(client.revoke_invitation(email)).to eq(invitation.merge({ "expiresAt" => 1492393387 }))
90
+ end
91
+ end
92
+
93
+ end