Datadog API をイイカンジに叩く為に Dogshell を使う

## まえがき

Datadog を運用していると、CLI でイイカンジにガッと API を叩きたいなーという気持ちになる時があります。
例えば、特定のメトリクスに依存している Monitor が存在しないかをさっくり調査したい、とか。
どうやら Datadog は [Dogshell](https://github.com/DataDog/datadogpy/tree/master/datadog/dogshell) という CLI ツールを公式で用意してくれているようです、やりましたね！ 使っていきましょう！

## 環境

```shell-session
$ python --version
Python 3.6.4
$ pip --version
pip 18.0
```

Python 2.7系 でも動いたので、バージョンはあまり気にしなくても良さそうです。

## インストール

pip でいけます。

```shell-session
$ pip install datadog
```

色々出る。

```
$ dog -v
dog 0.22.0
```

やりましたね！！！

## 使う

[Dogshell のユーザガイド](https://help.datadoghq.com/hc/en-us/articles/211364766-Dogshell-Quickly-Use-Datadog-s-API-from-Terminal-Shell)を流し見すると、以下のコマンドが使えそうです。

```
dog metric
dog event
dog status_check
dog monitor
dog downtime
dog timeboard
dog screenboard
dog host
dog tag
dog search
dog comment
```

Datadog の画面を普段から見ている人なら、ふんふん、なるほど、と、何が出来そうかざっくり想像出来ると思います。

### 設定

早速使っていきたいところですが、 Dogshell を使うには API Key と Application Key などの Config 設定が必要です。
https://app.datadoghq.com/account/settings#api で API Key と Application Key を発行しておきましょう。
AWS CLI みたいに `dog config` 的な対話的な何かが用意されている気がするんですが、されていません( `dog  [--config CONFIG]` というオプションは存在するようですが、こう、やっぱり対話的に全部のコンフィグを一発で設定したいですよね？)。
なので、ここはいきなりコマンドを叩きます。 put 系の操作を行って何か問題が起こっても嫌なので、参照系のコマンドを適当に先述のコマンド一覧から探しましょう。

```shell-session
$ dog metric --help
usage: dog metric [-h] {post} ...

optional arguments:
  -h, --help  show this help message and exit

Verbs:
  {post}
    post      Post metrics
```

`post` しかなくて駄目そう！！！！

```shell-session
$ dog event --help
usage: dog event [-h] {post,show,stream} ...

optional arguments:
  -h, --help          show this help message and exit

Verbs:
  {post,show,stream}
    post              Post events.
    show              Show event details.
    stream            Retrieve events from the Event Stream
```

`show` は良さげですね。適当に実行しましょう。すると、 `~/.dogrc` が存在しない場合は対話的に Config を要求されます。
`~/.dogrc` に Config を作る為に、先述の API Key と Application Key を訊かれるので、入力しましょう。

```shell-session
$ dog event show foo
/Users/hieki/.dogrc does not exist. Would you like to create it? [Y/n] Y
What is your api key? (Get it here: https://app.datadoghq.com/account/settings#api)xxxxxxxxxxxxxxxxxxxx
What is your application key? (Generate one here: https://app.datadoghq.com/account/settings#api) xxxxxxxxxxxxxxxxxxxx
Wrote /Users/hieki/.dogrc
```

`~/.dogrc` は作成されましたが、 `foo` という event は存在しないので、怒られます。

```
ERROR: ERROR: No event matches that event_id.
```

config の設定はこれで :ok: です。

### 試してみる

ひとまず私が調査したかったのは、最近利用を停止することになった NewRelic のメトリクスを使っている Datadog Monitor が存在しないか、という点でした。 `dog monitor` コマンドを使えば良さそうな気配がありますね。help を見てみましょう。


```shell-session
$ dog monitor --help
usage: dog monitor [-h] [--string_ids]
                   {post,update,show,show_all,delete,mute_all,unmute_all,mute,unmute}
                   ...

optional arguments:
  -h, --help            show this help message and exit
  --string_ids          Represent monitor IDs as strings instead of ints in
                        JSON

Verbs:
  {post,update,show,show_all,delete,mute_all,unmute_all,mute,unmute}
    post                Create a monitor
    update              Update existing monitor
    show                Show a monitor definition
    show_all            Show a list of all monitors
    delete              Delete a monitor
    mute_all            Globally mute monitors (downtime over *)
    unmute_all          Globally unmute monitors (cancel downtime over *)
    mute                Mute a monitor
    unmute              Unmute a monitor
```

`show_all`！！！ これこれ！！！！ という気持ちになりますね。
そして `mute_all` というヤバそうなコマンドも見つけます。絶対に触りたくない。
というわけで `show_all` を叩きましょう。

```shell-session
$ dog monitor show_all
1111111	無です	無	{'notify_audit': False, 'locked': False, 'timeout_h': 0, 'silenced': {}, 'include_tags': False, 'no_data_timeframe': None, 'require_full_window': True, 'new_host_delay': 300, 'notify_no_data': False, 'renotify_interval': 0, 'escalation_message': '', 'thresholds': {'critical': 50000.0, 'warning': 5000.0}}	33733	sum(last_5m):avg:aws.events.invocations{*}.as_count() > 50000	query alert
2222222	無2です	無2	{'notify_audit': False, 'locked': False, 'timeout_h': 0, 'silenced': {}, 'include_tags': False, 'no_data_timeframe': None, 'require_full_window': True, 'new_host_delay': 300, 'notify_no_data': False, 'renotify_interval': 0, 'escalation_message': '', 'thresholds': {'critical': 50000.0, 'warning': 5000.0}}	33733	sum(last_5m):avg:aws.events.invocations{*}.as_count() > 50000	query alert
```

これは適当に作ったサンプルの Monitor ですが、こんな感じの乱雑なものがドバっと出てきます。目で読むのは厳しいので適当に grep したりしてめぼしいものを探しましょう。
今回は `new_relic` が含まれる Monitor なので、

```shell-session
$ dog monitor show_all | grep new_relic

$
```

という感じです。無さそうですね、オッケー、NewRelic 依存の Monitor は残って無さそうです:sunglasses:

## あとがき

Dogshell には他にも色々なコマンドがあるので、 すべての機能を網羅することは出来ませんが、最低限の使い方をご紹介しました。
みなさんも Dogshell で良い Datadog ライフを満喫しましょう！