wavefront-sdk 1.6.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'date'
|
2
|
-
require_relative 'exception'
|
3
2
|
require_relative 'parse_time'
|
4
|
-
require_relative '
|
3
|
+
require_relative '../core/exception'
|
4
|
+
require_relative '../stdlib/string'
|
5
|
+
require_relative '../stdlib/array'
|
6
|
+
require_relative '../stdlib/hash'
|
5
7
|
|
6
8
|
module Wavefront
|
7
9
|
#
|
@@ -85,5 +87,9 @@ module Wavefront
|
|
85
87
|
return u[suffix.to_sym] if u.key?(suffix.to_sym)
|
86
88
|
raise Wavefront::Exception::InvalidTimeUnit
|
87
89
|
end
|
90
|
+
|
91
|
+
def log(message, severity = :info)
|
92
|
+
logger.log(message, severity)
|
93
|
+
end
|
88
94
|
end
|
89
95
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Wavefront
|
2
|
+
#
|
3
|
+
# Status types are used by the Wavefront::Response class. They
|
4
|
+
# represent the success or failure of an API call.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
module Type
|
8
|
+
#
|
9
|
+
# An object which provides information about whether the request
|
10
|
+
# was successful or not. Ordinarily this is easy to construct
|
11
|
+
# from the API's JSON response, but some classes, for instance
|
12
|
+
# Wavefront::Write fake it by constructing their own.
|
13
|
+
#
|
14
|
+
# @!attribute [r] result
|
15
|
+
# @return [OK, ERROR] a string telling us how the request went
|
16
|
+
# @!attribute [r] message
|
17
|
+
# @return [String] Any informational message from the API
|
18
|
+
# @!attribute [r] code
|
19
|
+
# @return [Integer] the HTTP response code from the API
|
20
|
+
# request
|
21
|
+
#
|
22
|
+
class Status
|
23
|
+
attr_reader :obj, :status
|
24
|
+
|
25
|
+
# @param response [Hash] the API response, turned into a hash
|
26
|
+
# @param status [Integer] HTTP status code
|
27
|
+
#
|
28
|
+
def initialize(response, status)
|
29
|
+
@obj = response.fetch(:status, response)
|
30
|
+
@status = status
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
obj.inspect.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
def message
|
38
|
+
obj[:message] || nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def code
|
42
|
+
obj[:code] || status
|
43
|
+
end
|
44
|
+
|
45
|
+
def result
|
46
|
+
return obj[:result] if obj[:result]
|
47
|
+
return 'OK' if status.between?(200, 299)
|
48
|
+
'ERROR'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/wavefront-sdk/user.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'core/api'
|
2
2
|
|
3
3
|
module Wavefront
|
4
4
|
#
|
5
5
|
# Manage and query Wavefront users
|
6
6
|
#
|
7
|
-
class User <
|
7
|
+
class User < CoreApi
|
8
8
|
# GET /api/v2/user
|
9
9
|
# Get all users.
|
10
10
|
#
|
11
11
|
def list
|
12
|
-
|
12
|
+
api.get('')
|
13
13
|
end
|
14
14
|
|
15
15
|
# POST /api/v2/user
|
@@ -22,7 +22,7 @@ module Wavefront
|
|
22
22
|
#
|
23
23
|
def create(body, send_email = false)
|
24
24
|
raise ArgumentError unless body.is_a?(Hash)
|
25
|
-
|
25
|
+
api.post("?sendEmail=#{send_email}", body, 'application/json')
|
26
26
|
end
|
27
27
|
|
28
28
|
# DELETE /api/v2/user/id
|
@@ -33,7 +33,7 @@ module Wavefront
|
|
33
33
|
#
|
34
34
|
def delete(id)
|
35
35
|
wf_user_id?(id)
|
36
|
-
|
36
|
+
api.delete(id)
|
37
37
|
end
|
38
38
|
|
39
39
|
# GET /api/v2/user/id
|
@@ -44,7 +44,7 @@ module Wavefront
|
|
44
44
|
#
|
45
45
|
def describe(id)
|
46
46
|
wf_user_id?(id)
|
47
|
-
|
47
|
+
api.get(id)
|
48
48
|
end
|
49
49
|
|
50
50
|
# PUT /api/v2/user/id/grant
|
@@ -63,7 +63,7 @@ module Wavefront
|
|
63
63
|
def grant(id, group)
|
64
64
|
wf_user_id?(id)
|
65
65
|
raise ArgumentError unless group.is_a?(String)
|
66
|
-
|
66
|
+
api.post([id, 'grant'].uri_concat, "group=#{group}",
|
67
67
|
'application/x-www-form-urlencoded')
|
68
68
|
end
|
69
69
|
|
@@ -79,7 +79,7 @@ module Wavefront
|
|
79
79
|
def revoke(id, group)
|
80
80
|
wf_user_id?(id)
|
81
81
|
raise ArgumentError unless group.is_a?(String)
|
82
|
-
|
82
|
+
api.post([id, 'revoke'].uri_concat, "group=#{group}",
|
83
83
|
'application/x-www-form-urlencoded')
|
84
84
|
end
|
85
85
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require_relative 'constants'
|
2
|
-
require_relative 'exception'
|
1
|
+
require_relative 'defs/constants'
|
2
|
+
require_relative 'core/exception'
|
3
3
|
|
4
4
|
module Wavefront
|
5
5
|
#
|
@@ -409,7 +409,7 @@ module Wavefront
|
|
409
409
|
# https://community.wavefront.com/docs/DOC-1031
|
410
410
|
#
|
411
411
|
# @param point [Hash] description of point
|
412
|
-
# @return true if
|
412
|
+
# @return true if valid
|
413
413
|
# @raise whichever exception is thrown first when validating
|
414
414
|
# each component of the point.
|
415
415
|
#
|
@@ -422,6 +422,35 @@ module Wavefront
|
|
422
422
|
true
|
423
423
|
end
|
424
424
|
|
425
|
+
# Validate a distribution description
|
426
|
+
# @param dist [Hash] description of distribution
|
427
|
+
# @return true if valid
|
428
|
+
# @raise whichever exception is thrown first when validating
|
429
|
+
# each component of the distribution.
|
430
|
+
#
|
431
|
+
def wf_distribution?(dist)
|
432
|
+
wf_metric_name?(dist[:path])
|
433
|
+
wf_distribution_values?(dist[:value])
|
434
|
+
wf_epoch?(dist[:ts]) if dist[:ts]
|
435
|
+
wf_source_id?(dist[:source]) if dist[:source]
|
436
|
+
wf_point_tags?(dist[:tags]) if dist[:tags]
|
437
|
+
true
|
438
|
+
end
|
439
|
+
|
440
|
+
# Validate an array of distribution values
|
441
|
+
# @param vals [Array[Array]] [count, value]
|
442
|
+
# @return true if valid
|
443
|
+
# @raise whichever exception is thrown first when validating
|
444
|
+
# each component of the distribution.
|
445
|
+
#
|
446
|
+
def wf_distribution_values?(vals)
|
447
|
+
vals.each do |times, val|
|
448
|
+
wf_distribution_count?(times)
|
449
|
+
wf_value?(val)
|
450
|
+
end
|
451
|
+
true
|
452
|
+
end
|
453
|
+
|
425
454
|
# Ensure the given argument is a valid Wavefront notificant ID.
|
426
455
|
#
|
427
456
|
# @param id [String] the notificant ID to validate
|
@@ -446,6 +475,26 @@ module Wavefront
|
|
446
475
|
return true if id.is_a?(String) && id =~ /^[a-z0-9]+$/
|
447
476
|
raise Wavefront::Exception::InvalidIntegrationId
|
448
477
|
end
|
478
|
+
|
479
|
+
# Ensure the given argument is a valid distribution interval.
|
480
|
+
# @param interval [Symbol]
|
481
|
+
# @raise Wavefront::Exception::InvalidDistributionInterval if the
|
482
|
+
# interval is not valid
|
483
|
+
#
|
484
|
+
def wf_distribution_interval?(interval)
|
485
|
+
return true if %i[m h d].include?(interval)
|
486
|
+
raise Wavefront::Exception::InvalidDistributionInterval
|
487
|
+
end
|
488
|
+
|
489
|
+
# Ensure the given argument is a valid distribution count.
|
490
|
+
# @param count [Numeric]
|
491
|
+
# @raise Wavefront::Exception::InvalidDistributionCount if the
|
492
|
+
# count is not valid
|
493
|
+
#
|
494
|
+
def wf_distribution_count?(count)
|
495
|
+
return true if count.is_a?(Integer) && count > 0
|
496
|
+
raise Wavefront::Exception::InvalidDistributionCount
|
497
|
+
end
|
449
498
|
end
|
450
499
|
# rubocop:enable Metrics/ModuleLength
|
451
500
|
end
|
@@ -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 webhooks
|
6
6
|
#
|
7
|
-
class Webhook <
|
7
|
+
class Webhook < CoreApi
|
8
8
|
def update_keys
|
9
9
|
%i[title description template title triggers recipient]
|
10
10
|
end
|
@@ -16,7 +16,7 @@ module Wavefront
|
|
16
16
|
# @param limit [Integer] the number of webhooks to return
|
17
17
|
#
|
18
18
|
def list(offset = 0, limit = 100)
|
19
|
-
|
19
|
+
api.get('', offset: offset, limit: limit)
|
20
20
|
end
|
21
21
|
|
22
22
|
# POST /api/v2/webhook
|
@@ -29,7 +29,7 @@ module Wavefront
|
|
29
29
|
#
|
30
30
|
def create(body)
|
31
31
|
raise ArgumentError unless body.is_a?(Hash)
|
32
|
-
|
32
|
+
api.post('', body, 'application/json')
|
33
33
|
end
|
34
34
|
|
35
35
|
# DELETE /api/v2/webhook/id
|
@@ -40,7 +40,7 @@ module Wavefront
|
|
40
40
|
#
|
41
41
|
def delete(id)
|
42
42
|
wf_webhook_id?(id)
|
43
|
-
|
43
|
+
api.delete(id)
|
44
44
|
end
|
45
45
|
|
46
46
|
# GET /api/v2/webhook/id
|
@@ -51,7 +51,7 @@ module Wavefront
|
|
51
51
|
#
|
52
52
|
def describe(id)
|
53
53
|
wf_webhook_id?(id)
|
54
|
-
|
54
|
+
api.get(id)
|
55
55
|
end
|
56
56
|
|
57
57
|
# PUT /api/v2/webhook/id
|
@@ -69,9 +69,9 @@ module Wavefront
|
|
69
69
|
wf_webhook_id?(id)
|
70
70
|
raise ArgumentError unless body.is_a?(Hash)
|
71
71
|
|
72
|
-
return
|
72
|
+
return api.put(id, body, 'application/json') unless modify
|
73
73
|
|
74
|
-
|
74
|
+
api.put(id, hash_for_update(describe(id).response, body),
|
75
75
|
'application/json')
|
76
76
|
end
|
77
77
|
end
|
data/lib/wavefront-sdk/write.rb
CHANGED
@@ -1,66 +1,127 @@
|
|
1
|
-
|
1
|
+
require 'socket'
|
2
|
+
require_relative 'core/exception'
|
3
|
+
require_relative 'core/logger'
|
4
|
+
require_relative 'defs/constants'
|
5
|
+
require_relative 'validators'
|
6
|
+
require 'spy'
|
7
|
+
require 'spy/integration'
|
8
|
+
|
9
|
+
HOSTNAME = Socket.gethostname.freeze
|
2
10
|
|
3
11
|
module Wavefront
|
4
12
|
#
|
5
|
-
# This class helps you send points to
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# The points are prepped in the BaseWrite class, which this
|
9
|
-
# extends. This class provides the transport mechanism.
|
13
|
+
# This class helps you send points to Wavefront. It is extended by
|
14
|
+
# the Write and Report classes, which respectively handle point
|
15
|
+
# ingestion by a proxy and directly to the API.
|
10
16
|
#
|
11
|
-
class Write
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
class Write
|
18
|
+
attr_reader :creds, :opts, :writer, :logger
|
19
|
+
|
20
|
+
include Wavefront::Validators
|
21
|
+
|
22
|
+
# Construct an object which gives the user an interface for
|
23
|
+
# writing points to Wavefront. The actual writing is handled by
|
24
|
+
# a Wavefront::Writer:: subclass.
|
25
|
+
#
|
26
|
+
# @param creds [Hash] credentials
|
27
|
+
# signature.
|
28
|
+
# @param options [Hash] can contain the following keys:
|
29
|
+
# proxy [String] the address of the Wavefront proxy. ('wavefront')
|
30
|
+
# port [Integer] the port of the Wavefront proxy
|
31
|
+
# tags [Hash] point tags which will be applied to every point
|
32
|
+
# noop [Bool] if true, no proxy connection will be made, and
|
33
|
+
# instead of sending the points, they will be printed in
|
34
|
+
# Wavefront wire format.
|
35
|
+
# novalidate [Bool] if true, points will not be validated.
|
36
|
+
# This might make things go marginally quicker if you have
|
37
|
+
# done point validation higher up in the chain. Invalid
|
38
|
+
# points are dropped, logged, and reported in the summary.
|
39
|
+
# verbose [Bool]
|
40
|
+
# debug [Bool]
|
41
|
+
# writer [Symbol, String] the name of the writer class to use.
|
42
|
+
# Defaults to :socket
|
43
|
+
#
|
44
|
+
def initialize(creds = {}, opts = {})
|
45
|
+
defaults = { tags: nil,
|
46
|
+
writer: :socket,
|
47
|
+
noop: false,
|
48
|
+
novalidate: false,
|
49
|
+
verbose: false,
|
50
|
+
debug: false }
|
51
|
+
|
52
|
+
@opts = setup_options(opts, defaults)
|
53
|
+
@creds = creds
|
54
|
+
wf_point_tags?(opts[:tags]) if opts[:tags]
|
55
|
+
@logger = Wavefront::Logger.new(opts)
|
56
|
+
@writer = setup_writer
|
57
|
+
end
|
21
58
|
|
22
|
-
|
23
|
-
|
59
|
+
def setup_options(user, defaults)
|
60
|
+
defaults.merge(user)
|
24
61
|
end
|
25
62
|
|
26
|
-
#
|
27
|
-
#
|
63
|
+
# Wrapper to the writer class's #open method. Using this you can
|
64
|
+
# manually open a connection and re-use it.
|
28
65
|
#
|
29
66
|
def open
|
30
|
-
|
31
|
-
|
32
|
-
return true
|
33
|
-
end
|
67
|
+
writer.open
|
68
|
+
end
|
34
69
|
|
35
|
-
|
36
|
-
|
70
|
+
# Wrapper to the writer class's #close method.
|
71
|
+
#
|
72
|
+
def close
|
73
|
+
writer.close
|
74
|
+
end
|
37
75
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
76
|
+
# A wrapper to the writer class's #write method.
|
77
|
+
# Writers implement this method differently, Check the
|
78
|
+
# appropriate class documentation for @return information etc.
|
79
|
+
# The signature is always the same.
|
80
|
+
#
|
81
|
+
def write(points = [], openclose = true, prefix = nil)
|
82
|
+
writer.write(points, openclose, prefix)
|
44
83
|
end
|
45
84
|
|
46
|
-
#
|
85
|
+
# A wrapper method around #write() which guarantees all points
|
86
|
+
# will be sent as deltas. You can still manually prefix any
|
87
|
+
# metric with a delta symbol and use #write(), but depending on
|
88
|
+
# your use-case, this method may be safer. It's easy to forget
|
89
|
+
# the delta.
|
47
90
|
#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
91
|
+
# @param points [Array[Hash]] see #write()
|
92
|
+
# @param openclose [Bool] see #write()
|
93
|
+
#
|
94
|
+
def write_delta(points, openclose = true)
|
95
|
+
write(paths_to_deltas(points), openclose)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Prefix all paths in a points array (as passed to
|
99
|
+
# #write_delta() with a delta symbol
|
100
|
+
#
|
101
|
+
# @param points [Array[Hash]] see #write()
|
102
|
+
# @return [Array[Hash]]
|
103
|
+
#
|
104
|
+
def paths_to_deltas(points)
|
105
|
+
[points].flatten.map { |p| p.tap { p[:path] = DELTA + p[:path] } }
|
52
106
|
end
|
53
107
|
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
108
|
+
# Wrapper for the writer class's #send_point method
|
109
|
+
# @param point [String] a point description, probably from
|
110
|
+
# #hash_to_wf()
|
57
111
|
#
|
58
|
-
def
|
59
|
-
|
112
|
+
def send_point(point)
|
113
|
+
if opts[:noop]
|
114
|
+
logger.log "Would send: #{point}"
|
115
|
+
return
|
116
|
+
end
|
117
|
+
|
118
|
+
logger.log("Sending: #{point}", :debug)
|
119
|
+
writer.send_point(point)
|
60
120
|
end
|
61
121
|
|
62
|
-
# Send raw data to a Wavefront proxy, automatically
|
63
|
-
# closing
|
122
|
+
# Send raw data to a Wavefront proxy, optionally automatically
|
123
|
+
# opening and closing the connection. (Or not, if that does not
|
124
|
+
# make sense in the context of the writer.)
|
64
125
|
#
|
65
126
|
# @param points [Array[String]] an array of points in native
|
66
127
|
# Wavefront wire format, as described in
|
@@ -71,22 +132,62 @@ module Wavefront
|
|
71
132
|
# afterwards, close it.
|
72
133
|
#
|
73
134
|
def raw(points, openclose = true)
|
74
|
-
open if openclose
|
135
|
+
writer.open if openclose && writer.respond_to?(:open)
|
75
136
|
|
76
137
|
begin
|
77
|
-
[points].flatten.each { |p| send_point(p) }
|
138
|
+
[points].flatten.each { |p| writer.send_point(p) }
|
78
139
|
ensure
|
79
|
-
close if openclose
|
140
|
+
writer.close if openclose && writer.respond_to?(:close)
|
80
141
|
end
|
81
142
|
end
|
82
143
|
|
144
|
+
# The method used to validate the data we wish to write.
|
145
|
+
#
|
146
|
+
def validation
|
147
|
+
:wf_point?
|
148
|
+
end
|
149
|
+
|
150
|
+
# Convert a validated point to a string conforming to
|
151
|
+
# https://community.wavefront.com/docs/DOC-1031. No validation
|
152
|
+
# is done here.
|
153
|
+
#
|
154
|
+
# @param point [Hash] a hash describing a point. See #write() for
|
155
|
+
# the format.
|
156
|
+
#
|
157
|
+
def hash_to_wf(point)
|
158
|
+
format('%s %s %s source=%s %s %s',
|
159
|
+
*point_array(point)).squeeze(' ').strip
|
160
|
+
rescue StandardError
|
161
|
+
raise Wavefront::Exception::InvalidPoint
|
162
|
+
end
|
163
|
+
|
164
|
+
# Make an array which can be used by #hash_to_wf.
|
165
|
+
# @param point [Hash] a hash describing a point. See #write() for
|
166
|
+
# the format.
|
167
|
+
# @raise
|
168
|
+
#
|
169
|
+
def point_array(point)
|
170
|
+
[point[:path] || raise,
|
171
|
+
point[:value] || raise,
|
172
|
+
point.fetch(:ts, nil),
|
173
|
+
point.fetch(:source, HOSTNAME),
|
174
|
+
point[:tags] && point[:tags].to_wf_tag,
|
175
|
+
opts[:tags] && opts[:tags].to_wf_tag]
|
176
|
+
end
|
177
|
+
|
83
178
|
private
|
84
179
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
180
|
+
# @return [Object] appropriate subclass of Wavefront::Writer
|
181
|
+
# @raise [Wavefront::Exception::UnsupportedWriter] if requested
|
182
|
+
# writer cannot be loaded
|
183
|
+
#
|
184
|
+
def setup_writer
|
185
|
+
writer = opts[:writer].to_s
|
186
|
+
require_relative File.join('writers', writer)
|
187
|
+
Object.const_get(format('Wavefront::Writer::%s',
|
188
|
+
writer.capitalize)).new(self)
|
189
|
+
rescue LoadError
|
190
|
+
raise(Wavefront::Exception::UnsupportedWriter, writer)
|
90
191
|
end
|
91
192
|
end
|
92
193
|
end
|