wavefront-cli 2.18.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -0
- data/.travis.yml +4 -5
- data/HISTORY.md +20 -1
- data/README.md +79 -29
- data/lib/wavefront-cli/base.rb +26 -2
- data/lib/wavefront-cli/commands/alert.rb +10 -10
- data/lib/wavefront-cli/commands/base.rb +15 -2
- data/lib/wavefront-cli/commands/cloudintegration.rb +3 -3
- data/lib/wavefront-cli/commands/config.rb +2 -1
- data/lib/wavefront-cli/commands/dashboard.rb +8 -6
- data/lib/wavefront-cli/commands/derivedmetric.rb +5 -5
- data/lib/wavefront-cli/commands/event.rb +3 -3
- data/lib/wavefront-cli/commands/integration.rb +5 -5
- data/lib/wavefront-cli/commands/link.rb +3 -3
- data/lib/wavefront-cli/commands/message.rb +2 -2
- data/lib/wavefront-cli/commands/metric.rb +1 -1
- data/lib/wavefront-cli/commands/notificant.rb +3 -3
- data/lib/wavefront-cli/commands/proxy.rb +3 -3
- data/lib/wavefront-cli/commands/query.rb +3 -3
- data/lib/wavefront-cli/commands/savedsearch.rb +3 -3
- data/lib/wavefront-cli/commands/settings.rb +22 -0
- data/lib/wavefront-cli/commands/source.rb +3 -3
- data/lib/wavefront-cli/commands/user.rb +4 -4
- data/lib/wavefront-cli/commands/usergroup.rb +5 -8
- data/lib/wavefront-cli/commands/webhook.rb +3 -3
- data/lib/wavefront-cli/commands/window.rb +3 -3
- data/lib/wavefront-cli/commands/write.rb +6 -4
- data/lib/wavefront-cli/config.rb +14 -0
- data/lib/wavefront-cli/controller.rb +2 -0
- data/lib/wavefront-cli/dashboard.rb +133 -14
- data/lib/wavefront-cli/display/base.rb +28 -7
- data/lib/wavefront-cli/display/dashboard.rb +32 -8
- data/lib/wavefront-cli/display/distribution.rb +4 -1
- data/lib/wavefront-cli/display/printer/long.rb +149 -140
- data/lib/wavefront-cli/display/printer/terse.rb +19 -42
- data/lib/wavefront-cli/display/query.rb +6 -0
- data/lib/wavefront-cli/display/settings.rb +21 -0
- data/lib/wavefront-cli/display/write.rb +12 -5
- data/lib/wavefront-cli/event.rb +1 -1
- data/lib/wavefront-cli/exception.rb +1 -0
- data/lib/wavefront-cli/settings.rb +37 -0
- data/lib/wavefront-cli/stdlib/array.rb +20 -0
- data/lib/wavefront-cli/stdlib/string.rb +8 -0
- data/lib/wavefront-cli/user.rb +1 -1
- data/lib/wavefront-cli/version.rb +1 -1
- data/lib/wavefront-cli/write.rb +310 -10
- data/spec/.rubocop.yml +3 -0
- data/spec/spec_helper.rb +81 -1
- data/spec/wavefront-cli/alert_spec.rb +1 -0
- data/spec/wavefront-cli/cloudintegration_spec.rb +1 -0
- data/spec/wavefront-cli/dashboard_spec.rb +47 -4
- data/spec/wavefront-cli/derivedmetric_spec.rb +1 -0
- data/spec/wavefront-cli/display/base_spec.rb +16 -9
- data/spec/wavefront-cli/display/printer/long_spec.rb +75 -106
- data/spec/wavefront-cli/display/printer/terse_spec.rb +33 -21
- data/spec/wavefront-cli/event_spec.rb +1 -0
- data/spec/wavefront-cli/externallink_spec.rb +1 -0
- data/spec/wavefront-cli/integration_spec.rb +1 -0
- data/spec/wavefront-cli/maintenancewindow_spec.rb +1 -0
- data/spec/wavefront-cli/proxy_spec.rb +2 -0
- data/spec/wavefront-cli/query_spec.rb +9 -0
- data/spec/wavefront-cli/resources/display/alert-human-long +24 -0
- data/spec/wavefront-cli/resources/display/alert-input.json +37 -0
- data/spec/wavefront-cli/resources/display/alerts-human-terse +9 -0
- data/spec/wavefront-cli/resources/display/alerts-input.json +1 -0
- data/spec/wavefront-cli/resources/display/user-human-long +19 -0
- data/spec/wavefront-cli/resources/display/user-human-long-no_sep +18 -0
- data/spec/wavefront-cli/resources/display/user-input.json +1 -0
- data/spec/wavefront-cli/resources/responses/README.md +2 -0
- data/spec/wavefront-cli/resources/responses/alert-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/backups.json +1 -0
- data/spec/wavefront-cli/resources/responses/cloudintegration-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/dashboard-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/derivedmetric-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/event-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/integration-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/link-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/notificant-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/proxy-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/query-cpu.json +1 -0
- data/spec/wavefront-cli/resources/responses/savedsearch-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/user-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/usergroup-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/webhook-list.json +1 -0
- data/spec/wavefront-cli/resources/responses/window-list.json +1 -0
- data/spec/wavefront-cli/savedsearch_spec.rb +1 -0
- data/spec/wavefront-cli/settings_spec.rb +19 -0
- data/spec/wavefront-cli/stdlib/array_spec.rb +20 -0
- data/spec/wavefront-cli/stdlib/string_spec.rb +13 -1
- data/spec/wavefront-cli/user_spec.rb +1 -0
- data/spec/wavefront-cli/usergroup_spec.rb +1 -0
- data/spec/wavefront-cli/webhook_spec.rb +1 -0
- data/spec/wavefront-cli/write_spec.rb +167 -0
- data/wavefront-cli.gemspec +3 -4
- metadata +65 -31
- data/.gitlab-ci.yml +0 -16
- data/lib/wavefront-cli/base_write.rb +0 -298
- data/lib/wavefront-cli/commands/report.rb +0 -37
- data/lib/wavefront-cli/display/printer/base.rb +0 -24
- data/lib/wavefront-cli/display/report.rb +0 -17
- data/lib/wavefront-cli/report.rb +0 -18
- data/spec/wavefront-cli/display/printer/base_spec.rb +0 -20
data/wavefront-cli.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.description = 'CLI for Wavefront (wavefront.com) API v2 '
|
13
13
|
|
14
14
|
gem.authors = ['Robert Fisher']
|
15
|
-
gem.email = '
|
15
|
+
gem.email = 'services@id264.net'
|
16
16
|
gem.homepage = 'https://github.com/snltd/wavefront-cli'
|
17
17
|
gem.license = 'BSD-2-Clause'
|
18
18
|
|
@@ -24,9 +24,8 @@ Gem::Specification.new do |gem|
|
|
24
24
|
|
25
25
|
gem.add_runtime_dependency 'docopt', '~> 0.6.0'
|
26
26
|
gem.add_runtime_dependency 'inifile', '~> 3.0'
|
27
|
-
gem.add_runtime_dependency 'wavefront-sdk', '~>
|
27
|
+
gem.add_runtime_dependency 'wavefront-sdk', '~> 3.0', '>= 3.0.0'
|
28
28
|
|
29
|
-
gem.add_development_dependency 'bundler', '~> 1.3'
|
30
29
|
gem.add_development_dependency 'minitest', '~> 5.11', '>= 5.11.0'
|
31
30
|
gem.add_development_dependency 'rake', '~> 12.0'
|
32
31
|
gem.add_development_dependency 'rubocop', '~> 0.54.0'
|
@@ -34,5 +33,5 @@ Gem::Specification.new do |gem|
|
|
34
33
|
gem.add_development_dependency 'webmock', '~> 3.0'
|
35
34
|
gem.add_development_dependency 'yard', '~> 0.9.5'
|
36
35
|
|
37
|
-
gem.required_ruby_version = Gem::Requirement.new('>= 2.
|
36
|
+
gem.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
38
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wavefront-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Fisher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -44,34 +44,20 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 3.0.0
|
48
48
|
- - "~>"
|
49
49
|
- !ruby/object:Gem::Version
|
50
|
-
version: '
|
50
|
+
version: '3.0'
|
51
51
|
type: :runtime
|
52
52
|
prerelease: false
|
53
53
|
version_requirements: !ruby/object:Gem::Requirement
|
54
54
|
requirements:
|
55
55
|
- - ">="
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
57
|
+
version: 3.0.0
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: bundler
|
63
|
-
requirement: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - "~>"
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '1.3'
|
68
|
-
type: :development
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - "~>"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '1.3'
|
60
|
+
version: '3.0'
|
75
61
|
- !ruby/object:Gem::Dependency
|
76
62
|
name: minitest
|
77
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -163,7 +149,7 @@ dependencies:
|
|
163
149
|
- !ruby/object:Gem::Version
|
164
150
|
version: 0.9.5
|
165
151
|
description: 'CLI for Wavefront (wavefront.com) API v2 '
|
166
|
-
email:
|
152
|
+
email: services@id264.net
|
167
153
|
executables:
|
168
154
|
- wf
|
169
155
|
extensions: []
|
@@ -171,7 +157,6 @@ extra_rdoc_files: []
|
|
171
157
|
files:
|
172
158
|
- ".codeclimate.yml"
|
173
159
|
- ".gitignore"
|
174
|
-
- ".gitlab-ci.yml"
|
175
160
|
- ".rubocop.yml"
|
176
161
|
- ".travis.yml"
|
177
162
|
- Gemfile
|
@@ -182,7 +167,6 @@ files:
|
|
182
167
|
- bin/wf
|
183
168
|
- lib/wavefront-cli/alert.rb
|
184
169
|
- lib/wavefront-cli/base.rb
|
185
|
-
- lib/wavefront-cli/base_write.rb
|
186
170
|
- lib/wavefront-cli/cloudintegration.rb
|
187
171
|
- lib/wavefront-cli/commands/.rubocop.yml
|
188
172
|
- lib/wavefront-cli/commands/alert.rb
|
@@ -199,8 +183,8 @@ files:
|
|
199
183
|
- lib/wavefront-cli/commands/notificant.rb
|
200
184
|
- lib/wavefront-cli/commands/proxy.rb
|
201
185
|
- lib/wavefront-cli/commands/query.rb
|
202
|
-
- lib/wavefront-cli/commands/report.rb
|
203
186
|
- lib/wavefront-cli/commands/savedsearch.rb
|
187
|
+
- lib/wavefront-cli/commands/settings.rb
|
204
188
|
- lib/wavefront-cli/commands/source.rb
|
205
189
|
- lib/wavefront-cli/commands/user.rb
|
206
190
|
- lib/wavefront-cli/commands/usergroup.rb
|
@@ -225,14 +209,13 @@ files:
|
|
225
209
|
- lib/wavefront-cli/display/message.rb
|
226
210
|
- lib/wavefront-cli/display/metric.rb
|
227
211
|
- lib/wavefront-cli/display/notificant.rb
|
228
|
-
- lib/wavefront-cli/display/printer/base.rb
|
229
212
|
- lib/wavefront-cli/display/printer/long.rb
|
230
213
|
- lib/wavefront-cli/display/printer/sparkline.rb
|
231
214
|
- lib/wavefront-cli/display/printer/terse.rb
|
232
215
|
- lib/wavefront-cli/display/proxy.rb
|
233
216
|
- lib/wavefront-cli/display/query.rb
|
234
|
-
- lib/wavefront-cli/display/report.rb
|
235
217
|
- lib/wavefront-cli/display/savedsearch.rb
|
218
|
+
- lib/wavefront-cli/display/settings.rb
|
236
219
|
- lib/wavefront-cli/display/source.rb
|
237
220
|
- lib/wavefront-cli/display/user.rb
|
238
221
|
- lib/wavefront-cli/display/usergroup.rb
|
@@ -265,9 +248,10 @@ files:
|
|
265
248
|
- lib/wavefront-cli/output/yaml.rb
|
266
249
|
- lib/wavefront-cli/proxy.rb
|
267
250
|
- lib/wavefront-cli/query.rb
|
268
|
-
- lib/wavefront-cli/report.rb
|
269
251
|
- lib/wavefront-cli/savedsearch.rb
|
252
|
+
- lib/wavefront-cli/settings.rb
|
270
253
|
- lib/wavefront-cli/source.rb
|
254
|
+
- lib/wavefront-cli/stdlib/array.rb
|
271
255
|
- lib/wavefront-cli/stdlib/string.rb
|
272
256
|
- lib/wavefront-cli/user.rb
|
273
257
|
- lib/wavefront-cli/usergroup.rb
|
@@ -300,7 +284,6 @@ files:
|
|
300
284
|
- spec/wavefront-cli/dashboard_spec.rb
|
301
285
|
- spec/wavefront-cli/derivedmetric_spec.rb
|
302
286
|
- spec/wavefront-cli/display/base_spec.rb
|
303
|
-
- spec/wavefront-cli/display/printer/base_spec.rb
|
304
287
|
- spec/wavefront-cli/display/printer/long_spec.rb
|
305
288
|
- spec/wavefront-cli/display/printer/terse_spec.rb
|
306
289
|
- spec/wavefront-cli/display/spec_helper.rb
|
@@ -321,11 +304,37 @@ files:
|
|
321
304
|
- spec/wavefront-cli/output/yaml_spec.rb
|
322
305
|
- spec/wavefront-cli/proxy_spec.rb
|
323
306
|
- spec/wavefront-cli/query_spec.rb
|
307
|
+
- spec/wavefront-cli/resources/display/alert-human-long
|
308
|
+
- spec/wavefront-cli/resources/display/alert-input.json
|
309
|
+
- spec/wavefront-cli/resources/display/alerts-human-terse
|
310
|
+
- spec/wavefront-cli/resources/display/alerts-input.json
|
311
|
+
- spec/wavefront-cli/resources/display/user-human-long
|
312
|
+
- spec/wavefront-cli/resources/display/user-human-long-no_sep
|
313
|
+
- spec/wavefront-cli/resources/display/user-input.json
|
314
|
+
- spec/wavefront-cli/resources/responses/README.md
|
315
|
+
- spec/wavefront-cli/resources/responses/alert-list.json
|
316
|
+
- spec/wavefront-cli/resources/responses/backups.json
|
317
|
+
- spec/wavefront-cli/resources/responses/cloudintegration-list.json
|
318
|
+
- spec/wavefront-cli/resources/responses/dashboard-list.json
|
319
|
+
- spec/wavefront-cli/resources/responses/derivedmetric-list.json
|
320
|
+
- spec/wavefront-cli/resources/responses/event-list.json
|
321
|
+
- spec/wavefront-cli/resources/responses/integration-list.json
|
322
|
+
- spec/wavefront-cli/resources/responses/link-list.json
|
323
|
+
- spec/wavefront-cli/resources/responses/notificant-list.json
|
324
|
+
- spec/wavefront-cli/resources/responses/proxy-list.json
|
325
|
+
- spec/wavefront-cli/resources/responses/query-cpu.json
|
326
|
+
- spec/wavefront-cli/resources/responses/savedsearch-list.json
|
327
|
+
- spec/wavefront-cli/resources/responses/user-list.json
|
328
|
+
- spec/wavefront-cli/resources/responses/usergroup-list.json
|
329
|
+
- spec/wavefront-cli/resources/responses/webhook-list.json
|
330
|
+
- spec/wavefront-cli/resources/responses/window-list.json
|
324
331
|
- spec/wavefront-cli/resources/sample_query_response.json
|
325
332
|
- spec/wavefront-cli/resources/sample_raw_query_response.json
|
326
333
|
- spec/wavefront-cli/resources/wavefront.conf
|
327
334
|
- spec/wavefront-cli/savedsearch_spec.rb
|
335
|
+
- spec/wavefront-cli/settings_spec.rb
|
328
336
|
- spec/wavefront-cli/source_spec.rb
|
337
|
+
- spec/wavefront-cli/stdlib/array_spec.rb
|
329
338
|
- spec/wavefront-cli/stdlib/string_spec.rb
|
330
339
|
- spec/wavefront-cli/user_spec.rb
|
331
340
|
- spec/wavefront-cli/usergroup_spec.rb
|
@@ -344,14 +353,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
344
353
|
requirements:
|
345
354
|
- - ">="
|
346
355
|
- !ruby/object:Gem::Version
|
347
|
-
version: 2.
|
356
|
+
version: 2.3.0
|
348
357
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
349
358
|
requirements:
|
350
359
|
- - ">="
|
351
360
|
- !ruby/object:Gem::Version
|
352
361
|
version: '0'
|
353
362
|
requirements: []
|
354
|
-
rubygems_version: 3.0.
|
363
|
+
rubygems_version: 3.0.3
|
355
364
|
signing_key:
|
356
365
|
specification_version: 4
|
357
366
|
summary: CLI for Wavefront API v2
|
@@ -382,7 +391,6 @@ test_files:
|
|
382
391
|
- spec/wavefront-cli/dashboard_spec.rb
|
383
392
|
- spec/wavefront-cli/derivedmetric_spec.rb
|
384
393
|
- spec/wavefront-cli/display/base_spec.rb
|
385
|
-
- spec/wavefront-cli/display/printer/base_spec.rb
|
386
394
|
- spec/wavefront-cli/display/printer/long_spec.rb
|
387
395
|
- spec/wavefront-cli/display/printer/terse_spec.rb
|
388
396
|
- spec/wavefront-cli/display/spec_helper.rb
|
@@ -403,11 +411,37 @@ test_files:
|
|
403
411
|
- spec/wavefront-cli/output/yaml_spec.rb
|
404
412
|
- spec/wavefront-cli/proxy_spec.rb
|
405
413
|
- spec/wavefront-cli/query_spec.rb
|
414
|
+
- spec/wavefront-cli/resources/display/alert-human-long
|
415
|
+
- spec/wavefront-cli/resources/display/alert-input.json
|
416
|
+
- spec/wavefront-cli/resources/display/alerts-human-terse
|
417
|
+
- spec/wavefront-cli/resources/display/alerts-input.json
|
418
|
+
- spec/wavefront-cli/resources/display/user-human-long
|
419
|
+
- spec/wavefront-cli/resources/display/user-human-long-no_sep
|
420
|
+
- spec/wavefront-cli/resources/display/user-input.json
|
421
|
+
- spec/wavefront-cli/resources/responses/README.md
|
422
|
+
- spec/wavefront-cli/resources/responses/alert-list.json
|
423
|
+
- spec/wavefront-cli/resources/responses/backups.json
|
424
|
+
- spec/wavefront-cli/resources/responses/cloudintegration-list.json
|
425
|
+
- spec/wavefront-cli/resources/responses/dashboard-list.json
|
426
|
+
- spec/wavefront-cli/resources/responses/derivedmetric-list.json
|
427
|
+
- spec/wavefront-cli/resources/responses/event-list.json
|
428
|
+
- spec/wavefront-cli/resources/responses/integration-list.json
|
429
|
+
- spec/wavefront-cli/resources/responses/link-list.json
|
430
|
+
- spec/wavefront-cli/resources/responses/notificant-list.json
|
431
|
+
- spec/wavefront-cli/resources/responses/proxy-list.json
|
432
|
+
- spec/wavefront-cli/resources/responses/query-cpu.json
|
433
|
+
- spec/wavefront-cli/resources/responses/savedsearch-list.json
|
434
|
+
- spec/wavefront-cli/resources/responses/user-list.json
|
435
|
+
- spec/wavefront-cli/resources/responses/usergroup-list.json
|
436
|
+
- spec/wavefront-cli/resources/responses/webhook-list.json
|
437
|
+
- spec/wavefront-cli/resources/responses/window-list.json
|
406
438
|
- spec/wavefront-cli/resources/sample_query_response.json
|
407
439
|
- spec/wavefront-cli/resources/sample_raw_query_response.json
|
408
440
|
- spec/wavefront-cli/resources/wavefront.conf
|
409
441
|
- spec/wavefront-cli/savedsearch_spec.rb
|
442
|
+
- spec/wavefront-cli/settings_spec.rb
|
410
443
|
- spec/wavefront-cli/source_spec.rb
|
444
|
+
- spec/wavefront-cli/stdlib/array_spec.rb
|
411
445
|
- spec/wavefront-cli/stdlib/string_spec.rb
|
412
446
|
- spec/wavefront-cli/user_spec.rb
|
413
447
|
- spec/wavefront-cli/usergroup_spec.rb
|
data/.gitlab-ci.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
dependency_scanning:
|
2
|
-
image: docker:stable
|
3
|
-
variables:
|
4
|
-
DOCKER_DRIVER: overlay2
|
5
|
-
allow_failure: true
|
6
|
-
services:
|
7
|
-
- docker:stable-dind
|
8
|
-
script:
|
9
|
-
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
|
10
|
-
- docker run
|
11
|
-
--env DEP_SCAN_DISABLE_REMOTE_CHECKS="${DEP_SCAN_DISABLE_REMOTE_CHECKS:-false}"
|
12
|
-
--volume "$PWD:/code"
|
13
|
-
--volume /var/run/docker.sock:/var/run/docker.sock
|
14
|
-
"registry.gitlab.com/gitlab-org/security-products/dependency-scanning:$SP_VERSION" /code
|
15
|
-
artifacts:
|
16
|
-
paths: [gl-dependency-scanning-report.json]
|
@@ -1,298 +0,0 @@
|
|
1
|
-
require 'wavefront-sdk/support/mixins'
|
2
|
-
require_relative 'base'
|
3
|
-
|
4
|
-
module WavefrontCli
|
5
|
-
#
|
6
|
-
# Send points to a proxy.
|
7
|
-
#
|
8
|
-
class BaseWrite < Base
|
9
|
-
attr_reader :fmt
|
10
|
-
include Wavefront::Mixins
|
11
|
-
|
12
|
-
# rubocop:disable Metrics/AbcSize
|
13
|
-
def do_point
|
14
|
-
p = { path: options[:'<metric>'],
|
15
|
-
value: options[:'<value>'].delete('\\').to_f,
|
16
|
-
tags: tags_to_hash(options[:tag]) }
|
17
|
-
|
18
|
-
p[:source] = options[:host] if options[:host]
|
19
|
-
p[:ts] = parse_time(options[:time]) if options[:time]
|
20
|
-
send_point(p)
|
21
|
-
end
|
22
|
-
# rubocop:enable Metrics/AbcSize
|
23
|
-
|
24
|
-
def send_point(point)
|
25
|
-
call_write(point)
|
26
|
-
rescue Wavefront::Exception::InvalidEndpoint
|
27
|
-
abort format("Could not connect to proxy '%s:%s'.",
|
28
|
-
options[:proxy], options[:port])
|
29
|
-
end
|
30
|
-
|
31
|
-
def do_file
|
32
|
-
valid_format?(options[:infileformat])
|
33
|
-
setup_fmt(options[:infileformat] || 'tmv')
|
34
|
-
process_input(options[:'<file>'])
|
35
|
-
end
|
36
|
-
|
37
|
-
# Read the input, from a file or from STDIN, and turn each line
|
38
|
-
# into Wavefront points.
|
39
|
-
#
|
40
|
-
def process_input(file)
|
41
|
-
if file == '-'
|
42
|
-
read_stdin
|
43
|
-
else
|
44
|
-
data = process_input_file(load_data(Pathname.new(file)).split("\n"))
|
45
|
-
call_write(data)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def process_input_file(data)
|
50
|
-
data.each_with_object([]) do |l, a|
|
51
|
-
begin
|
52
|
-
a.<< process_line(l)
|
53
|
-
rescue WavefrontCli::Exception::UnparseableInput => e
|
54
|
-
puts "Bad input. #{e.message}."
|
55
|
-
next
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# A wrapper which lets us send normal points, deltas, or
|
61
|
-
# distributions
|
62
|
-
#
|
63
|
-
def call_write(data, openclose = true)
|
64
|
-
if options[:delta]
|
65
|
-
wf.write_delta(data, openclose)
|
66
|
-
else
|
67
|
-
wf.write(data, openclose)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# Read from standard in and stream points through an open
|
72
|
-
# socket. If the user hits ctrl-c, close the socket and exit
|
73
|
-
# politely.
|
74
|
-
#
|
75
|
-
def read_stdin
|
76
|
-
open_connection
|
77
|
-
STDIN.each_line { |l| call_write(process_line(l.strip), false) }
|
78
|
-
close_connection
|
79
|
-
rescue SystemExit, Interrupt
|
80
|
-
puts 'ctrl-c. Exiting.'
|
81
|
-
wf.close
|
82
|
-
exit 0
|
83
|
-
end
|
84
|
-
|
85
|
-
# Find and return the value in a chunked line of input
|
86
|
-
#
|
87
|
-
# param chunks [Array] a chunked line of input from #process_line
|
88
|
-
# return [Float] the value
|
89
|
-
# raise TypeError if field does not exist
|
90
|
-
# raise Wavefront::Exception::InvalidValue if it's not a value
|
91
|
-
#
|
92
|
-
def extract_value(chunks)
|
93
|
-
if fmt.include?('v')
|
94
|
-
v = chunks[fmt.index('v')]
|
95
|
-
v.to_f
|
96
|
-
else
|
97
|
-
raw = chunks[fmt.index('d')].split(',')
|
98
|
-
xpanded = expand_dist(raw)
|
99
|
-
wf.mk_distribution(xpanded)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# We will let users write a distribution as '1 1 1' or '3x1' or
|
104
|
-
# even a mix of the two
|
105
|
-
#
|
106
|
-
def expand_dist(dist)
|
107
|
-
dist.map do |v|
|
108
|
-
if v.is_a?(String) && v.include?('x')
|
109
|
-
x, val = v.split('x', 2)
|
110
|
-
Array.new(x.to_i, val.to_f)
|
111
|
-
else
|
112
|
-
v.to_f
|
113
|
-
end
|
114
|
-
end.flatten
|
115
|
-
end
|
116
|
-
|
117
|
-
# Find and return the source in a chunked line of input.
|
118
|
-
#
|
119
|
-
# @param chunks [Array] a chunked line of input from #process_line
|
120
|
-
# @return [Float] the timestamp, if it is there, or the current
|
121
|
-
# UTC time if it is not.
|
122
|
-
#
|
123
|
-
def extract_ts(chunks)
|
124
|
-
ts = chunks[fmt.index('t')]
|
125
|
-
return parse_time(ts) if valid_timestamp?(ts)
|
126
|
-
rescue TypeError
|
127
|
-
Time.now.utc.to_i
|
128
|
-
end
|
129
|
-
|
130
|
-
def extract_tags(chunks)
|
131
|
-
tags_to_hash(chunks.last.split(/\s(?=(?:[^"]|"[^"]*")*$)/))
|
132
|
-
end
|
133
|
-
|
134
|
-
# Find and return the metric path in a chunked line of input.
|
135
|
-
# The path can be in the data, or passed as an option, or both.
|
136
|
-
# If the latter, then we assume the option is a prefix, and
|
137
|
-
# concatenate the value in the data.
|
138
|
-
#
|
139
|
-
# param chunks [Array] a chunked line of input from #process_line
|
140
|
-
# return [String] the metric path
|
141
|
-
# raise TypeError if field does not exist
|
142
|
-
#
|
143
|
-
def extract_path(chunks)
|
144
|
-
m = chunks[fmt.index('m')]
|
145
|
-
options[:metric] ? [options[:metric], m].join('.') : m
|
146
|
-
rescue TypeError
|
147
|
-
return options[:metric] if options[:metric]
|
148
|
-
raise
|
149
|
-
end
|
150
|
-
|
151
|
-
# Find and return the source in a chunked line of input.
|
152
|
-
#
|
153
|
-
# param chunks [Array] a chunked line of input from #process_line
|
154
|
-
# return [String] the source, if it is there, or if not, the
|
155
|
-
# value passed through by -H, or the local hostname.
|
156
|
-
#
|
157
|
-
def extract_source(chunks)
|
158
|
-
chunks[fmt.index('s')]
|
159
|
-
rescue TypeError
|
160
|
-
options[:source] || Socket.gethostname
|
161
|
-
end
|
162
|
-
|
163
|
-
# Process a line of input, as described by the format string
|
164
|
-
# held in @fmt. Produces a hash suitable for the SDK to send on.
|
165
|
-
#
|
166
|
-
# We let the user define most of the fields, but anything beyond
|
167
|
-
# what they define is always assumed to be point tags. This is
|
168
|
-
# because you can have arbitrarily many of those for each point.
|
169
|
-
#
|
170
|
-
# @raise WavefrontCli::Exception::UnparseableInput if the line
|
171
|
-
# doesn't look right
|
172
|
-
#
|
173
|
-
# rubocop:disable Metrics/AbcSize
|
174
|
-
# rubocop:disable Metrics/MethodLength
|
175
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
176
|
-
def process_line(line)
|
177
|
-
return true if line.empty?
|
178
|
-
chunks = line.split(/\s+/, fmt.length)
|
179
|
-
enough_fields?(line) # can raise exception
|
180
|
-
|
181
|
-
begin
|
182
|
-
point = { path: extract_path(chunks),
|
183
|
-
tags: line_tags(chunks),
|
184
|
-
value: extract_value(chunks) }
|
185
|
-
|
186
|
-
point[:ts] = extract_ts(chunks) if fmt.include?('t')
|
187
|
-
point[:source] = extract_source(chunks) if fmt.include?('s')
|
188
|
-
point[:interval] = options[:interval] || 'm' if fmt.include?('d')
|
189
|
-
rescue TypeError
|
190
|
-
raise(WavefrontCli::Exception::UnparseableInput,
|
191
|
-
"could not process #{line}")
|
192
|
-
end
|
193
|
-
|
194
|
-
point
|
195
|
-
end
|
196
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
197
|
-
# rubocop:enable Metrics/MethodLength
|
198
|
-
# rubocop:enable Metrics/AbcSize
|
199
|
-
|
200
|
-
# We can get tags from the file, from the -T option, or both.
|
201
|
-
# Merge them, making the -T win if there is a collision.
|
202
|
-
#
|
203
|
-
def line_tags(chunks)
|
204
|
-
file_tags = fmt.last == 'T' ? extract_tags(chunks) : {}
|
205
|
-
opt_tags = tags_to_hash(options[:tag])
|
206
|
-
file_tags.merge(opt_tags)
|
207
|
-
end
|
208
|
-
|
209
|
-
# Takes an array of key=value tags (as produced by docopt) and
|
210
|
-
# turns it into a hash of key: value tags. Anything not of the
|
211
|
-
# form key=val is dropped. If key or value are quoted, we
|
212
|
-
# remove the quotes.
|
213
|
-
#
|
214
|
-
# @param tags [Array]
|
215
|
-
# return Hash
|
216
|
-
#
|
217
|
-
def tags_to_hash(tags)
|
218
|
-
return nil unless tags
|
219
|
-
|
220
|
-
[tags].flatten.each_with_object({}) do |t, ret|
|
221
|
-
k, v = t.split('=', 2)
|
222
|
-
k.gsub!(/^["']|["']$/, '')
|
223
|
-
ret[k] = v.to_s.gsub(/^["']|["']$/, '') if v
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
# The format string must contain values. They can be single
|
228
|
-
# values or distributions. So we must have 'v' xor 'd'. It must
|
229
|
-
# not contain anything other than 'm', 't', 'T', 's', 'd', or
|
230
|
-
# 'v', and the 'T', if there, must be at the end. No letter must
|
231
|
-
# appear more than once.
|
232
|
-
#
|
233
|
-
# @param fmt [String] format of input file
|
234
|
-
#
|
235
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
236
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
237
|
-
# rubocop:disable Metrics/AbcSize
|
238
|
-
def valid_format?(fmt)
|
239
|
-
err = if fmt.include?('v') && fmt.include?('d')
|
240
|
-
"'v' and 'd' are mutually exclusive"
|
241
|
-
elsif !fmt.include?('v') && !fmt.include?('d')
|
242
|
-
"format string must include 'v' or 'd'"
|
243
|
-
elsif !fmt.match(/^[dmstTv]+$/)
|
244
|
-
'unsupported field in format string'
|
245
|
-
elsif !fmt == fmt.split('').uniq.join
|
246
|
-
'repeated field in format string'
|
247
|
-
elsif fmt.include?('T') && !fmt.end_with?('T')
|
248
|
-
"if used, 'T' must come at end of format string"
|
249
|
-
end
|
250
|
-
|
251
|
-
return true if err.nil?
|
252
|
-
|
253
|
-
raise(WavefrontCli::Exception::UnparseableInput, err)
|
254
|
-
end
|
255
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
256
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
257
|
-
# rubocop:enable Metrics/AbcSize
|
258
|
-
|
259
|
-
# Make sure we have the right number of columns, according to
|
260
|
-
# the format string. We want to take every precaution we can to
|
261
|
-
# stop users accidentally polluting their metric namespace with
|
262
|
-
# junk.
|
263
|
-
#
|
264
|
-
# If the format string says we are expecting point tags, we
|
265
|
-
# may have more columns than the length of the format string.
|
266
|
-
#
|
267
|
-
def enough_fields?(line)
|
268
|
-
ncols = line.split.length
|
269
|
-
return true if fmt.include?('T') && ncols >= fmt.length
|
270
|
-
return true if ncols == fmt.length
|
271
|
-
raise(WavefrontCli::Exception::UnparseableInput,
|
272
|
-
format('Expected %s fields, got %s', fmt.length, ncols))
|
273
|
-
end
|
274
|
-
|
275
|
-
# Although the SDK does value checking, we'll add another layer
|
276
|
-
# of input checing here. See if the time looks valid. We'll
|
277
|
-
# assume anything before 2000/01/01 or after a year from now is
|
278
|
-
# wrong. Arbitrary, but there has to be a cut-off somewhere.
|
279
|
-
#
|
280
|
-
def valid_timestamp?(timestamp)
|
281
|
-
(timestamp.is_a?(Integer) || timestamp.match(/^\d+$/)) &&
|
282
|
-
timestamp.to_i > 946_684_800 &&
|
283
|
-
timestamp.to_i < (Time.now.to_i + 31_557_600)
|
284
|
-
end
|
285
|
-
|
286
|
-
private
|
287
|
-
|
288
|
-
def setup_fmt(fmt)
|
289
|
-
@fmt = fmt.split('')
|
290
|
-
end
|
291
|
-
|
292
|
-
def load_data(file)
|
293
|
-
IO.read(file)
|
294
|
-
rescue StandardError
|
295
|
-
raise WavefrontCli::Exception::FileNotFound
|
296
|
-
end
|
297
|
-
end
|
298
|
-
end
|