wavefront-sdk 1.6.2 → 2.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/.rubocop.yml +6 -0
- data/HISTORY.md +39 -13
- data/README.md +75 -28
- data/Rakefile +1 -1
- data/lib/wavefront-sdk/alert.rb +113 -17
- data/lib/wavefront-sdk/cloudintegration.rb +8 -8
- data/lib/wavefront-sdk/core/api.rb +99 -0
- data/lib/wavefront-sdk/core/api_caller.rb +211 -0
- data/lib/wavefront-sdk/{exception.rb → core/exception.rb} +11 -6
- data/lib/wavefront-sdk/{logger.rb → core/logger.rb} +2 -3
- data/lib/wavefront-sdk/{response.rb → core/response.rb} +69 -52
- data/lib/wavefront-sdk/credentials.rb +6 -3
- data/lib/wavefront-sdk/dashboard.rb +14 -14
- data/lib/wavefront-sdk/{constants.rb → defs/constants.rb} +1 -0
- data/lib/wavefront-sdk/defs/version.rb +1 -0
- data/lib/wavefront-sdk/derivedmetric.rb +14 -14
- data/lib/wavefront-sdk/distribution.rb +75 -0
- data/lib/wavefront-sdk/event.rb +13 -13
- data/lib/wavefront-sdk/externallink.rb +8 -8
- data/lib/wavefront-sdk/integration.rb +9 -9
- data/lib/wavefront-sdk/maintenancewindow.rb +54 -8
- data/lib/wavefront-sdk/message.rb +4 -4
- data/lib/wavefront-sdk/metric.rb +3 -3
- data/lib/wavefront-sdk/notificant.rb +9 -9
- data/lib/wavefront-sdk/paginator/base.rb +148 -0
- data/lib/wavefront-sdk/paginator/delete.rb +11 -0
- data/lib/wavefront-sdk/paginator/get.rb +11 -0
- data/lib/wavefront-sdk/paginator/post.rb +64 -0
- data/lib/wavefront-sdk/paginator/put.rb +11 -0
- data/lib/wavefront-sdk/proxy.rb +7 -7
- data/lib/wavefront-sdk/query.rb +4 -4
- data/lib/wavefront-sdk/report.rb +9 -25
- data/lib/wavefront-sdk/savedsearch.rb +8 -8
- data/lib/wavefront-sdk/search.rb +16 -13
- data/lib/wavefront-sdk/source.rb +14 -14
- data/lib/wavefront-sdk/{mixins.rb → support/mixins.rb} +8 -2
- data/lib/wavefront-sdk/{parse_time.rb → support/parse_time.rb} +2 -0
- data/lib/wavefront-sdk/types/status.rb +52 -0
- data/lib/wavefront-sdk/user.rb +8 -8
- data/lib/wavefront-sdk/validators.rb +52 -3
- data/lib/wavefront-sdk/webhook.rb +8 -8
- data/lib/wavefront-sdk/write.rb +153 -52
- data/lib/wavefront-sdk/writers/api.rb +38 -0
- data/lib/wavefront-sdk/writers/core.rb +146 -0
- data/lib/wavefront-sdk/writers/http.rb +42 -0
- data/lib/wavefront-sdk/writers/socket.rb +66 -0
- data/lib/wavefront-sdk/writers/summary.rb +39 -0
- data/lib/wavefront_sdk.rb +9 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/wavefront-sdk/alert_spec.rb +6 -0
- data/spec/wavefront-sdk/{base_spec.rb → core/api_caller_spec.rb} +28 -41
- data/spec/wavefront-sdk/core/api_spec.rb +31 -0
- data/spec/wavefront-sdk/{logger_spec.rb → core/logger_spec.rb} +3 -3
- data/spec/wavefront-sdk/core/response_spec.rb +77 -0
- data/spec/wavefront-sdk/credentials_spec.rb +15 -10
- data/spec/wavefront-sdk/distribution_spec.rb +78 -0
- data/spec/wavefront-sdk/paginator/base_spec.rb +67 -0
- data/spec/wavefront-sdk/paginator/post_spec.rb +53 -0
- data/spec/wavefront-sdk/report_spec.rb +3 -1
- data/spec/wavefront-sdk/search_spec.rb +25 -0
- data/spec/wavefront-sdk/stdlib/array_spec.rb +2 -1
- data/spec/wavefront-sdk/stdlib/hash_spec.rb +6 -1
- data/spec/wavefront-sdk/stdlib/string_spec.rb +2 -0
- data/spec/wavefront-sdk/{mixins_spec.rb → support/mixins_spec.rb} +2 -2
- data/spec/wavefront-sdk/{parse_time_spec.rb → support/parse_time_spec.rb} +2 -2
- data/spec/wavefront-sdk/validators_spec.rb +64 -1
- data/spec/wavefront-sdk/write_spec.rb +55 -77
- data/spec/wavefront-sdk/writers/api_spec.rb +45 -0
- data/spec/wavefront-sdk/writers/core_spec.rb +49 -0
- data/spec/wavefront-sdk/writers/http_spec.rb +69 -0
- data/spec/wavefront-sdk/writers/socket_spec.rb +104 -0
- data/spec/wavefront-sdk/writers/summary_spec.rb +38 -0
- data/wavefront-sdk.gemspec +1 -1
- metadata +52 -24
- data/lib/wavefront-sdk/base.rb +0 -264
- data/lib/wavefront-sdk/base_write.rb +0 -185
- data/lib/wavefront-sdk/stdlib.rb +0 -5
- data/lib/wavefront-sdk/version.rb +0 -1
- data/spec/wavefront-sdk/base_write_spec.rb +0 -82
- data/spec/wavefront-sdk/response_spec.rb +0 -39
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'base'
|
3
|
+
|
4
|
+
module Wavefront
|
5
|
+
module Paginator
|
6
|
+
#
|
7
|
+
# We need to monkey-patch the Base class to pre-process data for
|
8
|
+
# a couple of methods.
|
9
|
+
#
|
10
|
+
class Post < Base
|
11
|
+
#
|
12
|
+
# super#setpagination requires that the args are an array, and
|
13
|
+
# that one of the args is a hash containing limit and offset
|
14
|
+
# keys.
|
15
|
+
#
|
16
|
+
def set_pagination(offset, limit, args)
|
17
|
+
super(offset, limit, body_as(Hash, args))
|
18
|
+
body_as(String, args)
|
19
|
+
end
|
20
|
+
|
21
|
+
# super#limit_and_offset requires a hash containing the limit
|
22
|
+
# and offset values. In a POST that's in the body of the
|
23
|
+
# request, which at this point has been turned into a JSON
|
24
|
+
# string. We have to temporarily turn it back into an object
|
25
|
+
# and pass it up to the superclass.
|
26
|
+
#
|
27
|
+
# The body is the second argument. We'll allow for it already
|
28
|
+
# being an object, just in case.
|
29
|
+
#
|
30
|
+
def limit_and_offset(args)
|
31
|
+
super(body_as(Hash, args))
|
32
|
+
end
|
33
|
+
|
34
|
+
# Faraday needs the body of the POST to be described as a JSON
|
35
|
+
# string, but our methods which modify the body for recursive
|
36
|
+
# calls need it as a hash. This method takes an array of args
|
37
|
+
# and ensures the body element is either a string or an
|
38
|
+
# object. If the body cannot be turned into JSON, which some
|
39
|
+
# bodies can't, return an empty array.
|
40
|
+
#
|
41
|
+
# @param desired [Class] String or Hash, what you want the
|
42
|
+
# class of the body element to be
|
43
|
+
# @param args [Array] the arguments to the Faraday call method
|
44
|
+
# @params index [Integer] the index of the body element.
|
45
|
+
# Always 1, AFAIK.
|
46
|
+
# @return [Array] of args
|
47
|
+
#
|
48
|
+
def body_as(desired, args, index = 1)
|
49
|
+
body = args[index]
|
50
|
+
|
51
|
+
return args if body.class == desired
|
52
|
+
|
53
|
+
args[index] = if body.is_a?(String)
|
54
|
+
JSON.parse(body, symbolize_names: true)
|
55
|
+
else
|
56
|
+
body.to_json
|
57
|
+
end
|
58
|
+
args
|
59
|
+
rescue JSON::ParserError
|
60
|
+
[]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/wavefront-sdk/proxy.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'core/api'
|
2
2
|
|
3
3
|
module Wavefront
|
4
4
|
#
|
5
5
|
# Manage and query Wavefront proxies.
|
6
6
|
#
|
7
|
-
class Proxy <
|
7
|
+
class Proxy < CoreApi
|
8
8
|
# GET /api/v2/proxy
|
9
9
|
# Get all proxies for a customer
|
10
10
|
#
|
@@ -12,7 +12,7 @@ module Wavefront
|
|
12
12
|
# @param limit [Int] the number of proxies to return
|
13
13
|
#
|
14
14
|
def list(offset = 0, limit = 100)
|
15
|
-
|
15
|
+
api.get('', offset: offset, limit: limit)
|
16
16
|
end
|
17
17
|
|
18
18
|
# DELETE /api/v2/proxy/id
|
@@ -27,7 +27,7 @@ module Wavefront
|
|
27
27
|
#
|
28
28
|
def delete(id)
|
29
29
|
wf_proxy_id?(id)
|
30
|
-
|
30
|
+
api.delete(id)
|
31
31
|
end
|
32
32
|
|
33
33
|
# GET /api/v2/proxy/id
|
@@ -38,7 +38,7 @@ module Wavefront
|
|
38
38
|
#
|
39
39
|
def describe(id)
|
40
40
|
wf_proxy_id?(id)
|
41
|
-
|
41
|
+
api.get(id)
|
42
42
|
end
|
43
43
|
|
44
44
|
# POST /api/v2/proxy/id/undelete
|
@@ -51,7 +51,7 @@ module Wavefront
|
|
51
51
|
#
|
52
52
|
def undelete(id)
|
53
53
|
wf_proxy_id?(id)
|
54
|
-
|
54
|
+
api.post([id, 'undelete'].uri_concat)
|
55
55
|
end
|
56
56
|
|
57
57
|
# PUT /api/v2/proxy/id
|
@@ -82,7 +82,7 @@ module Wavefront
|
|
82
82
|
#
|
83
83
|
def update(id, payload)
|
84
84
|
wf_proxy_id?(id)
|
85
|
-
|
85
|
+
api.put(id, payload)
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
data/lib/wavefront-sdk/query.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'core/api'
|
2
2
|
|
3
3
|
module Wavefront
|
4
4
|
#
|
5
5
|
# Query Wavefront metrics.
|
6
6
|
#
|
7
|
-
class Query <
|
7
|
+
class Query < CoreApi
|
8
8
|
def api_base
|
9
9
|
'chart'
|
10
10
|
end
|
@@ -41,7 +41,7 @@ module Wavefront
|
|
41
41
|
options[:e] = parse_time(t_end, true) if t_end
|
42
42
|
|
43
43
|
options.delete_if { |k, v| v == false && k != :i }
|
44
|
-
|
44
|
+
api.get('api', options)
|
45
45
|
end
|
46
46
|
|
47
47
|
# GET /api/v2/chart/raw
|
@@ -70,7 +70,7 @@ module Wavefront
|
|
70
70
|
options[:startTime] = parse_time(t_start, true) if t_start
|
71
71
|
options[:endTime] = parse_time(t_end, true) if t_end
|
72
72
|
|
73
|
-
|
73
|
+
api.get('raw', options)
|
74
74
|
end
|
75
75
|
|
76
76
|
# Fake a response which looks like we get from all the other
|
data/lib/wavefront-sdk/report.rb
CHANGED
@@ -1,32 +1,16 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'write'
|
2
2
|
|
3
3
|
module Wavefront
|
4
4
|
#
|
5
|
-
# This class
|
5
|
+
# This class is now a shim around Wavefront::Write, which forces
|
6
|
+
# the use of the Wavefront::Writer::Api writer. It is probably
|
7
|
+
# better to use Wavefront::Write directly. This class has been
|
8
|
+
# left in for backward-compatability.
|
6
9
|
#
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def api_path
|
12
|
-
'/report'
|
13
|
-
end
|
14
|
-
|
15
|
-
def write(points = [], _openclose = true, prefix = nil)
|
16
|
-
_write_loop(prepped_points(points, prefix))
|
17
|
-
end
|
18
|
-
|
19
|
-
def really_send_point(point)
|
20
|
-
api_post('/?f=graphite_v2', point, 'application/octet-stream')
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
# Because API calls are expensive (compared to hitting a local
|
26
|
-
# proxy) we will bundle up points into a single call.
|
27
|
-
#
|
28
|
-
def _write_loop(points)
|
29
|
-
send_point(points.map { |p| hash_to_wf(p) }.join("\n"))
|
10
|
+
class Report < Write
|
11
|
+
def initialize(creds = {}, opts = {})
|
12
|
+
opts[:writer] = :api
|
13
|
+
super(creds, opts)
|
30
14
|
end
|
31
15
|
end
|
32
16
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'core/api'
|
2
2
|
|
3
3
|
module Wavefront
|
4
4
|
#
|
5
5
|
# View and manage Cloud Integrations. These are identified by
|
6
6
|
# a UUID.
|
7
7
|
#
|
8
|
-
class SavedSearch <
|
8
|
+
class SavedSearch < CoreApi
|
9
9
|
# GET /api/v2/savedsearch
|
10
10
|
# Get all saved searches for a user.
|
11
11
|
#
|
@@ -14,7 +14,7 @@ module Wavefront
|
|
14
14
|
# @return [Wavefront::Response]
|
15
15
|
#
|
16
16
|
def list(offset = 0, limit = 100)
|
17
|
-
|
17
|
+
api.get('', offset: offset, limit: limit)
|
18
18
|
end
|
19
19
|
|
20
20
|
# POST /api/v2/savedsearch
|
@@ -26,7 +26,7 @@ module Wavefront
|
|
26
26
|
#
|
27
27
|
def create(body)
|
28
28
|
raise ArgumentError unless body.is_a?(Hash)
|
29
|
-
|
29
|
+
api.post('', body, 'application/json')
|
30
30
|
end
|
31
31
|
|
32
32
|
# DELETE /api/v2/savedsearch/id
|
@@ -37,7 +37,7 @@ module Wavefront
|
|
37
37
|
#
|
38
38
|
def delete(id)
|
39
39
|
wf_savedsearch_id?(id)
|
40
|
-
|
40
|
+
api.delete(id)
|
41
41
|
end
|
42
42
|
|
43
43
|
# GET /api/v2/savedsearch/id
|
@@ -48,7 +48,7 @@ module Wavefront
|
|
48
48
|
#
|
49
49
|
def describe(id)
|
50
50
|
wf_savedsearch_id?(id)
|
51
|
-
|
51
|
+
api.get(id)
|
52
52
|
end
|
53
53
|
|
54
54
|
# PUT /api/v2/savedsearch/id
|
@@ -60,7 +60,7 @@ module Wavefront
|
|
60
60
|
def update(id, body)
|
61
61
|
wf_savedsearch_id?(id)
|
62
62
|
raise ArgumentError unless body.is_a?(Hash)
|
63
|
-
|
63
|
+
api.put(id, body)
|
64
64
|
end
|
65
65
|
|
66
66
|
# GET /api/v2/savedsearch/type/entitytype
|
@@ -73,7 +73,7 @@ module Wavefront
|
|
73
73
|
#
|
74
74
|
def entity(entitytype, offset = 0, limit = 100)
|
75
75
|
wf_savedsearch_entity?(entitytype)
|
76
|
-
|
76
|
+
api.get(['type', entitytype].uri_concat, offset: offset,
|
77
77
|
limit: limit)
|
78
78
|
end
|
79
79
|
end
|
data/lib/wavefront-sdk/search.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'core/api'
|
2
2
|
|
3
3
|
module Wavefront
|
4
4
|
#
|
@@ -7,7 +7,7 @@ module Wavefront
|
|
7
7
|
# this class covers the whole API with two methods, but leaves a
|
8
8
|
# lot up to the user. It may grow, with convenience methods.
|
9
9
|
#
|
10
|
-
class Search <
|
10
|
+
class Search < CoreApi
|
11
11
|
# POST /api/v2/search/entity
|
12
12
|
# POST /api/v2/search/entity/deleted
|
13
13
|
# Run a search query. This single method maps to many API paths.
|
@@ -45,15 +45,18 @@ module Wavefront
|
|
45
45
|
# Build a query body
|
46
46
|
#
|
47
47
|
def body(query, options)
|
48
|
-
ret = {
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
ret = { limit: options[:limit] || 10,
|
49
|
+
offset: options[:offset] || 0 }
|
50
|
+
|
51
|
+
if query && !query.empty?
|
52
|
+
ret[:query] = [query].flatten.map do |q|
|
53
|
+
q.tap { |iq| iq[:matchingMethod] ||= 'CONTAINS' }
|
54
|
+
end
|
55
|
+
|
56
|
+
ret[:sort] = { field: [query].flatten.first[:key],
|
57
|
+
ascending: !options[:desc] || true }
|
58
|
+
end
|
55
59
|
|
56
|
-
ret[:query].map { |q| q[:matchingMethod] ||= 'CONTAINS' }
|
57
60
|
ret
|
58
61
|
end
|
59
62
|
|
@@ -78,7 +81,7 @@ module Wavefront
|
|
78
81
|
|
79
82
|
path = [entity]
|
80
83
|
path.<< 'deleted' if deleted
|
81
|
-
|
84
|
+
api.post(path, body, 'application/json')
|
82
85
|
end
|
83
86
|
|
84
87
|
# @param entity [String] the type of Wavefront object you wish
|
@@ -98,8 +101,8 @@ module Wavefront
|
|
98
101
|
|
99
102
|
path = [entity]
|
100
103
|
path.<< 'deleted' if deleted
|
101
|
-
path.<< facet
|
102
|
-
|
104
|
+
path.<< facet || 'facets'
|
105
|
+
api.post(path, body, 'application/json')
|
103
106
|
end
|
104
107
|
end
|
105
108
|
end
|
data/lib/wavefront-sdk/source.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'core/api'
|
2
2
|
|
3
3
|
module Wavefront
|
4
4
|
#
|
5
5
|
# View and manage source metadata.
|
6
6
|
#
|
7
|
-
class Source <
|
7
|
+
class Source < CoreApi
|
8
8
|
def update_keys
|
9
9
|
%i[sourceName tags description]
|
10
10
|
end
|
@@ -21,7 +21,7 @@ module Wavefront
|
|
21
21
|
qs[:limit] = limit if limit
|
22
22
|
qs[:cursor] = cursor if cursor
|
23
23
|
|
24
|
-
|
24
|
+
api.get('', qs)
|
25
25
|
end
|
26
26
|
|
27
27
|
# POST /api/v2/source
|
@@ -34,7 +34,7 @@ module Wavefront
|
|
34
34
|
#
|
35
35
|
def create(body)
|
36
36
|
raise ArgumentError unless body.is_a?(Hash)
|
37
|
-
|
37
|
+
api.post('', body, 'application/json')
|
38
38
|
end
|
39
39
|
|
40
40
|
# DELETE /api/v2/source/id
|
@@ -45,7 +45,7 @@ module Wavefront
|
|
45
45
|
#
|
46
46
|
def delete(id)
|
47
47
|
wf_source_id?(id)
|
48
|
-
|
48
|
+
api.delete(id)
|
49
49
|
end
|
50
50
|
|
51
51
|
# POST /api/v2/source/id/description
|
@@ -53,7 +53,7 @@ module Wavefront
|
|
53
53
|
|
54
54
|
def description_set(id, description)
|
55
55
|
wf_source_id?(id)
|
56
|
-
|
56
|
+
api.post([id, 'description'].uri_concat, description,
|
57
57
|
'application/json')
|
58
58
|
end
|
59
59
|
|
@@ -62,7 +62,7 @@ module Wavefront
|
|
62
62
|
|
63
63
|
def description_delete(id)
|
64
64
|
wf_source_id?(id)
|
65
|
-
|
65
|
+
api.delete([id, 'description'].uri_concat)
|
66
66
|
end
|
67
67
|
|
68
68
|
# GET /api/v2/source/id
|
@@ -76,7 +76,7 @@ module Wavefront
|
|
76
76
|
wf_version?(version) if version
|
77
77
|
fragments = [id]
|
78
78
|
fragments += ['history', version] if version
|
79
|
-
|
79
|
+
api.get(fragments.uri_concat)
|
80
80
|
end
|
81
81
|
|
82
82
|
# PUT /api/v2/source/id
|
@@ -94,9 +94,9 @@ module Wavefront
|
|
94
94
|
wf_source_id?(id)
|
95
95
|
raise ArgumentError unless body.is_a?(Hash)
|
96
96
|
|
97
|
-
return
|
97
|
+
return api.put(id, body, 'application/json') unless modify
|
98
98
|
|
99
|
-
|
99
|
+
api.put(id, hash_for_update(describe(id).response, body),
|
100
100
|
'application/json')
|
101
101
|
end
|
102
102
|
|
@@ -108,7 +108,7 @@ module Wavefront
|
|
108
108
|
#
|
109
109
|
def tags(id)
|
110
110
|
wf_source_id?(id)
|
111
|
-
|
111
|
+
api.get([id, 'tag'].uri_concat)
|
112
112
|
end
|
113
113
|
|
114
114
|
# POST /api/v2/source/id/tag
|
@@ -122,7 +122,7 @@ module Wavefront
|
|
122
122
|
wf_source_id?(id)
|
123
123
|
tags = Array(tags)
|
124
124
|
tags.each { |t| wf_string?(t) }
|
125
|
-
|
125
|
+
api.post([id, 'tag'].uri_concat, tags.to_json, 'application/json')
|
126
126
|
end
|
127
127
|
|
128
128
|
# DELETE /api/v2/source/id/tag/tagValue
|
@@ -135,7 +135,7 @@ module Wavefront
|
|
135
135
|
def tag_delete(id, tag)
|
136
136
|
wf_source_id?(id)
|
137
137
|
wf_string?(tag)
|
138
|
-
|
138
|
+
api.delete([id, 'tag', tag].uri_concat)
|
139
139
|
end
|
140
140
|
|
141
141
|
# PUT /api/v2/source/id/tag/tagValue
|
@@ -148,7 +148,7 @@ module Wavefront
|
|
148
148
|
def tag_add(id, tag)
|
149
149
|
wf_source_id?(id)
|
150
150
|
wf_string?(tag)
|
151
|
-
|
151
|
+
api.put([id, 'tag', tag].uri_concat)
|
152
152
|
end
|
153
153
|
end
|
154
154
|
end
|