wavefront-client 3.5.4 → 3.6.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/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)
         
     |