wavefront-sdk 5.4.1 → 6.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/.codeclimate.yml +1 -1
- data/.github/workflows/release.yml +37 -0
- data/.github/workflows/test.yml +23 -0
- data/.rubocop.yml +8 -6
- data/HISTORY.md +26 -0
- data/README.md +5 -5
- data/lib/wavefront-sdk/api_mixins/acl.rb +1 -1
- data/lib/wavefront-sdk/core/api.rb +1 -1
- data/lib/wavefront-sdk/core/api_caller.rb +2 -2
- data/lib/wavefront-sdk/core/exception.rb +58 -0
- data/lib/wavefront-sdk/credentials.rb +8 -8
- data/lib/wavefront-sdk/defs/version.rb +1 -1
- data/lib/wavefront-sdk/event.rb +70 -3
- data/lib/wavefront-sdk/metricspolicy.rb +57 -0
- data/lib/wavefront-sdk/query.rb +2 -0
- data/lib/wavefront-sdk/search.rb +2 -0
- data/lib/wavefront-sdk/spy.rb +22 -0
- data/lib/wavefront-sdk/support/parse_time.rb +1 -1
- data/lib/wavefront-sdk/user.rb +1 -1
- data/lib/wavefront-sdk/validators.rb +17 -2
- data/lib/wavefront-sdk/write.rb +3 -3
- data/lib/wavefront-sdk/writers/api.rb +2 -2
- data/lib/wavefront-sdk/writers/core.rb +1 -1
- data/lib/wavefront-sdk/writers/http.rb +2 -2
- data/lib/wavefront-sdk/writers/proxy.rb +71 -0
- data/lib/wavefront-sdk/writers/socket.rb +15 -27
- data/spec/.rubocop.yml +3 -15
- data/spec/constants.rb +2 -2
- data/spec/support/mocket.rb +3 -1
- data/spec/test_mixins/general.rb +1 -1
- data/spec/wavefront-sdk/core/response_spec.rb +2 -2
- data/spec/wavefront-sdk/event_spec.rb +46 -0
- data/spec/wavefront-sdk/metric_helper_spec.rb +6 -4
- data/spec/wavefront-sdk/metricspolicy_spec.rb +94 -0
- data/spec/wavefront-sdk/spy_spec.rb +27 -0
- data/spec/wavefront-sdk/validators_spec.rb +11 -1
- data/spec/wavefront-sdk/write_spec.rb +1 -1
- data/spec/wavefront-sdk/writers/api_spec.rb +4 -0
- data/spec/wavefront-sdk/writers/core_spec.rb +1 -3
- data/spec/wavefront-sdk/writers/http_spec.rb +24 -21
- data/spec/wavefront-sdk/writers/proxy_spec.rb +129 -0
- data/spec/wavefront-sdk/writers/socket_spec.rb +49 -27
- data/wavefront-sdk.gemspec +5 -3
- metadata +58 -11
- data/.github/workflows/ruby.yml +0 -32
- data/.travis.yml +0 -21
- data/lib/wavefront-sdk/writers/unix.rb +0 -59
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'core/api'
|
4
|
+
|
5
|
+
module Wavefront
|
6
|
+
#
|
7
|
+
# Manage and query Wavefront metrics policies
|
8
|
+
#
|
9
|
+
class MetricsPolicy < CoreApi
|
10
|
+
# GET /api/v2/metricspolicy
|
11
|
+
# Get the metrics policy
|
12
|
+
# GET /api/v2/metricspolicy/history/{version}
|
13
|
+
# Get a specific historical version of a metrics policy
|
14
|
+
# @param version [Integer] specify version to describe
|
15
|
+
# @return [Wavefront::Response]
|
16
|
+
#
|
17
|
+
def describe(version = nil)
|
18
|
+
if version
|
19
|
+
wf_version?(version)
|
20
|
+
api.get(['history', version].uri_concat)
|
21
|
+
else
|
22
|
+
api.get('')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# GET /api/v2/metricspolicy/history
|
27
|
+
# Get the version history of metrics policy
|
28
|
+
#
|
29
|
+
# @param offset [Integer] version at which the list begins
|
30
|
+
# @param limit [Integer] the number of versions to return
|
31
|
+
#
|
32
|
+
def history(offset = 0, limit = 100)
|
33
|
+
api.get('', offset: offset, limit: limit)
|
34
|
+
end
|
35
|
+
|
36
|
+
# POST /api/v2/metricspolicy/revert/{version}
|
37
|
+
# Revert to a specific historical version of a metrics policy
|
38
|
+
# @param version [Integer] specify version to describe
|
39
|
+
# @return [Wavefront::Response]
|
40
|
+
#
|
41
|
+
def revert(version)
|
42
|
+
wf_version?(version)
|
43
|
+
api.post(['revert', version].uri_concat)
|
44
|
+
end
|
45
|
+
|
46
|
+
# PUT /api/v2/metricspolicy
|
47
|
+
# Update the metrics policy
|
48
|
+
# @param body [Hash] hash describing metrics policy
|
49
|
+
# @return [Wavefront::Response]
|
50
|
+
#
|
51
|
+
def update(body)
|
52
|
+
raise ArgumentError unless body.is_a?(Hash)
|
53
|
+
|
54
|
+
api.put('', body, 'application/json')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/wavefront-sdk/query.rb
CHANGED
@@ -30,6 +30,7 @@ module Wavefront
|
|
30
30
|
# @raise [ArgumentError] if query is not a string
|
31
31
|
# @return [Wavefront::Response]
|
32
32
|
#
|
33
|
+
# rubocop:disable Metrics/ParameterLists
|
33
34
|
def query(query, granularity = nil, t_start = nil, t_end = nil,
|
34
35
|
options = {})
|
35
36
|
|
@@ -45,6 +46,7 @@ module Wavefront
|
|
45
46
|
|
46
47
|
api.get('api', options)
|
47
48
|
end
|
49
|
+
# rubocop:enable Metrics/ParameterLists
|
48
50
|
|
49
51
|
# GET /api/v2/chart/raw
|
50
52
|
# Perform a raw data query against Wavefront servers that
|
data/lib/wavefront-sdk/search.rb
CHANGED
@@ -113,6 +113,7 @@ module Wavefront
|
|
113
113
|
# specified in the body. See the Swagger docs for more
|
114
114
|
# information.
|
115
115
|
#
|
116
|
+
# rubocop:disable Metrics/ParameterLists
|
116
117
|
def raw_facet_search(entity = nil, body = nil, deleted = false,
|
117
118
|
facet = false)
|
118
119
|
raise ArgumentError unless entity.is_a?(String) && body.is_a?(Hash)
|
@@ -122,5 +123,6 @@ module Wavefront
|
|
122
123
|
path.<< facet || 'facets'
|
123
124
|
api.post(path, body, 'application/json')
|
124
125
|
end
|
126
|
+
# rubocop:enable Metrics/ParameterLists
|
125
127
|
end
|
126
128
|
end
|
data/lib/wavefront-sdk/spy.rb
CHANGED
@@ -32,6 +32,21 @@ module Wavefront
|
|
32
32
|
api.get_stream('points', points_filter(sampling, filters), options)
|
33
33
|
end
|
34
34
|
|
35
|
+
# GET /api/spy/deltas
|
36
|
+
# Gets new deltas that are added to existing time series.
|
37
|
+
# @param sampling [Float] see #points
|
38
|
+
# @param filter [Hash] see #points
|
39
|
+
# @param options [Hash] see #points
|
40
|
+
# @raise Wavefront::Exception::InvalidSamplingValue
|
41
|
+
# @return [Nil]
|
42
|
+
#
|
43
|
+
def deltas(sampling = 0.01, filters = {}, options = {})
|
44
|
+
wf_sampling_value?(sampling)
|
45
|
+
api.get_stream('deltas',
|
46
|
+
deltas_filter(sampling, filters),
|
47
|
+
options)
|
48
|
+
end
|
49
|
+
|
35
50
|
# GET /api/spy/histograms
|
36
51
|
# Gets new histograms that are added to existing time series.
|
37
52
|
# @param sampling [Float] see #points
|
@@ -103,6 +118,13 @@ module Wavefront
|
|
103
118
|
pointTagKey: filters.fetch(:tag_key, nil) }.compact
|
104
119
|
end
|
105
120
|
|
121
|
+
def deltas_filter(sampling, filters)
|
122
|
+
{ counter: filters.fetch(:prefix, nil),
|
123
|
+
host: filters.fetch(:host, nil),
|
124
|
+
sampling: sampling,
|
125
|
+
counterTagKey: filters.fetch(:tag_key, nil) }.compact
|
126
|
+
end
|
127
|
+
|
106
128
|
def histograms_filter(sampling, filters)
|
107
129
|
{ histogram: filters.fetch(:prefix, nil),
|
108
130
|
host: filters.fetch(:host, nil),
|
data/lib/wavefront-sdk/user.rb
CHANGED
@@ -19,7 +19,7 @@ module Wavefront
|
|
19
19
|
|
20
20
|
def deprecation_warning
|
21
21
|
logger.log('Wavefront::User is deprecated and will be removed from the ' \
|
22
|
-
|
22
|
+
'next major release. Please use Wavefront::Account.', :warn)
|
23
23
|
end
|
24
24
|
|
25
25
|
def post_initialize(_creds, _opts)
|
@@ -48,8 +48,8 @@ module Wavefront
|
|
48
48
|
#
|
49
49
|
def wf_metric_name?(metric)
|
50
50
|
if metric.is_a?(String) && metric.size < 1024 &&
|
51
|
-
(metric.match(/^#{DELTA}?[\w\-.]+$/) ||
|
52
|
-
metric.match(%r{^"#{DELTA}?[\w\-./,]+"$}))
|
51
|
+
(metric.match(/^#{DELTA}?[\w\-.]+$/o) ||
|
52
|
+
metric.match(%r{^"#{DELTA}?[\w\-./,]+"$}o))
|
53
53
|
return true
|
54
54
|
end
|
55
55
|
|
@@ -467,6 +467,9 @@ module Wavefront
|
|
467
467
|
true
|
468
468
|
end
|
469
469
|
|
470
|
+
# @
|
471
|
+
def wf_trace?(trace); end
|
472
|
+
|
470
473
|
# Validate an array of distribution values
|
471
474
|
# @param vals [Array[Array]] [count, value]
|
472
475
|
# @return true if valid
|
@@ -639,6 +642,18 @@ module Wavefront
|
|
639
642
|
|
640
643
|
raise Wavefront::Exception::InvalidAwsExternalId, id
|
641
644
|
end
|
645
|
+
|
646
|
+
# Ensure the given argument is a valid Wavefront metrics policy ID
|
647
|
+
# @param id [String] the metrics policy ID to validate
|
648
|
+
# @return true if the role ID is valid
|
649
|
+
# @raise Wavefront::Exception::InvalidMetricsPolicyId if the ID is
|
650
|
+
# not valid
|
651
|
+
#
|
652
|
+
def wf_metricspolicy_id?(id)
|
653
|
+
return true if uuid?(id)
|
654
|
+
|
655
|
+
raise Wavefront::Exception::InvalidMetricsPolicyId, id
|
656
|
+
end
|
642
657
|
end
|
643
658
|
# rubocop:enable Metrics/ModuleLength
|
644
659
|
end
|
data/lib/wavefront-sdk/write.rb
CHANGED
@@ -39,7 +39,7 @@ module Wavefront
|
|
39
39
|
# verbose [Bool]
|
40
40
|
# debug [Bool]
|
41
41
|
# writer [Symbol, String] the name of the writer class to use.
|
42
|
-
# Defaults to :
|
42
|
+
# Defaults to :proxy
|
43
43
|
# noauto [Bool] if this is false, #write will automatically
|
44
44
|
# open a connection to Wavefront on each invocation. Set
|
45
45
|
# this to true to manually manage the connection.
|
@@ -62,7 +62,7 @@ module Wavefront
|
|
62
62
|
#
|
63
63
|
def defaults
|
64
64
|
{ tags: nil,
|
65
|
-
writer: :
|
65
|
+
writer: :proxy,
|
66
66
|
noop: false,
|
67
67
|
novalidate: false,
|
68
68
|
noauto: false,
|
@@ -118,7 +118,7 @@ module Wavefront
|
|
118
118
|
summary = { sent: 0, rejected: 0, unsent: 0 }
|
119
119
|
|
120
120
|
%i[sent rejected unsent].each do |k|
|
121
|
-
summary[k] = responses.
|
121
|
+
summary[k] = responses.sum { |r| r.response[k] }
|
122
122
|
end
|
123
123
|
|
124
124
|
Wavefront::Response.new(
|
@@ -19,12 +19,12 @@ module Wavefront
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def validate_credentials(creds)
|
22
|
-
unless creds.key?(:endpoint)
|
22
|
+
unless creds.key?(:endpoint) && creds[:endpoint]
|
23
23
|
raise(Wavefront::Exception::CredentialError,
|
24
24
|
'credentials must contain API endpoint')
|
25
25
|
end
|
26
26
|
|
27
|
-
return true if creds.key?(:token)
|
27
|
+
return true if creds.key?(:token) && creds[:token]
|
28
28
|
|
29
29
|
raise(Wavefront::Exception::CredentialError,
|
30
30
|
'credentials must contain API token')
|
@@ -29,10 +29,10 @@ module Wavefront
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def validate_credentials(creds)
|
32
|
-
return true if creds.key?(:proxy)
|
32
|
+
return true if creds.key?(:proxy) && creds[:proxy]
|
33
33
|
|
34
34
|
raise(Wavefront::Exception::CredentialError,
|
35
|
-
'credentials must contain proxy')
|
35
|
+
'credentials must contain proxy address')
|
36
36
|
end
|
37
37
|
|
38
38
|
def chunk_size
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'core'
|
4
|
+
|
5
|
+
module Wavefront
|
6
|
+
module Writer
|
7
|
+
#
|
8
|
+
# Everything specific to writing points to a Wavefront proxy, in
|
9
|
+
# native Wavefront format, to a socket. (The original and,
|
10
|
+
# once, only way to send points.)
|
11
|
+
#
|
12
|
+
class Proxy < Core
|
13
|
+
# Open a connection to a socket to a Wavefront proxy, putting the
|
14
|
+
# descriptor in instance variable @conn.
|
15
|
+
# @return [TCPSocket]
|
16
|
+
#
|
17
|
+
def open
|
18
|
+
if opts[:noop]
|
19
|
+
logger.log('No-op requested. Not opening connection to proxy.')
|
20
|
+
return true
|
21
|
+
end
|
22
|
+
|
23
|
+
port = creds[:port] || default_port
|
24
|
+
logger.log("Connecting to #{creds[:proxy]}:#{port}.", :debug)
|
25
|
+
open_socket(creds[:proxy], port)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Close the connection described by the @conn instance variable.
|
29
|
+
#
|
30
|
+
def close
|
31
|
+
return if opts[:noop]
|
32
|
+
|
33
|
+
logger.log('Closing connection to proxy.', :debug)
|
34
|
+
conn.close
|
35
|
+
end
|
36
|
+
|
37
|
+
def validate_credentials(creds)
|
38
|
+
return true if creds.key?(:proxy) && creds[:proxy]
|
39
|
+
|
40
|
+
raise(Wavefront::Exception::CredentialError,
|
41
|
+
'credentials must contain proxy address')
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def open_socket(proxy, port)
|
47
|
+
@conn = TCPSocket.new(proxy, port)
|
48
|
+
rescue StandardError => e
|
49
|
+
logger.log(e, :error)
|
50
|
+
raise Wavefront::Exception::InvalidEndpoint
|
51
|
+
end
|
52
|
+
|
53
|
+
# @param point [String] point or points in native Wavefront format.
|
54
|
+
# @raise [SocketError] if point cannot be written
|
55
|
+
#
|
56
|
+
def _send_point(point)
|
57
|
+
return if opts[:noop]
|
58
|
+
|
59
|
+
conn.puts(point)
|
60
|
+
rescue StandardError
|
61
|
+
raise Wavefront::Exception::SocketError
|
62
|
+
end
|
63
|
+
|
64
|
+
# return [Integer] the port to connect to, if none is supplied
|
65
|
+
#
|
66
|
+
def default_port
|
67
|
+
2878
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,70 +1,58 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'socket'
|
3
4
|
require_relative 'core'
|
4
5
|
|
5
6
|
module Wavefront
|
6
7
|
module Writer
|
7
8
|
#
|
8
|
-
# Everything specific to writing points to a
|
9
|
-
# native Wavefront format, to a socket. (The original and,
|
10
|
-
# once, only way to send points.)
|
9
|
+
# Everything specific to writing points to a Unix datagram socket.
|
11
10
|
#
|
12
11
|
class Socket < Core
|
13
|
-
#
|
14
|
-
# in instance variable @conn.
|
15
|
-
#
|
12
|
+
# Make a connection to a Unix datagram socket, putting the
|
13
|
+
# descriptor in instance variable @conn.
|
14
|
+
# This requires the name of the socket file in creds[:socket]
|
15
|
+
# @return [UnixSocket]
|
16
16
|
#
|
17
17
|
def open
|
18
18
|
if opts[:noop]
|
19
|
-
logger.log('No-op requested. Not opening connection
|
19
|
+
logger.log('No-op requested. Not opening socket connection.')
|
20
20
|
return true
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
open_socket(creds[:proxy], port)
|
23
|
+
logger.log("Connecting to #{creds[:socket]}.", :debug)
|
24
|
+
open_socket(creds[:socket])
|
26
25
|
end
|
27
26
|
|
28
|
-
# Close the connection described by the @conn instance variable.
|
29
|
-
#
|
30
27
|
def close
|
31
28
|
return if opts[:noop]
|
32
29
|
|
33
|
-
logger.log('Closing connection
|
30
|
+
logger.log('Closing socket connection.', :debug)
|
34
31
|
conn.close
|
35
32
|
end
|
36
33
|
|
37
34
|
def validate_credentials(creds)
|
38
|
-
return true if creds.key?(:
|
35
|
+
return true if creds.key?(:socket) && creds[:socket]
|
39
36
|
|
40
37
|
raise(Wavefront::Exception::CredentialError,
|
41
|
-
'
|
38
|
+
'credentials must contain socket file path')
|
42
39
|
end
|
43
40
|
|
44
41
|
private
|
45
42
|
|
46
|
-
def open_socket(
|
47
|
-
@conn =
|
43
|
+
def open_socket(socket)
|
44
|
+
@conn = UNIXSocket.new(socket)
|
48
45
|
rescue StandardError => e
|
49
46
|
logger.log(e, :error)
|
50
47
|
raise Wavefront::Exception::InvalidEndpoint
|
51
48
|
end
|
52
49
|
|
53
50
|
# @param point [String] point or points in native Wavefront format.
|
54
|
-
# @raise [SocketError] if point cannot be written
|
55
51
|
#
|
56
52
|
def _send_point(point)
|
57
53
|
return if opts[:noop]
|
58
54
|
|
59
|
-
conn.
|
60
|
-
rescue StandardError
|
61
|
-
raise Wavefront::Exception::SocketError
|
62
|
-
end
|
63
|
-
|
64
|
-
# return [Integer] the port to connect to, if none is supplied
|
65
|
-
#
|
66
|
-
def default_port
|
67
|
-
2878
|
55
|
+
conn.write(point)
|
68
56
|
end
|
69
57
|
end
|
70
58
|
end
|
data/spec/.rubocop.yml
CHANGED
@@ -1,23 +1,11 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
inherit_from:
|
2
|
+
- ../.rubocop.yml
|
3
3
|
|
4
4
|
Metrics/AbcSize:
|
5
5
|
Max: 64
|
6
|
-
|
7
|
-
# Configuration parameters: CountComments.
|
8
6
|
Metrics/ClassLength:
|
9
7
|
Max: 400
|
10
|
-
|
11
|
-
# Configuration parameters: CountComments, ExcludedMethods.
|
12
8
|
Metrics/MethodLength:
|
13
9
|
Max: 39
|
14
|
-
|
15
|
-
# Is nothing sacred?
|
16
|
-
Layout/LineLength:
|
17
|
-
Max: 80
|
18
|
-
|
19
|
-
Style/StringConcatenation:
|
20
|
-
Enabled: false
|
21
|
-
|
22
|
-
Style/OptionalBooleanParameter:
|
10
|
+
Naming/VariableNumber:
|
23
11
|
Enabled: false
|
data/spec/constants.rb
CHANGED
@@ -26,7 +26,7 @@ U_ACL_1 = 'someone@example.com'
|
|
26
26
|
U_ACL_2 = 'other@elsewhere.com'
|
27
27
|
GRP_ACL = 'f8dc0c14-91a0-4ca9-8a2a-7d47f4db4672'
|
28
28
|
|
29
|
-
DEFAULT_HEADERS = {
|
29
|
+
DEFAULT_HEADERS = { Accept: /.*/,
|
30
30
|
'Accept-Encoding': /.*/,
|
31
|
-
|
31
|
+
Authorization: 'Bearer 0123456789-ABCDEF',
|
32
32
|
'User-Agent': /wavefront-sdk \d+\.\d+\.\d+/ }.freeze
|