kapacitor-ruby 0.0.14 → 1.0.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/README.md +1 -57
- data/lib/kapacitor/client.rb +211 -74
- data/lib/kapacitor/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 102b40a3d2e642e578b98767820e73cfda264ba6
|
4
|
+
data.tar.gz: 86987d17ef079c29882d6987c39746346034bd3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 157f9a71d7a9bcef701a72d25d602151acc7f12b3376e00fa9273c30d12f47c2fb12b133989005c9fbe8d631659017762dcd421af2cc650409900fbd50fabc97
|
7
|
+
data.tar.gz: e82e8b70df2a1bc3051e6912d46e07fde3a16f5ec0a9848ca9418402bc0e3b1131c0e2611587b7d4d885a21c024a738222359dedc00e4a65ee7ee7213806f587
|
data/README.md
CHANGED
@@ -11,63 +11,7 @@ gem install kapacitor-ruby
|
|
11
11
|
```
|
12
12
|
|
13
13
|
## Usage
|
14
|
-
|
15
|
-
require 'kapacitor/client'
|
16
|
-
kapacitor = Kapacitor::Client.new(host: 'localhost:9092', version: 'v1')
|
17
|
-
```
|
18
|
-
|
19
|
-
### Templates
|
20
|
-
|
21
|
-
#### `define_template`
|
22
|
-
Create a new template definition
|
23
|
-
```
|
24
|
-
define_template(id: 'name', type: 'stream', script: 'tickscript')
|
25
|
-
```
|
26
|
-
|
27
|
-
#### `update_template`
|
28
|
-
Update one or more templates' options
|
29
|
-
```
|
30
|
-
update_template(id: 'name', type: 'batch')
|
31
|
-
```
|
32
|
-
|
33
|
-
#### `delete_template`
|
34
|
-
Delete a template
|
35
|
-
```
|
36
|
-
delete_template(id: 'name')
|
37
|
-
```
|
38
|
-
|
39
|
-
#### `templates`
|
40
|
-
Fetch all templates
|
41
|
-
```
|
42
|
-
templates()
|
43
|
-
```
|
44
|
-
|
45
|
-
### Tasks
|
46
|
-
|
47
|
-
#### `define_task`
|
48
|
-
Create a new task
|
49
|
-
```
|
50
|
-
define_task(id: 'name', template_id: 'optional template', type: 'stream', dbrps: [{'db' => 'telegraf', 'rp' => 'default'}], script: 'tickscript', status: 'enabled', vars: {})
|
51
|
-
```
|
52
|
-
|
53
|
-
#### `update_task`
|
54
|
-
Update one or more task's options
|
55
|
-
|
56
|
-
```
|
57
|
-
update_task(id: 'name', template_id: 'optional template', type: 'stream', dbrps: [{'db' => 'telegraf', 'rp' => 'default'}], script: 'tickscript', status: 'enabled', vars: {})
|
58
|
-
```
|
59
|
-
|
60
|
-
#### `delete_task`
|
61
|
-
Delete a task
|
62
|
-
```
|
63
|
-
delete_task(id: 'name')
|
64
|
-
```
|
65
|
-
|
66
|
-
#### `tasks`
|
67
|
-
Fetch all tasks
|
68
|
-
```
|
69
|
-
tasks()
|
70
|
-
```
|
14
|
+
Online documentation is available at [rubydoc](http://www.rubydoc.info/gems/kapacitor-ruby/).
|
71
15
|
|
72
16
|
## Contact
|
73
17
|
Matteo Cerutti - matteo.cerutti@hotmail.co.uk
|
data/lib/kapacitor/client.rb
CHANGED
@@ -1,136 +1,172 @@
|
|
1
|
-
#
|
2
|
-
# client.rb
|
3
|
-
#
|
4
|
-
|
5
1
|
require 'net/http'
|
6
2
|
require 'json'
|
7
3
|
|
8
4
|
module Kapacitor
|
9
5
|
class Client
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
6
|
+
# @return [URI] Kapacitor REST API URL
|
7
|
+
attr_reader :uri
|
8
|
+
# @return [Net::HTTP] HTTP client instance
|
9
|
+
attr_reader :http
|
10
|
+
|
11
|
+
# Create a new client
|
12
|
+
#
|
13
|
+
# @param url [String] Kapacitor REST API's URL (defaults to `http://localhost:9092`)
|
14
|
+
# @param version [Integer] API version (defaults to `v1preview`)
|
15
|
+
#
|
16
|
+
def initialize(host: 'http://localhost:9092', version: 'v1preview')
|
17
|
+
@uri = URI.parse("#{host}/kapacitor/#{version}")
|
17
18
|
@http = Net::HTTP.new(@uri.host, @uri.port)
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
# Define a Kapacitor template
|
22
|
+
#
|
23
|
+
# @param id [String] Template ID
|
24
|
+
# @param type [String] Template type. Valid values: `batch`, `stream`.
|
25
|
+
# @param script [String] Tick script
|
26
|
+
#
|
27
|
+
def define_template(id:, type:, script:)
|
28
|
+
raise ArgumentError, "Kapacitor template type can be either 'batch' or 'stream'" unless type == 'batch' || type == 'stream'
|
27
29
|
|
28
30
|
req = {
|
29
31
|
'id' => id,
|
30
|
-
'type' =>
|
31
|
-
'script' =>
|
32
|
+
'type' => type,
|
33
|
+
'script' => script
|
32
34
|
}
|
33
35
|
|
34
|
-
api_post('/templates', req)
|
36
|
+
api_post(endpoint: '/templates', data: req)
|
35
37
|
end
|
36
38
|
|
37
|
-
|
39
|
+
# Update a Kapacitor template
|
40
|
+
#
|
41
|
+
# @param id [String] Template ID
|
42
|
+
# @param **opts [Hash] Any number of template parameters to push into the Hash
|
43
|
+
#
|
44
|
+
def update_template(id:, **opts)
|
38
45
|
req = {}
|
39
|
-
req['type'] = opts[
|
40
|
-
req['script'] = opts[
|
46
|
+
req['type'] = opts[:type] if opts[:type]
|
47
|
+
req['script'] = opts[:script] if opts[:script]
|
41
48
|
|
42
|
-
if opts[
|
43
|
-
raise ArgumentError, "Kapacitor template type can be either 'batch' or 'stream'" unless
|
49
|
+
if opts[:type]
|
50
|
+
raise ArgumentError, "Kapacitor template type can be either 'batch' or 'stream'" unless opts[:type] == 'batch' or opts[:type] == 'stream'
|
44
51
|
end
|
45
52
|
|
46
|
-
api_patch("/templates/#{id}", req) unless req.empty?
|
53
|
+
api_patch(endpoint: "/templates/#{id}", data: req) unless req.empty?
|
47
54
|
end
|
48
55
|
|
49
|
-
|
50
|
-
|
56
|
+
# Delete a Kapacitor template
|
57
|
+
#
|
58
|
+
# @param id [String] Template ID
|
59
|
+
#
|
60
|
+
def delete_template(id:)
|
61
|
+
api_delete(endpoint: "/templates/#{id}")
|
51
62
|
end
|
52
63
|
|
64
|
+
# Retrieve Kapacitor templates
|
65
|
+
#
|
66
|
+
# @param offset [Integer] Offset count for paginating through templates
|
67
|
+
# @param limit [Integer] Maximum number of templates to return
|
68
|
+
# @return [Array[Hash]] List of templates
|
69
|
+
#
|
53
70
|
def templates(offset: 0, limit: 100)
|
54
|
-
|
71
|
+
ret = []
|
55
72
|
|
56
73
|
loop do
|
57
|
-
res = api_get("/templates?offset=#{offset}&limit=#{limit}")['templates']
|
74
|
+
res = api_get(endpoint: "/templates?offset=#{offset}&limit=#{limit}")['templates']
|
58
75
|
break unless res.size > 0
|
59
|
-
|
76
|
+
ret += res
|
60
77
|
offset += limit
|
61
78
|
end
|
62
79
|
|
63
|
-
|
80
|
+
ret
|
64
81
|
end
|
65
82
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
83
|
+
# Define a Kapacitor task
|
84
|
+
#
|
85
|
+
# @param id [String] Task ID
|
86
|
+
# @param dbrps [String] List of database retention policy pairs the task is allowed to access.
|
87
|
+
# @param **opts [Hash] Any number of task parameters to push into the Hash
|
88
|
+
#
|
89
|
+
def define_task(id:, dbrps:, **opts)
|
90
|
+
if (opts[:template_id].nil? && opts[:type].nil? && opts[:script].nil?) || (opts[:template_id] && (opts[:type] || opts[:script]))
|
70
91
|
raise ArgumentError, "Must specify either a Template ID or a script and type"
|
71
|
-
elsif opts['template_id'].nil?
|
92
|
+
elsif opts['template_id'].nil? && (opts['type'].nil? || opts['script'].nil?)
|
72
93
|
raise ArgumentError, "Must specify both task type and script when not using a Template ID"
|
73
94
|
end
|
74
95
|
|
75
|
-
if opts[
|
76
|
-
raise ArgumentError, "Kapacitor task status can be either 'enabled' or 'disabled'" unless
|
96
|
+
if opts[:status]
|
97
|
+
raise ArgumentError, "Kapacitor task status can be either 'enabled' or 'disabled'" unless opts[:status] == 'enabled' || opts[:status] == 'disabled'
|
77
98
|
end
|
78
99
|
|
79
|
-
if opts[
|
80
|
-
raise ArgumentError, "Kapacitor task type can be either 'batch' or 'stream'" unless
|
100
|
+
if opts[:type]
|
101
|
+
raise ArgumentError, "Kapacitor task type can be either 'batch' or 'stream'" unless opts[:type] == 'batch' || opts[:type] == 'stream'
|
81
102
|
end
|
82
103
|
|
83
104
|
req = {
|
84
105
|
'id' => id,
|
85
|
-
'dbrps' =>
|
86
|
-
'status' => opts[
|
106
|
+
'dbrps' => dbrps,
|
107
|
+
'status' => opts[:status] || 'enabled'
|
87
108
|
}
|
88
109
|
|
89
|
-
if opts[
|
90
|
-
req['template-id'] = opts[
|
110
|
+
if opts[:template_id]
|
111
|
+
req['template-id'] = opts[:template_id]
|
91
112
|
else
|
92
|
-
req['type'] = opts[
|
93
|
-
req['script'] = opts[
|
113
|
+
req['type'] = opts[:type]
|
114
|
+
req['script'] = opts[:script]
|
94
115
|
end
|
95
116
|
|
96
|
-
req['vars'] = opts[
|
117
|
+
req['vars'] = opts[:vars] if opts[:vars]
|
97
118
|
|
98
|
-
api_post('/tasks', req)
|
119
|
+
api_post(endpoint: '/tasks', data: req)
|
99
120
|
end
|
100
121
|
|
101
|
-
|
122
|
+
# Update a Kapacitor task
|
123
|
+
#
|
124
|
+
# @param id [String] Task ID
|
125
|
+
# @param **opts [Hash] Any number of task parameters to push into the Hash
|
126
|
+
#
|
127
|
+
def update_task(id:, **opts)
|
102
128
|
req = {}
|
103
|
-
req['template-id'] = opts[
|
104
|
-
req['type'] = opts[
|
105
|
-
req['dbrps'] = opts[
|
106
|
-
req['script'] = opts[
|
107
|
-
req['status'] = opts[
|
108
|
-
req['vars'] = opts[
|
109
|
-
|
110
|
-
if opts[
|
111
|
-
raise ArgumentError, "Kapacitor template type can be either 'batch' or 'stream'" unless
|
129
|
+
req['template-id'] = opts[:template_id] if opts[:template_id]
|
130
|
+
req['type'] = opts[:type] if opts[:type]
|
131
|
+
req['dbrps'] = opts[:dbrps] if opts[:dbrps]
|
132
|
+
req['script'] = opts[:script] if opts[:script]
|
133
|
+
req['status'] = opts[:status] if opts[:status]
|
134
|
+
req['vars'] = opts[:vars] if opts[:vars]
|
135
|
+
|
136
|
+
if opts[:type]
|
137
|
+
raise ArgumentError, "Kapacitor template type can be either 'batch' or 'stream'" unless opts[:type] == 'batch' || opts[:type] == 'stream'
|
112
138
|
end
|
113
139
|
|
114
140
|
if opts['status']
|
115
|
-
raise ArgumentError, "Kapacitor task status can be either 'enabled' or 'disabled'" unless
|
141
|
+
raise ArgumentError, "Kapacitor task status can be either 'enabled' or 'disabled'" unless opts[:status] == 'enabled' || opts[:status] == 'disabled'
|
116
142
|
end
|
117
143
|
|
118
|
-
api_patch("/tasks/#{id}", req) unless req.empty?
|
144
|
+
api_patch(endpoint: "/tasks/#{id}", data: req) unless req.empty?
|
119
145
|
end
|
120
146
|
|
121
|
-
|
122
|
-
|
147
|
+
# Delete a Kapacitor task
|
148
|
+
#
|
149
|
+
# @param id [String] Task ID
|
150
|
+
#
|
151
|
+
def delete_task(id:)
|
152
|
+
api_delete(endpoint: "/tasks/#{id}")
|
123
153
|
end
|
124
154
|
|
155
|
+
# Retrieve Kapacitor tasks
|
156
|
+
#
|
157
|
+
# @param offset [Integer] Offset count for paginating through tasks
|
158
|
+
# @param limit [Integer] Maximum number of tasks to return
|
159
|
+
# @return [Array[Hash]] List of tasks
|
160
|
+
#
|
125
161
|
def tasks(offset: 0, limit: 100)
|
126
162
|
tasks = []
|
127
163
|
|
128
164
|
loop do
|
129
|
-
res = api_get("/tasks?fields=id&offset=#{offset}&limit=#{limit}")['tasks']
|
165
|
+
res = api_get(endpoint: "/tasks?fields=id&offset=#{offset}&limit=#{limit}")['tasks']
|
130
166
|
break unless res.size > 0
|
131
167
|
|
132
168
|
res.each do |task|
|
133
|
-
tasks << api_get("/tasks/#{task['id']}")
|
169
|
+
tasks << api_get(endpoint: "/tasks/#{task['id']}")
|
134
170
|
end
|
135
171
|
|
136
172
|
offset += limit
|
@@ -139,10 +175,70 @@ module Kapacitor
|
|
139
175
|
tasks
|
140
176
|
end
|
141
177
|
|
178
|
+
# Define a topic handler
|
179
|
+
#
|
180
|
+
# @param id [String] Handler ID
|
181
|
+
# @param topic [String] Topic name
|
182
|
+
# @param actions [Array[Hash]] Handler actions
|
183
|
+
#
|
184
|
+
def define_topic_handler(id:, topic:, actions:)
|
185
|
+
req = {}
|
186
|
+
req['id'] = id
|
187
|
+
|
188
|
+
actions = [actions] unless actions.is_a?(Array)
|
189
|
+
raise ArgumentError, "Kapacitor topic handler requires one or more actions" unless actions.size > 0
|
190
|
+
|
191
|
+
actions.each do |action|
|
192
|
+
raise ArgumentError, "Missing required kind attribute for action #{action}"
|
193
|
+
end
|
194
|
+
|
195
|
+
req['actions'] = actions
|
196
|
+
api_post(endpoint: "/alerts/topics/#{topic}/handlers", data: req)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Update a topic handler
|
200
|
+
#
|
201
|
+
# @param id [String] Handler ID
|
202
|
+
# @param topic [String] Topic name
|
203
|
+
# @param actions [Array[Hash]] Handler actions
|
204
|
+
#
|
205
|
+
def update_topic_handler(id:, topic:, actions:)
|
206
|
+
req = {}
|
207
|
+
|
208
|
+
actions = [actions] unless actions.is_a?(Array)
|
209
|
+
raise ArgumentError, "Kapacitor topic handler requires one or more actions" unless actions.size > 0
|
210
|
+
|
211
|
+
req['actions'] = actions
|
212
|
+
api_put(endpoint: "/alerts/topics/#{topic}/handlers/#{id}", data: req) unless req.empty?
|
213
|
+
end
|
214
|
+
|
215
|
+
# Delete a topic handler
|
216
|
+
#
|
217
|
+
# @param id [String] Handler ID
|
218
|
+
# @param topic [String] Topic name
|
219
|
+
#
|
220
|
+
def delete_topic_handler(id:, topic:)
|
221
|
+
api_delete(endpoint: "/alerts/topics/#{topic}/handlers/#{id}")
|
222
|
+
end
|
223
|
+
|
224
|
+
# Retrieve topic's handlers
|
225
|
+
#
|
226
|
+
# @param topic [String] Topic name
|
227
|
+
# @return [Array[Hash]] List of handlers
|
228
|
+
#
|
229
|
+
def topic_handlers(topic:)
|
230
|
+
return api_get(endpoint: "/alerts/topics/#{topic}/handlers")['handlers']
|
231
|
+
end
|
232
|
+
|
142
233
|
private
|
143
|
-
|
234
|
+
# Perform a HTTP GET request
|
235
|
+
#
|
236
|
+
# @param endpoint [String] HTTP API endpoint
|
237
|
+
# @return [Array[Hash], Hash] API response
|
238
|
+
#
|
239
|
+
def api_get(endpoint:)
|
144
240
|
begin
|
145
|
-
req = Net::HTTP::Get.new(self.uri.path +
|
241
|
+
req = Net::HTTP::Get.new(self.uri.path + endpoint, {'Content-type' => 'application/json', 'Accept' => 'application/json'})
|
146
242
|
resp = self.http.request(req)
|
147
243
|
|
148
244
|
if resp.code == '200'
|
@@ -161,9 +257,14 @@ private
|
|
161
257
|
data
|
162
258
|
end
|
163
259
|
|
164
|
-
|
260
|
+
# Perform a HTTP POST request
|
261
|
+
#
|
262
|
+
# @param endpoint [String] HTTP API endpoint
|
263
|
+
# @param data [Hash] Request data
|
264
|
+
#
|
265
|
+
def api_post(endpoint:, data:)
|
165
266
|
begin
|
166
|
-
req = Net::HTTP::Post.new(self.uri.path +
|
267
|
+
req = Net::HTTP::Post.new(self.uri.path + endpoint, {'Content-Type' => 'application/json', 'Accept' => 'application/json'})
|
167
268
|
req.body = data.to_json
|
168
269
|
resp = self.http.request(req)
|
169
270
|
|
@@ -183,9 +284,13 @@ private
|
|
183
284
|
data
|
184
285
|
end
|
185
286
|
|
186
|
-
|
287
|
+
# Perform a HTTP DELETE request
|
288
|
+
#
|
289
|
+
# @param endpoint [String] HTTP API endpoint
|
290
|
+
#
|
291
|
+
def api_delete(endpoint:)
|
187
292
|
begin
|
188
|
-
req = Net::HTTP::Delete.new(self.uri.path +
|
293
|
+
req = Net::HTTP::Delete.new(self.uri.path + endpoint, {'Content-type' => 'application/json', 'Accept' => 'application/json'})
|
189
294
|
resp = self.http.request(req)
|
190
295
|
|
191
296
|
if resp.code == '204'
|
@@ -206,9 +311,14 @@ private
|
|
206
311
|
data
|
207
312
|
end
|
208
313
|
|
209
|
-
|
314
|
+
# Perform a HTTP PATCH request
|
315
|
+
#
|
316
|
+
# @param endpoint [String] HTTP API endpoint
|
317
|
+
# @param data [Hash] Request data
|
318
|
+
#
|
319
|
+
def api_patch(endpoint:, data:)
|
210
320
|
begin
|
211
|
-
req = Net::HTTP::Patch.new(self.uri.path +
|
321
|
+
req = Net::HTTP::Patch.new(self.uri.path + endpoint, {'Content-Type' => 'application/json', 'Accept' => 'application/json'})
|
212
322
|
req.body = data.to_json
|
213
323
|
resp = self.http.request(req)
|
214
324
|
|
@@ -227,5 +337,32 @@ private
|
|
227
337
|
|
228
338
|
data
|
229
339
|
end
|
340
|
+
|
341
|
+
# Perform a HTTP PUT request
|
342
|
+
#
|
343
|
+
# @param endpoint [String] HTTP API endpoint
|
344
|
+
# @param data [Hash] Request data
|
345
|
+
#
|
346
|
+
def api_put(endpoint:, data:)
|
347
|
+
begin
|
348
|
+
req = Net::HTTP::Put.new(self.uri.path + endpoint, {'Content-Type' => 'application/json', 'Accept' => 'application/json'})
|
349
|
+
req.body = data.to_json
|
350
|
+
resp = self.http.request(req)
|
351
|
+
|
352
|
+
if resp.code == '200'
|
353
|
+
begin
|
354
|
+
data = JSON.parse(resp.body)
|
355
|
+
rescue JSON::ParserError
|
356
|
+
raise Exception, "Failed to decode response message"
|
357
|
+
end
|
358
|
+
else
|
359
|
+
raise Exception, "Query returned a non successful HTTP code (Code: #{resp.code}, Error: #{resp.message})"
|
360
|
+
end
|
361
|
+
rescue
|
362
|
+
raise Exception, "Failed to execute PUT request to Kapacitor REST API (#{$!})"
|
363
|
+
end
|
364
|
+
|
365
|
+
data
|
366
|
+
end
|
230
367
|
end
|
231
368
|
end
|
data/lib/kapacitor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kapacitor-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matteo Cerutti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04
|
11
|
+
date: 2017-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|