dogwrapコマンドでDatadogへコマンドの実行結果を連携する

監視でDatadogを使っているのだけど、プロセスダウンとかしきい値を跨いだ際の挙動についてはDatadog側で動作させることが可能なのだが、例えば既存のスクリプトをキックした際にヘルスチェックで引っかかった場合などにアラートを飛ばすなどの処理をしたい時がある。そんな場合には、Datadog側で用意しているコマンドツール『dogwrap』を使うと良いようだ。

『dogwrap』は、指定したコマンドを実行して、その出力結果をDatadogへ連携してくれるツールだ。
これで、既存のスクリプト実行時にエラーになった場合はDatadogに連携するようにすれば、既存のスクリプトを使いまわせるだろう。

1.インストール

まずはインストール。以下のコマンドを実行する。

yum install python-setuptools python-devel
easy_install dogapi

インストールが完了したら、『dogwrap』コマンドが使えるようになっている。

2.Datadogにアラートを飛ばす

さて、それでは実際にdogwrapからDatadogにアラートを飛ばしてみよう。
以下のようにコマンドを実行することで、Datadogにアラートが飛ぶはずである。

dogwrap -n "アラート名" -k DatadogAPIキー --submit_mode 送信する種類 "実行コマンド"

※DatadogAPIキーは、DatadogAgentインストール時に使用しているキーを用いる。
以下のコマンドで確認も可能だ。サブシェルで組み合わせてしまっても良いだろう。

awk '$1~/api_key/ {print $2}' /etc/dd-agent/datadog.conf

例1)lsコマンドを実行して、その結果をDatadogに連携させる。

とりあえず、コマンドの実行結果を全てDatadogに連携させる。
この場合は、「--submit_mode」をallにすれば良いようだ。

dogwrap -n "TestAlert" -k $(awk '$1~/api_key/ {print $2}' /etc/dd-agent/datadog.conf) --submit_mode all "ls -la"

Datadogの画面がこちら。

例2)コマンドの異常終了時のみDatadogに連携させる

コマンドの実行結果がエラーになった場合にDatadogに連携させる場合は、「--submit_mode」をerrorsにすればいい。
そうすると、正常終了時のアラートはDatadogには連携されないようになっている。

dogwrap -n "TestAlertError" -k $(awk '$1~/api_key/ {print $2}' /etc/dd-agent/datadog.conf) --submit_mode errors "ps -ef | grep [s]shd" # 正常終了時
dogwrap -n "TestAlertError" -k $(awk '$1~/api_key/ {print $2}' /etc/dd-agent/datadog.conf) --submit_mode errors "ps -ef | grep [s]shd1234" # エラー発生時

[root@test-node dogapi]# dogwrap -n "TestAlertError" -k $(awk '$1~/api_key/ {print $2}' /etc/dd-agent/datadog.conf) --submit_mode errors "ps -ef | grep [s]shd"

root      1204     1  0  2月20 ?      00:00:00 /usr/sbin/sshd -D
root     10414  1204  0  2月20 ?      00:00:02 sshd: root@pts/0
[root@test-node dogapi]# dogwrap -n "TestAlertError" -k $(awk '$1~/api_key/ {print $2}' /etc/dd-agent/datadog.conf) --submit_mode errors "ps -ef | grep [s]shd1234"

[root@test-node dogapi]#

さて、Datadog側ではどうなっているかというと。。。

確かに、エラーになった分だけが連携されている事が確認できる。
管理外のサーバでDatadog エージェントを導入出来ない環境に対し、疎通監視とかそういったことをさせる際にも使えそうだ。