Datadogのmonitor設定を追加するためのbashスクリプトを生成させる


# 免責事項

- 内容として正しいかは保証しない。
- 実際に使ってるものとは微妙に内容が異なるので動作保障もしない
	- (こんなことできるよ的な感じ)
- 同じ機能がDatadogで提供されていたら泣く。
- 末尾の使い道はほぼ妄想。

# 目的

Datadogのmonitor設定を記述したJSONファイルを使って
monitor設定を追加するためのbashスクリプトを生成させる。

実際には、刺身タンポポ的にGUIから設定するのではなく、
類似した内容のmonitor設定をテキストで一部書き換えるだけで一括適用できるようにする。

多分Shell芸を駆使すればシェルで完結する。
そこまでのシェル力もメンテする気持ちも持てないのでpythonで作る。


# 内容

## ディレクトリ構成

```bash:ディレクトリ構成
./
 ├ module/ 
 │   └ monitoring_script_builder.py (テンプレートをレンダリングするスクリプト)
 ├ template/
 │   └ create_monitor.j2
 ├ script/ (スクリプトの出力先ディレクトリ)
 ├ json/ (Datadogのmonitor設定のjsonファイルの格納先)
 └ builder.py (メインのスクリプト)
```


## テンプレートファイル

```bash:create_monitor.j2
#!/bin/bash
api_key={{api_key}}
app_key={{app_key}}

curl -X POST -H "Content-type: application/json" \
-d '{{json}}' "https://app.datadoghq.com/api/v1/monitor?api_key=${api_key}&application_key=${app_key}"
```

本テンプレート自体は[Datadogの公式サンプル](https://docs.datadoghq.com/api/?lang=console#monitors)を一部修正してテンプレート化したもの。


## スクリプト

### テンプレートのレンダリングスクリプト(monitoring_script_builder.py)

DatadogのApplication KeyとAPI Key、
あとはスクリプトに埋め込む情報(JSONファイル)を読み込み、
テンプレート(create_monitor.j2)をレンダリングして返す。

```python:monitoring_script_builder.py
from jinja2 import Template, Environment, FileSystemLoader


class MonitoringScriptBuilder():

    def __init__(self, **kwargs):
        env = Environment(loader=FileSystemLoader('./template/'))
        self.template = env.get_template('create_monitor.j2')

    def render(self, data, app_key, api_key):
        """
        """
        data['app_key'] = app_key
        data['api_key'] = api_key
        rendered = self.template.render(data)
        return rendered
```


### メインスクリプト(builder.py)

jsonディレクトリ内にあるjsonファイルを読み込むとともに、
環境変数からDatadogのAPIキーとDatadogのAPPキーを読み込む。

```python:builder.py
from module.monitoring_script_builder import MonitoringScriptBuilder
import os
import glob
import re
builder = MonitoringScriptBuilder()

# JSONファイルの読み込み部分
file_list = glob.glob(os.path.join("json", "*.json"))


# キー情報読み込み
api_key = os.getenv('DD_API_KEY')
app_key = os.getenv('DD_APP_KEY')

# テンプレートからファイルを生成
for file in file_list:
    f = open(file)
    json = f.read()
    data = {
        'json': json, 
    } 

    rendered = builder.render(data, app_key, api_key)
    print(rendered)

    f.close()

    file_out = file.replace("json", "")


    # 書き込み用にファイルをオープンする
    fout = open("script/" + file_out +"sh",'w')
    fout.write(rendered)
    fout.close()
```

# 実行サンプル


今回は以下のサンプルを利用する。

```json:json/sample.json

{
	"name": "{{host.name}} でcronが停止しています。",
	"type": "service check",
	"query": "\"process.up\".over(\"process:cron\").by(\"host\",\"process\").last(2).count_by_status()",
	"message": "{{host.name}} の {{process.name}} が停止しています。 @通知先",
	"options": {
		"notify_audit": false,
		"locked": false,
		"timeout_h": 0,
		"no_data_timeframe": 2,
		"new_host_delay": 300,
		"notify_no_data": false,
		"renotify_interval": 10,
		"escalation_message": "@通知先 \n\n10分経過しましたが、{{host.name}} の {{process.name}} \nが停止しています。",
		"thresholds": {
			"warning": 1,
			"ok": 1,
			"critical": 1
		}
}
```

こんな感じで設定(キー情報はもちろんダミー)

```bash:実行サンプル
$ export APP_KEY="piyopiyo"
$ export API_KEY="hogehoge"
$ python ./builder.py
```

実行がうまくいってれば```scriptディレクトリ```配下に
```sample.sh```が出力されているはず。

```bash:sample.shの確認
#!/bin/bash
api_key=hogehoge
app_key=piyopiyo

curl -X POST -H "Content-type: application/json" \
-d '{
	"name": "{{host.name}} でcronが停止しています。",
	"type": "service check",
	"query": "\"process.up\".over(\"process:cron\").by(\"host\",\"process\").last(2).count_by_status()",
	"message": "{{host.name}} の {{process.name}} が停止しています。 @通知先",
	"options": {
		"notify_audit": false,
		"locked": false,
		"timeout_h": 0,
		"no_data_timeframe": 2,
		"new_host_delay": 300,
		"notify_no_data": false,
		"renotify_interval": 10,
		"escalation_message": "@通知先 \n\n10分経過しましたが、{{host.name}} の {{process.name}} \nが停止しています。",
		"thresholds": {
			"warning": 1,
			"ok": 1,
			"critical": 1
		}
}' "https://app.datadoghq.com/api/v1/monitor?api_key=${api_key}&application_key=${app_key}"

```

## 本スクリプトの使い道

- 刺身タンポポなmonitor設定の大量作成

ほとんど同じ条件だけれども微妙に異なるmonitor設定を大量に投入したい場合に利用する。

- monitor設定のバックアップからの復旧

monitor設定をjsonで保管していて、Datadogのmonitor設定を壊してしまった際の
復旧に利用する。単一のmonitor設定ごとにスクリプトが生成されるのでこの点はいろいろ
使い道が考えられるかもしれない。

- 他のアカウントのmonitor設定の流用

他のアカウントで利用しているmonitor設定を移行する際に
jsonエクスポートを介して利用できる。


# 参考文献
[Dadadog API Reference](https://docs.datadoghq.com/api/?lang=console#monitors)
[Jinja2の基本的な使い方](http://qiita.com/RyoMa_0923/items/528303906a55f9b568e0)