wavefront-client 3.5.3 → 3.5.4
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/.travis.yml +4 -2
- data/README-cli.md +84 -60
- data/bin/wavefront +84 -69
- data/lib/wavefront/alerting.rb +14 -3
- data/lib/wavefront/batch_writer.rb +7 -0
- data/lib/wavefront/cli.rb +15 -17
- data/lib/wavefront/cli/alerts.rb +15 -10
- data/lib/wavefront/cli/batch_write.rb +12 -3
- data/lib/wavefront/cli/events.rb +19 -3
- data/lib/wavefront/cli/sources.rb +22 -12
- data/lib/wavefront/cli/ts.rb +9 -1
- data/lib/wavefront/cli/write.rb +7 -0
- data/lib/wavefront/client.rb +9 -5
- data/lib/wavefront/client/version.rb +1 -1
- data/lib/wavefront/constants.rb +20 -0
- data/lib/wavefront/events.rb +26 -4
- data/lib/wavefront/metadata.rb +23 -6
- data/lib/wavefront/opt_handler.rb +61 -0
- data/spec/cli_spec.rb +584 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/wavefront/alerting_spec.rb +8 -9
- data/spec/wavefront/batch_writer_spec.rb +1 -1
- data/spec/wavefront/cli/alerts_spec.rb +5 -4
- data/spec/wavefront/cli/batch_write_spec.rb +4 -2
- data/spec/wavefront/cli/events_spec.rb +3 -2
- data/spec/wavefront/cli/sources_spec.rb +3 -2
- data/spec/wavefront/cli/write_spec.rb +4 -2
- data/spec/wavefront/cli_spec.rb +11 -43
- data/spec/wavefront/client_spec.rb +2 -2
- data/spec/wavefront/events_spec.rb +1 -1
- data/spec/wavefront/metadata_spec.rb +1 -1
- data/spec/wavefront/mixins_spec.rb +1 -1
- data/spec/wavefront/opt_handler_spec.rb +89 -0
- data/spec/wavefront/resources/conf.yaml +10 -0
- data/spec/wavefront/response_spec.rb +3 -3
- data/spec/wavefront/validators_spec.rb +1 -1
- data/spec/wavefront/writer_spec.rb +1 -1
- metadata +9 -3
- data/.ruby-version +0 -1
data/spec/spec_helper.rb
CHANGED
@@ -22,6 +22,7 @@ require 'wavefront/alerting'
|
|
22
22
|
require 'wavefront/events'
|
23
23
|
require 'wavefront/batch_writer'
|
24
24
|
require 'wavefront/validators'
|
25
|
+
require 'wavefront/opt_handler'
|
25
26
|
require 'wavefront/cli'
|
26
27
|
require 'wavefront/cli/alerts'
|
27
28
|
require 'wavefront/cli/events'
|
@@ -79,3 +80,44 @@ end
|
|
79
80
|
def concat_url(*args)
|
80
81
|
'https://' + args.join('/').squeeze('/')
|
81
82
|
end
|
83
|
+
|
84
|
+
def raw(str)
|
85
|
+
#
|
86
|
+
# eval. I know. But some of the CLI tests dump raw Ruby hashes in the
|
87
|
+
# debug output. This parses them so you can check them. They'll be
|
88
|
+
# prefixed with 'POST' or 'GET'
|
89
|
+
#
|
90
|
+
eval(str.split[1..-1].join(' '))
|
91
|
+
end
|
92
|
+
|
93
|
+
def wf(args = '')
|
94
|
+
#
|
95
|
+
# Run the 'wavefront' CLI command, with arguments, and return a struct
|
96
|
+
# for easy access
|
97
|
+
#
|
98
|
+
ret = OpenStruct.new
|
99
|
+
env = {'RUBYLIB' => [LIB.to_s, ENV['RUBYLIB']].join(':') }
|
100
|
+
|
101
|
+
puts "testing #{WF} #{args}"
|
102
|
+
stdout, stderr, status = Open3.capture3(env, "#{WF} #{args}")
|
103
|
+
|
104
|
+
ret.status = status.exitstatus
|
105
|
+
ret.stdout_a = stdout.split("\n")
|
106
|
+
ret.stdout = stdout.strip
|
107
|
+
ret.stderr_a = stderr.split("\n")
|
108
|
+
ret.stderr = stderr.strip
|
109
|
+
ret
|
110
|
+
end
|
111
|
+
|
112
|
+
# A matcher that tells you whether you have a key=value setting in a query
|
113
|
+
# string. Call it with have_element([:key, value])
|
114
|
+
#
|
115
|
+
RSpec::Matchers.define :have_element do |expected|
|
116
|
+
match do |str|
|
117
|
+
str.sub(/^\S+ /, '').sub(/^.*\?/, '').split('&').
|
118
|
+
each_with_object([]) do |e, aggr|
|
119
|
+
k, v = e.split('=')
|
120
|
+
aggr.<< [k.to_sym, v]
|
121
|
+
end.include?([expected[0].to_sym, URI.escape(expected[1].to_s)])
|
122
|
+
end
|
123
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
=begin
|
1
|
+
=begin
|
2
2
|
Copyright 2015 Wavefront Inc.
|
3
3
|
Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
you may not use this file except in compliance with the License.
|
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|
14
14
|
|
15
15
|
=end
|
16
16
|
|
17
|
-
|
17
|
+
require_relative '../spec_helper'
|
18
18
|
require 'pathname'
|
19
19
|
|
20
20
|
describe Wavefront::Alerting do
|
@@ -55,7 +55,7 @@ describe Wavefront::Alerting do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'makes API request with specified path' do
|
58
|
-
path = '/api/new_alerts'
|
58
|
+
path = '/api/new_alerts'
|
59
59
|
expect(RestClient).to receive(:get).with("https://#{File.join(Wavefront::Alerting::DEFAULT_HOST, path, "all?t=#{TEST_TOKEN}")}")
|
60
60
|
@wave.all({ :path => path })
|
61
61
|
end
|
@@ -73,7 +73,7 @@ describe Wavefront::Alerting do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'makes API request with both appended private tags and shared tags' do
|
76
|
-
private_tag = 'first'
|
76
|
+
private_tag = 'first'
|
77
77
|
shared_tag = 'second'
|
78
78
|
expect(RestClient).to receive(:get).with("https://#{File.join(Wavefront::Alerting::DEFAULT_HOST, Wavefront::Alerting::DEFAULT_PATH, "all?t=#{TEST_TOKEN}&customerTag=second&userTag=first")}")
|
79
79
|
@wave.all({ :private_tags => private_tag, :shared_tags => shared_tag })
|
@@ -82,30 +82,29 @@ describe Wavefront::Alerting do
|
|
82
82
|
|
83
83
|
describe '#active' do
|
84
84
|
it 'requests all active alerts' do
|
85
|
-
expect(@wave).to receive(:get_alerts).with("active", {})
|
85
|
+
expect(@wave).to receive(:get_alerts).with("active", {})
|
86
86
|
@wave.active
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
90
|
describe '#snoozed' do
|
91
91
|
it 'requests all snoozed alerts' do
|
92
|
-
expect(@wave).to receive(:get_alerts).with("snoozed", {})
|
92
|
+
expect(@wave).to receive(:get_alerts).with("snoozed", {})
|
93
93
|
@wave.snoozed
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
97
|
describe '#invalid' do
|
98
98
|
it 'requests all invalid alerts' do
|
99
|
-
expect(@wave).to receive(:get_alerts).with("invalid", {})
|
99
|
+
expect(@wave).to receive(:get_alerts).with("invalid", {})
|
100
100
|
@wave.invalid
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
104
|
describe '#affected_by_maintenance' do
|
105
105
|
it 'requests all affected_by_maintenance alerts' do
|
106
|
-
expect(@wave).to receive(:get_alerts).with("affected_by_maintenance", {})
|
106
|
+
expect(@wave).to receive(:get_alerts).with("affected_by_maintenance", {})
|
107
107
|
@wave.affected_by_maintenance
|
108
108
|
end
|
109
109
|
end
|
110
|
-
|
111
110
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../../spec_helper'
|
2
2
|
require 'pathname'
|
3
3
|
require 'json'
|
4
4
|
require 'erb'
|
@@ -9,7 +9,8 @@ states = %w(active affected_by_maintenance all invalid snoozed)
|
|
9
9
|
formats = %w(ruby json human)
|
10
10
|
|
11
11
|
opts = {
|
12
|
-
token:
|
12
|
+
token: TEST_TOKEN,
|
13
|
+
endpoint: TEST_HOST,
|
13
14
|
}
|
14
15
|
|
15
16
|
describe Wavefront::Cli::Alerts do
|
@@ -35,7 +36,7 @@ describe Wavefront::Cli::Alerts do
|
|
35
36
|
k = Wavefront::Cli::Alerts.new(opts, ['all'])
|
36
37
|
|
37
38
|
states.each do |state|
|
38
|
-
expect(k.valid_state?(wfa, state
|
39
|
+
expect(k.valid_state?(wfa, state)).to be(true)
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
@@ -94,7 +95,7 @@ describe Wavefront::Cli::Alerts do
|
|
94
95
|
it 'reconstructs human output' do
|
95
96
|
out = ERB.new(IO.read(Pathname.new(__FILE__).dirname +
|
96
97
|
'resources' + 'alert.human.erb')).result
|
97
|
-
expect(k.humanize(JSON.parse(src)).join("\n")
|
98
|
+
expect(k.humanize(JSON.parse(src)).join("\n")).to eq(out)
|
98
99
|
end
|
99
100
|
end
|
100
101
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../../spec_helper'
|
2
2
|
require 'pathname'
|
3
3
|
require 'json'
|
4
4
|
|
@@ -8,7 +8,8 @@ states = %w(active affected_by_maintenance all invalid snoozed)
|
|
8
8
|
formats = %w(ruby json human)
|
9
9
|
|
10
10
|
opts = {
|
11
|
-
token:
|
11
|
+
token: TEST_TOKEN,
|
12
|
+
endpoint: TEST_HOST,
|
12
13
|
}
|
13
14
|
|
14
15
|
describe Wavefront::Cli::Alerts do
|
@@ -2,11 +2,12 @@
|
|
2
2
|
# Due to dependency requirements, webmock does not work with Ruby
|
3
3
|
# 1.9.3. For as long as we have to support that, it's off the table.
|
4
4
|
#
|
5
|
-
|
5
|
+
require_relative '../../spec_helper'
|
6
6
|
#require 'webmock/rspec'
|
7
7
|
|
8
8
|
opts = {
|
9
|
-
token:
|
9
|
+
token: TEST_TOKEN,
|
10
|
+
endpoint: TEST_HOST,
|
10
11
|
}
|
11
12
|
|
12
13
|
describe Wavefront::Cli::Sources do
|
data/spec/wavefront/cli_spec.rb
CHANGED
@@ -14,55 +14,23 @@ See the License for the specific language governing permissions and
|
|
14
14
|
|
15
15
|
=end
|
16
16
|
|
17
|
-
|
18
|
-
require 'pathname'
|
19
|
-
require 'tempfile'
|
17
|
+
require_relative '../spec_helper'
|
20
18
|
|
21
|
-
#
|
22
|
-
#
|
23
|
-
pf_src = %Q(
|
24
|
-
[default]
|
25
|
-
token = 12345678-abcd-1234-abcd-123456789012
|
26
|
-
endpoint = metrics.wavefront.com
|
27
|
-
format = human
|
28
|
-
proxy = wavefront.localnet
|
29
|
-
|
30
|
-
[other]
|
31
|
-
token = abcdefab-0123-abcd-0123-abcdefabcdef
|
32
|
-
endpoint = test.wavefront.com
|
33
|
-
format = human
|
34
|
-
)
|
19
|
+
# Just test initialization
|
35
20
|
|
36
21
|
describe Wavefront::Cli do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
profile.write(pf_src)
|
41
|
-
profile.close
|
42
|
-
|
43
|
-
it 'does not complain when there is no config file' do
|
44
|
-
k = Wavefront::Cli.new({config: '/no/file', profile: 'default'}, false)
|
45
|
-
expect(k.load_profile).to be_kind_of(NilClass)
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'loads the specified profile' do
|
49
|
-
k = Wavefront::Cli.new({config: cf, profile: 'other'}, false)
|
50
|
-
pf = k.load_profile
|
51
|
-
expect(pf).not_to include('proxy')
|
52
|
-
expect(pf[:token]).to eq('abcdefab-0123-abcd-0123-abcdefabcdef')
|
22
|
+
it 'raises an error if no token is set' do
|
23
|
+
wf = Wavefront::Cli.new({}, nil)
|
24
|
+
expect{wf.validate_opts}.to raise_exception(RuntimeError)
|
53
25
|
end
|
54
26
|
|
55
|
-
it '
|
56
|
-
|
57
|
-
|
58
|
-
expect(pf[:proxy]).to eq('wavefront.localnet')
|
59
|
-
expect(pf[:token]).to eq('12345678-abcd-1234-abcd-123456789012')
|
27
|
+
it 'raises an error if no endpoint is set' do
|
28
|
+
wf = Wavefront::Cli.new({token: 'abcdef' }, nil)
|
29
|
+
expect{wf.validate_opts}.to raise_exception(RuntimeError)
|
60
30
|
end
|
61
31
|
|
62
|
-
it '
|
63
|
-
|
64
|
-
|
65
|
-
expect(pf[:format]).to eq('human')
|
66
|
-
expect(pf[:token]).to eq('12345678-abcd-1234-abcd-123456789012')
|
32
|
+
it 'does not raise an error if an endpoint and token are set' do
|
33
|
+
wf = Wavefront::Cli.new({token: 'abcdef', endpoint: 'wavefront' }, nil)
|
34
|
+
expect{wf.validate_opts}.to_not raise_exception
|
67
35
|
end
|
68
36
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
=begin
|
1
|
+
=begin
|
2
2
|
Copyright 2015 Wavefront Inc.
|
3
3
|
Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
you may not use this file except in compliance with the License.
|
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|
14
14
|
|
15
15
|
=end
|
16
16
|
|
17
|
-
|
17
|
+
require_relative '../spec_helper'
|
18
18
|
require 'pathname'
|
19
19
|
|
20
20
|
describe Wavefront::Client do
|
@@ -0,0 +1,89 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2015 Wavefront Inc.
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
|
15
|
+
=end
|
16
|
+
|
17
|
+
require_relative '../spec_helper'
|
18
|
+
require 'pathname'
|
19
|
+
require 'socket'
|
20
|
+
|
21
|
+
# DEFAULT_OPTS come from the real constants.rb file
|
22
|
+
|
23
|
+
describe Wavefront::OptHandler do
|
24
|
+
config_file = Pathname.new(__FILE__).dirname + 'resources' + 'conf.yaml'
|
25
|
+
|
26
|
+
it 'uses defaults if nothing else is supplied' do
|
27
|
+
opts = Wavefront::OptHandler.new(Pathname.new('/nofile'), {}).opts
|
28
|
+
|
29
|
+
expect(opts.class).to be(Hash)
|
30
|
+
expect(opts[:endpoint]).to eq('metrics.wavefront.com')
|
31
|
+
expect(opts[:host]).to eq(Socket.gethostname)
|
32
|
+
expect(opts[:sourceformat]).to eq(:human)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'ensures options override defaults' do
|
36
|
+
cli_opts = {
|
37
|
+
endpoint: 'myendpoint.wavefront.com',
|
38
|
+
sourceformat: 'ruby',
|
39
|
+
}
|
40
|
+
|
41
|
+
opts = Wavefront::OptHandler.new(Pathname.new('/nofile'), cli_opts).opts
|
42
|
+
|
43
|
+
expect(opts.class).to be(Hash)
|
44
|
+
expect(opts[:endpoint]).to eq('myendpoint.wavefront.com')
|
45
|
+
expect(opts[:host]).to eq(Socket.gethostname)
|
46
|
+
expect(opts[:sourceformat]).to eq('ruby')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'ensures default config file values override defaults' do
|
50
|
+
opts = Wavefront::OptHandler.new(config_file, {}).opts
|
51
|
+
|
52
|
+
expect(opts.class).to be(Hash)
|
53
|
+
expect(opts[:endpoint]).to eq('default.wavefront.com')
|
54
|
+
expect(opts[:host]).to eq(Socket.gethostname)
|
55
|
+
expect(opts[:sourceformat]).to eq('raw')
|
56
|
+
expect(opts[:format]).to eq(:raw)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'ensures alternate stanza config file values override defaults' do
|
60
|
+
opts = Wavefront::OptHandler.new(config_file, {profile: 'other'}).opts
|
61
|
+
|
62
|
+
expect(opts.class).to be(Hash)
|
63
|
+
expect(opts[:endpoint]).to eq('other.wavefront.com')
|
64
|
+
expect(opts[:host]).to eq(Socket.gethostname)
|
65
|
+
expect(opts[:sourceformat]).to eq(:human)
|
66
|
+
expect(opts[:format]).to eq(:raw)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'ensures command line options override defaults and config files' do
|
70
|
+
cli_opts = {
|
71
|
+
endpoint: 'cli.wavefront.com',
|
72
|
+
sourceformat: 'ruby',
|
73
|
+
}
|
74
|
+
|
75
|
+
opts = Wavefront::OptHandler.new(config_file, cli_opts).opts
|
76
|
+
|
77
|
+
expect(opts.class).to be(Hash)
|
78
|
+
expect(opts[:endpoint]).to eq('cli.wavefront.com')
|
79
|
+
expect(opts[:host]).to eq(Socket.gethostname)
|
80
|
+
expect(opts[:sourceformat]).to eq('ruby')
|
81
|
+
expect(opts[:format]).to eq(:raw)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'issues a warning if there is no config file' do
|
85
|
+
expect{Wavefront::OptHandler.new(Pathname.new('/nofile'), {})}.
|
86
|
+
to match_stdout("'/nofile' not found. Taking options from command-line.")
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
[default]
|
2
|
+
token = 12345678-abcd-1234-abcd-123456789012
|
3
|
+
endpoint = default.wavefront.com
|
4
|
+
proxy = wavefront.localnet
|
5
|
+
sourceformat = raw
|
6
|
+
|
7
|
+
[other]
|
8
|
+
token = abcdefab-0123-abcd-0123-abcdefabcdef
|
9
|
+
endpoint = other.wavefront.com
|
10
|
+
proxy = otherwf.localnet
|
@@ -1,4 +1,4 @@
|
|
1
|
-
=begin
|
1
|
+
=begin
|
2
2
|
Copyright 2015 Wavefront Inc.
|
3
3
|
Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
you may not use this file except in compliance with the License.
|
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|
14
14
|
|
15
15
|
=end
|
16
16
|
|
17
|
-
|
17
|
+
require_relative '../spec_helper'
|
18
18
|
require 'pathname'
|
19
19
|
require 'json'
|
20
20
|
|
@@ -72,7 +72,7 @@ describe Wavefront::Response::Highcharts do
|
|
72
72
|
it 'returns something that resembles highcharts output' do
|
73
73
|
example_response = File.read(Pathname.new(__FILE__).parent.parent.join('example_response.json'))
|
74
74
|
response = Wavefront::Response::Highcharts.new(example_response)
|
75
|
-
|
75
|
+
|
76
76
|
expect(response.highcharts[0]['data'].size).to eq(30)
|
77
77
|
JSON.parse(response.to_json).each { |m| expect(m.keys.size).to eq(2) }
|
78
78
|
end
|