wavefront-client 3.5.4 → 3.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README-cli.md +162 -9
- data/bin/wavefront +41 -1
- data/lib/wavefront/alerting.rb +111 -24
- data/lib/wavefront/cli/alerts.rb +61 -7
- data/lib/wavefront/cli/dashboards.rb +138 -0
- data/lib/wavefront/client/version.rb +1 -1
- data/lib/wavefront/constants.rb +5 -2
- data/lib/wavefront/dashboards.rb +106 -0
- data/lib/wavefront/metadata.rb +0 -34
- data/lib/wavefront/mixins.rb +57 -8
- data/spec/cli_spec.rb +335 -9
- data/spec/spec_helper.rb +7 -0
- data/spec/wavefront/alerting_spec.rb +62 -15
- data/spec/wavefront/cli/alerts_spec.rb +2 -2
- data/spec/wavefront/cli/resources/alert.human.erb +2 -2
- data/spec/wavefront/cli/resources/alert.human2 +2 -2
- data/spec/wavefront/{resources → cli/resources}/conf.yaml +0 -0
- data/spec/wavefront/cli/resources/input_alert.json +34 -0
- data/spec/wavefront/cli/resources/input_alert.yaml +22 -0
- data/spec/wavefront/cli/resources/sample_alert.json +63 -0
- data/spec/wavefront/cli/resources/sample_alert.txt +2 -0
- data/spec/wavefront/cli/resources/sample_alert.yaml +47 -0
- data/spec/wavefront/cli/resources/sample_dash.json +1 -0
- data/spec/wavefront/cli/resources/sample_dash.txt +2 -0
- data/spec/wavefront/cli/resources/sample_dash.yaml +1114 -0
- data/spec/wavefront/opt_handler_spec.rb +3 -5
- metadata +22 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27196556716ec832044c8587e6d395caddc4c39f
|
4
|
+
data.tar.gz: b8acc4e5aa6ce54130fd6abc143d3f2f8fffe44b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 656b1215fe52afbdcfeb62212e458f900807edf84621e2968c50f44ff23b60b1f2424d2a32753d3f19e14de3894c0f8d479dd6320d55e3fa3307c7117ee5936d
|
7
|
+
data.tar.gz: c8c9741dfc418ba90aab20f6b4b3d898e978dd98677baae33ec506b42c0c377ce77dc0a31291210b99e556c071af542a19e42dcd3702e84206ecd8099188b251
|
data/README-cli.md
CHANGED
@@ -102,23 +102,37 @@ $ ./wavefront ts -f human -m --start=18:00 --end=20:00 'events()'
|
|
102
102
|
Output is different for event queries. The columns are: start time -> end
|
103
103
|
time, (duration), severity, event type, [source(s)], details.
|
104
104
|
|
105
|
-
## `alerts` Mode: Retrieving Alert Data
|
105
|
+
## `alerts` Mode: Retrieving and Importing Alert Data
|
106
106
|
|
107
|
-
The `alerts` command lets you view alerts. It
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
107
|
+
The `alerts` command lets you view, export, and import alerts. It
|
108
|
+
does not currently modification removal, or reacting to alerts, as
|
109
|
+
these actions are not supported by the v1 API.
|
110
|
+
|
111
|
+
Alerts can be presented in a number of formats, but defaults to a
|
112
|
+
human-readable form. If you wish to parse the output, please use the
|
113
|
+
`ruby`, `yaml` or `json` formatters.
|
112
114
|
|
113
115
|
```
|
114
116
|
Usage:
|
115
|
-
wavefront alerts [-
|
117
|
+
wavefront alerts [-DnV] [-c file] [-P profile] [-E endpoint] [-t token]
|
116
118
|
[-f format] [-p tag] [ -s tag] <state>
|
119
|
+
wavefront alerts export [-DnV] [-c file] [-P profile] [-E endpoint] [-t token]
|
120
|
+
[-f format] <timestamp>
|
121
|
+
wavefront alerts import [-DnV] [-c file] [-P profile] [-E endpoint] [-t token]
|
122
|
+
<file>
|
123
|
+
|
124
|
+
Global options:
|
125
|
+
-c, --config=FILE path to configuration file [/home/rob/.wavefront]
|
126
|
+
-P, --profile=NAME profile in configuration file [default]
|
127
|
+
-D, --debug enable debug mode
|
128
|
+
-n, --noop don't perform API calls
|
129
|
+
-V, --verbose be verbose
|
130
|
+
-h, --help show this message
|
117
131
|
|
118
132
|
Options:
|
119
133
|
-E, --endpoint=URI cluster endpoint [metrics.wavefront.com]
|
120
134
|
-t, --token=TOKEN Wavefront authentication token
|
121
|
-
-f, --alertformat=STRING output format (ruby, json, human)
|
135
|
+
-f, --alertformat=STRING output format (ruby, json, human, yaml)
|
122
136
|
[]
|
123
137
|
-p, --private=TAG retrieve only alerts with named private tags,
|
124
138
|
comma delimited.
|
@@ -126,6 +140,17 @@ Options:
|
|
126
140
|
comma delimited.
|
127
141
|
```
|
128
142
|
|
143
|
+
When exporting an alert, you must refer to it my its millisecond
|
144
|
+
timestamp. This value is in the `created` field when you view an
|
145
|
+
alert as `json` or `YAML`, and it is shown in brackets on the
|
146
|
+
`created` line if you use `human` output.
|
147
|
+
|
148
|
+
Due to v1 API limitations, not all an alert's properties will
|
149
|
+
survive the import/export process.
|
150
|
+
|
151
|
+
Imports can only be alerted from a file. Importing from stdin is
|
152
|
+
currently unsupported.
|
153
|
+
|
129
154
|
### Examples
|
130
155
|
|
131
156
|
List all alerts in human-readable format. Alerts are separated by a
|
@@ -157,10 +182,23 @@ severity WARN
|
|
157
182
|
Show alerts currently firing, in JSON format:
|
158
183
|
|
159
184
|
```
|
160
|
-
$ wavefront alerts -P sysdef --format
|
185
|
+
$ wavefront alerts -P sysdef --format json active
|
161
186
|
"[{\"customerTagsWithCounts\":{},\"userTagsWithCounts\":{},\"created\":1459508340708,\"name\":\"Point Rate\",\"conditionQBEnabled\":false,\"displayExpressionQBEnabled\":false,\"condition\":\"sum(deriv(ts(~collector.points.valid))) > 50000\",\"displayExpression\":\"sum(deriv(ts(~collector.points.valid)))\",\"minutes\":5,\"target\":\"alerts@company.com,\",\"event\":{\"name\":\"Point Rate\",\"startTime\":1467049323203,\"annotations\":{\"severity\":\"severe\",\"type\":\"alert\",\"created\":\"1459508340708\",\"target\":\"alerts@company.com,\"},\"hosts\":[\"\"],\"table\":\"sysdef\"},\"failingHostLabelPairs\":[{\"label\":\"\",\"observed\":5,\"firing\":5}],\"updated\":1467049317802,\"severity\":\"SEVERE\",\"additionalInformation\":\"We have exceeded our agreed point rate.\",\"activeMaintenanceWindows\":[],\"inMaintenanceHostLabelPairs\":[],\"prefiringHostLabelPairs\":[],\"alertStates\":[\"ACTIVE\"],\"inTrash\":false,\"numMetricsUsed\":1,\"numHostsUsed\":1}]"
|
162
187
|
```
|
163
188
|
|
189
|
+
Export an alert from your default account, in JSON format:
|
190
|
+
|
191
|
+
```
|
192
|
+
$ wavefront alerts export -f json 1488995981076 >my_alert.json
|
193
|
+
```
|
194
|
+
|
195
|
+
and re-import it:
|
196
|
+
|
197
|
+
```
|
198
|
+
$ wavefront alerts import my_alert.json
|
199
|
+
Alert imported.
|
200
|
+
```
|
201
|
+
|
164
202
|
## `event` Mode: Opening and Closing Events
|
165
203
|
|
166
204
|
The `event` command is used to open and close Wavefront events.
|
@@ -473,6 +511,121 @@ physical 10
|
|
473
511
|
zone 363
|
474
512
|
```
|
475
513
|
|
514
|
+
## `dashboard` Mode:
|
515
|
+
|
516
|
+
The `dashboard` command implements all of the v1 API's `dashboard`
|
517
|
+
paths.
|
518
|
+
|
519
|
+
```
|
520
|
+
Usage:
|
521
|
+
wavefront dashboard list [-DnV] [-c file] [-P profile] [-E endpoint]
|
522
|
+
[-f format] [-t token] [-T tag...] [-p tag...] [-a]
|
523
|
+
wavefront dashboard import [-DnV] [-c file] [-P profile] [-E endpoint]
|
524
|
+
[-f format] [-F] <file>
|
525
|
+
wavefront dashboard export [-DnV] [-c file] [-P profile] [-E endpoint]
|
526
|
+
[-f format] [-v version] <dashboard_id>
|
527
|
+
wavefront dashboard create [-DnV] [-c file] [-P profile] [-E endpoint]
|
528
|
+
<dashboard_id> <name>
|
529
|
+
wavefront dashboard clone [-DnV] [-c file] [-P profile] [-E endpoint]
|
530
|
+
[-v version] -s source_id <new_id> <new_name>
|
531
|
+
wavefront dashboard delete [-DnV] [-c file] [-P profile] [-E endpoint]
|
532
|
+
<dashboard_id>
|
533
|
+
wavefront dashboard undelete [-DnV] [-c file] [-P profile] [-E endpoint]
|
534
|
+
<dashboard_id>
|
535
|
+
wavefront dashboard history [-DnV] [-c file] [-P profile] [-E endpoint]
|
536
|
+
[-f format] [-S version] [-L limit] <dashboard_id>
|
537
|
+
```
|
538
|
+
|
539
|
+
Dashboard IDs are the same as their `url` fields when listed or exported.
|
540
|
+
|
541
|
+
Deleting a dashboard once will move it to "trash". Deleting a second
|
542
|
+
time removes it for ever. Dashboards can be recovered from the trash
|
543
|
+
with the `undelete` command.
|
544
|
+
|
545
|
+
Listing dashboards with `-f human` will not ordinarily display
|
546
|
+
dashboards in the trash. Supplying the `-a` option will list all
|
547
|
+
dashboards, and trashed ones will have `(in trash)` appended to
|
548
|
+
their name field. Listing dashboards in a machine-parseable format
|
549
|
+
does not do this filtering.
|
550
|
+
|
551
|
+
When cloning a dashboard you may use the `-v` flag to clone from a
|
552
|
+
specific version. Without `-v` the current dashboard is cloned.
|
553
|
+
|
554
|
+
If your dashboard output format, defined either by the `-f` flag or
|
555
|
+
the `dashformat` config-file setting is `human`, and you use
|
556
|
+
`dashboard export`, the output format will silently switch to JSON
|
557
|
+
for that one command.
|
558
|
+
|
559
|
+
Importing a dashboard will fail if a dashboard with the same url
|
560
|
+
already exists. If you supply the `-F` flag, the existing dashboard
|
561
|
+
will be overwritten.
|
562
|
+
|
563
|
+
Dashboards can be imported from YAML or JSON files, but not
|
564
|
+
currently from standard in. The file format is automatically
|
565
|
+
detected.
|
566
|
+
|
567
|
+
### Examples
|
568
|
+
|
569
|
+
List active dashboards in a human-readable form:
|
570
|
+
|
571
|
+
```
|
572
|
+
$ wavefront dashboard list -f human
|
573
|
+
ID NAME
|
574
|
+
S3 S3
|
575
|
+
box how busy is box?
|
576
|
+
discogs discogs data
|
577
|
+
internal_metrics Internal Metrics
|
578
|
+
intro-anomaly-detection-series-1 Intro: Use Case: Anomaly Detection
|
579
|
+
Series - Part 1
|
580
|
+
intro-code-push-example Intro: Use Case: Code Push Event
|
581
|
+
...
|
582
|
+
```
|
583
|
+
|
584
|
+
Show the modification history of a dashboard, in human-readable
|
585
|
+
form:
|
586
|
+
|
587
|
+
```
|
588
|
+
$ wavefront dashboard history shark-overview
|
589
|
+
25 2016-10-01 16:08:29 +0100 (slackboy@gmail.com)
|
590
|
+
Dashboard Section: Incoming Chart added
|
591
|
+
Chart: swapping events in Section: Memory updated
|
592
|
+
24 2016-10-01 16:06:25 +0100 (slackboy@gmail.com)
|
593
|
+
Chart: swapping events in Section: Memory updated
|
594
|
+
23 2016-10-01 15:35:39 +0100 (slackboy@gmail.com)
|
595
|
+
Chart: SMF services added to Section: System Health
|
596
|
+
Chart: ZFS ARC in Section: ZFS updated
|
597
|
+
22 2016-10-01 15:31:18 +0100 (slackboy@gmail.com)
|
598
|
+
Chart: ZFS ARC in Section: ZFS updated
|
599
|
+
21 2016-10-01 15:30:57 +0100 (slackboy@gmail.com)
|
600
|
+
Dashboard Section: Incoming Chart removed
|
601
|
+
Dashboard Section: Memory added
|
602
|
+
Dashboard Section: Memory added
|
603
|
+
20 2016-10-01 15:30:07 +0100 (slackboy@gmail.com)
|
604
|
+
Chart: swapping events added to Section: Incoming Chart
|
605
|
+
19 2016-10-01 15:25:40 +0100 (slackboy@gmail.com)
|
606
|
+
Dashboard Section: Incoming Chart added
|
607
|
+
Chart: ZFS ARC in Section: ZFS updated
|
608
|
+
...
|
609
|
+
```
|
610
|
+
|
611
|
+
The first column is the version of the dashboard.
|
612
|
+
|
613
|
+
Export a dashboard to a JSON file
|
614
|
+
|
615
|
+
```
|
616
|
+
$ wavefront dashboard export -f json shark-overview >shark_overview.json
|
617
|
+
```
|
618
|
+
|
619
|
+
And import it back in
|
620
|
+
```
|
621
|
+
$ wavefront dashboard import shark_overview.json
|
622
|
+
```
|
623
|
+
|
624
|
+
### Caveats
|
625
|
+
|
626
|
+
It is not currently possible to delete the example dashboards
|
627
|
+
supplied by Wavefront. This is not the fault of the CLI or SDK.
|
628
|
+
|
476
629
|
## Notes on Options
|
477
630
|
|
478
631
|
### Times
|
data/bin/wavefront
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
require 'pathname'
|
18
18
|
|
19
19
|
# uncomment for development
|
20
|
-
$LOAD_PATH.<< Pathname.new(__FILE__).dirname.realpath.parent + 'lib'
|
20
|
+
# $LOAD_PATH.<< Pathname.new(__FILE__).dirname.realpath.parent + 'lib'
|
21
21
|
|
22
22
|
require 'wavefront/client'
|
23
23
|
require 'wavefront/client/version'
|
@@ -87,6 +87,10 @@ alerts: %(
|
|
87
87
|
Usage:
|
88
88
|
#{ME} alerts [-DnV] [-c file] [-P profile] [-E endpoint] [-t token]
|
89
89
|
[-f format] [-p tag] [ -s tag] <state>
|
90
|
+
#{ME} alerts export [-DnV] [-c file] [-P profile] [-E endpoint] [-t token]
|
91
|
+
[-f format] <timestamp>
|
92
|
+
#{ME} alerts import [-DnV] [-c file] [-P profile] [-E endpoint] [-t token]
|
93
|
+
<file>
|
90
94
|
#{global_opts}
|
91
95
|
Options:
|
92
96
|
-E, --endpoint=URI cluster endpoint [#{DEFAULT_OPTS[:endpoint]}]
|
@@ -180,6 +184,38 @@ Options:
|
|
180
184
|
-H, --host=STRING source to manipulate
|
181
185
|
-f, --sourceformat=STRING output format (#{SOURCE_FORMATS.join(', ')}) [#{DEFAULT_OPTS[:sourceformat]}]
|
182
186
|
),
|
187
|
+
dashboard: %(
|
188
|
+
Usage:
|
189
|
+
#{ME} dashboard list [-DnV] [-c file] [-P profile] [-E endpoint]
|
190
|
+
[-t token] [-f format] [-a] [-T tag...] [-p tag...]
|
191
|
+
#{ME} dashboard import [-DnV] [-c file] [-P profile] [-E endpoint]
|
192
|
+
[-t token] [-f format] [-F] <file>
|
193
|
+
#{ME} dashboard export [-DnV] [-c file] [-P profile] [-E endpoint]
|
194
|
+
[-t token] [-f format] [-v version] <dashboard_id>
|
195
|
+
#{ME} dashboard create [-DnV] [-c file] [-P profile] [-E endpoint]
|
196
|
+
[-t token] <dashboard_id> <name>
|
197
|
+
#{ME} dashboard clone [-DnV] [-c file] [-P profile] [-E endpoint]
|
198
|
+
[-t token] [-v version] <source_id> <new_id> <new_name>
|
199
|
+
#{ME} dashboard delete [-DnV] [-c file] [-P profile] [-E endpoint]
|
200
|
+
[-t token] <dashboard_id>
|
201
|
+
#{ME} dashboard undelete [-DnV] [-c file] [-P profile] [-E endpoint]
|
202
|
+
[-t token] <dashboard_id>
|
203
|
+
#{ME} dashboard history [-DnV] [-c file] [-P profile] [-E endpoint]
|
204
|
+
[-t token] [-f format] [-S version] [-L limit] <dashboard_id>
|
205
|
+
#{ME} dashboard --help
|
206
|
+
#{global_opts}
|
207
|
+
Options:
|
208
|
+
-E, --endpoint=URI cluster endpoint [#{DEFAULT_OPTS[:endpoint]}]
|
209
|
+
-t, --token=TOKEN Wavefront authentication token
|
210
|
+
-a, --all in human output mode, list all dashboards
|
211
|
+
-T, --sharedtag=TAG only select dashboards with this shared tag
|
212
|
+
-p, --privatetag=TAG only select dashboards with this private tag
|
213
|
+
-S, --start=VERSION highest version number from which to descend
|
214
|
+
-L, --limit=COUNT number of versions to report
|
215
|
+
-v, --version=INTEGER version of dashboard to clone
|
216
|
+
-F, --force import dashboard even if it already exists
|
217
|
+
-f, --dashformat=STRING output format (#{DASH_FORMATS.join(', ')}) [#{DEFAULT_OPTS[:dashformat]}]
|
218
|
+
),
|
183
219
|
default: %(
|
184
220
|
Wavefront CLI
|
185
221
|
|
@@ -191,6 +227,7 @@ Usage:
|
|
191
227
|
Commands:
|
192
228
|
ts view timeseries data
|
193
229
|
alerts view alerts
|
230
|
+
dashboard view and manage dashboards
|
194
231
|
event open and close events
|
195
232
|
source view and manage source tags and descriptions
|
196
233
|
write send data points to a Wavefront proxy
|
@@ -247,6 +284,9 @@ when :write
|
|
247
284
|
require 'wavefront/cli/write'
|
248
285
|
cli = Wavefront::Cli::Write.new(opts, [opts[:'<state>']])
|
249
286
|
end
|
287
|
+
when :dashboard
|
288
|
+
require 'wavefront/cli/dashboards'
|
289
|
+
cli = Wavefront::Cli::Dashboards.new(opts, [opts[:'<state>']])
|
250
290
|
end
|
251
291
|
|
252
292
|
begin
|
data/lib/wavefront/alerting.rb
CHANGED
@@ -29,7 +29,7 @@ module Wavefront
|
|
29
29
|
include Wavefront::Mixins
|
30
30
|
DEFAULT_PATH = '/api/alert/'
|
31
31
|
|
32
|
-
attr_reader :token, :noop, :verbose, :endpoint
|
32
|
+
attr_reader :token, :noop, :verbose, :endpoint, :headers, :options
|
33
33
|
|
34
34
|
def initialize(token, host = DEFAULT_HOST, debug=false, options = {})
|
35
35
|
#
|
@@ -41,26 +41,108 @@ module Wavefront
|
|
41
41
|
debug(debug)
|
42
42
|
@noop = options[:noop]
|
43
43
|
@verbose = options[:verbose]
|
44
|
+
@options = options
|
45
|
+
end
|
46
|
+
|
47
|
+
def import_to_create(raw)
|
48
|
+
#
|
49
|
+
# Take a previously exported alert, and construct a hash which
|
50
|
+
# create_alert() can use to re-create it.
|
51
|
+
#
|
52
|
+
ret = {
|
53
|
+
name: raw['name'],
|
54
|
+
condition: raw['condition'],
|
55
|
+
minutes: raw['minutes'],
|
56
|
+
notifications: raw['target'].split(','),
|
57
|
+
severity: raw['severity'],
|
58
|
+
}
|
59
|
+
|
60
|
+
if raw.key?('displayExpression')
|
61
|
+
ret[:displayExpression] = raw['displayExpression']
|
62
|
+
end
|
63
|
+
|
64
|
+
if raw.key?('resolveAfterMinutes')
|
65
|
+
ret[:resolveMinutes] = raw['resolveAfterMinutes']
|
66
|
+
end
|
67
|
+
|
68
|
+
if raw.key?('customerTagsWithCounts')
|
69
|
+
ret[:sharedTags] = raw['customerTagsWithCounts'].keys
|
70
|
+
end
|
71
|
+
|
72
|
+
if raw.key?('additionalInformation')
|
73
|
+
ret[:additionalInformation] = raw['additionalInformation']
|
74
|
+
end
|
75
|
+
|
76
|
+
ret
|
77
|
+
end
|
78
|
+
|
79
|
+
def create_alert(alert={})
|
80
|
+
#
|
81
|
+
# Create an alert. Expects you to provide it with a hash of
|
82
|
+
# the form:
|
83
|
+
#
|
84
|
+
# {
|
85
|
+
# name: string
|
86
|
+
# condition: string
|
87
|
+
# displayExpression: string (optional)
|
88
|
+
# minutes: int
|
89
|
+
# resolveMinutes: int (optional)
|
90
|
+
# notifications: array
|
91
|
+
# severity: INFO | SMOKE | WARN | SEVERE
|
92
|
+
# privateTags: array (optional)
|
93
|
+
# sharedTags: array (optional)
|
94
|
+
# additionalInformation string (optional)
|
95
|
+
# }
|
96
|
+
#
|
97
|
+
%w(name condition minutes notifications severity).each do |f|
|
98
|
+
raise "missing field: #{f}" unless alert.key?(f.to_sym)
|
99
|
+
end
|
100
|
+
|
101
|
+
unless %w(INFO SMOKE WARN SEVERE).include?(alert[:severity])
|
102
|
+
raise 'invalid severity'
|
103
|
+
end
|
104
|
+
|
105
|
+
%w(notifications privateTags sharedTags).each do |f|
|
106
|
+
f = f.to_sym
|
107
|
+
alert[f] = alert[f].join(',') if alert[f] && alert[f].is_a?(Array)
|
108
|
+
end
|
109
|
+
|
110
|
+
call_post(create_uri(path: 'create'),
|
111
|
+
hash_to_qs(alert), 'application/x-www-form-urlencoded')
|
112
|
+
end
|
113
|
+
|
114
|
+
def get_alert(id, options = {})
|
115
|
+
#
|
116
|
+
# Alerts are identified by the timestamp at which they were
|
117
|
+
# created. Returns a hash. Exceptions are just passed on
|
118
|
+
# through. You get a 500 if the alert doesn't exist.
|
119
|
+
#
|
120
|
+
resp = call_get(create_uri(path: id)) || '{}'
|
121
|
+
return JSON.parse(resp)
|
44
122
|
end
|
45
123
|
|
46
124
|
def active(options={})
|
47
|
-
|
125
|
+
call_get(create_uri(options.merge(path: 'active',
|
126
|
+
qs: mk_qs(options))))
|
48
127
|
end
|
49
128
|
|
50
129
|
def all(options={})
|
51
|
-
|
130
|
+
call_get(create_uri(options.merge(path: 'all', qs: mk_qs(options))))
|
52
131
|
end
|
53
132
|
|
54
133
|
def invalid(options={})
|
55
|
-
|
134
|
+
call_get(create_uri(options.merge(path: 'invalid',
|
135
|
+
qs: mk_qs(options))))
|
56
136
|
end
|
57
137
|
|
58
138
|
def snoozed(options={})
|
59
|
-
|
139
|
+
call_get(create_uri(options.merge(path: 'snoozed',
|
140
|
+
qs: mk_qs(options))))
|
60
141
|
end
|
61
142
|
|
62
143
|
def affected_by_maintenance(options={})
|
63
|
-
|
144
|
+
call_get(create_uri(options.merge(path: 'affected_by_maintenance',
|
145
|
+
qs: mk_qs(options))))
|
64
146
|
end
|
65
147
|
|
66
148
|
private
|
@@ -70,33 +152,38 @@ module Wavefront
|
|
70
152
|
end
|
71
153
|
|
72
154
|
def mk_qs(options)
|
73
|
-
query =
|
155
|
+
query = []
|
74
156
|
|
75
|
-
|
76
|
-
|
77
|
-
|
157
|
+
if options[:shared_tags]
|
158
|
+
query.push(list_of_tags(options[:shared_tags]).map do |t|
|
159
|
+
"customerTag=#{t}"
|
160
|
+
end.join('&'))
|
161
|
+
end
|
78
162
|
|
79
|
-
|
80
|
-
|
81
|
-
|
163
|
+
if options[:private_tags]
|
164
|
+
query.push(list_of_tags(options[:private_tags]).map do |t|
|
165
|
+
"userTag=#{t}"
|
166
|
+
end.join('&'))
|
167
|
+
end
|
82
168
|
|
83
|
-
query
|
169
|
+
query.join('&')
|
84
170
|
end
|
85
171
|
|
86
|
-
def
|
172
|
+
def create_uri(options = {})
|
173
|
+
#
|
174
|
+
# Build the URI we use to send a 'create' request.
|
175
|
+
#
|
87
176
|
options[:host] ||= endpoint
|
88
|
-
options[:path] ||=
|
177
|
+
options[:path] ||= ''
|
178
|
+
options[:qs] ||= nil
|
179
|
+
|
180
|
+
options[:qs] = nil if options[:qs] && options[:qs].empty?
|
89
181
|
|
90
|
-
|
182
|
+
URI::HTTPS.build(
|
91
183
|
host: options[:host],
|
92
|
-
path: uri_concat(options[:path]
|
93
|
-
|
184
|
+
path: uri_concat(DEFAULT_PATH, options[:path]),
|
185
|
+
query: options[:qs],
|
94
186
|
)
|
95
|
-
|
96
|
-
puts "GET #{uri.to_s}" if (verbose || noop)
|
97
|
-
return if noop
|
98
|
-
|
99
|
-
RestClient.get(uri.to_s)
|
100
187
|
end
|
101
188
|
|
102
189
|
def debug(enabled)
|