Datadog custom agent check の作成方法 Datadog でオレオレチェックを作る方法です。 Python でのスクリプト作成を解説しています。 本解説で利用している Python は v2.7, Datadog-agent は v6.9 です。

必要なもの

  • スクリプト本体
    • /etc/datadog-agent/check.d/oreore_check.py
  • コンフィグファイル
    • /etc/datadog-agent/conf.d/oreore_check/conf.yaml

スクリプト名とコンフィグを格納しているディレクトリ名は一致している必要があります。

コンフィグの書き方

大きく分けて init_config と instances に分かれていますが、 init_config は全体的な設定、 instances は個別の設定というイメージです。スクリプトによってはチェックするものがひとつしかないのでイメージしづらいかもしれませんが、たとえば tcp チェックなんかの config にはチェック対象のパスなんかをいくつも書きますよね。それらがスクリプトに渡され、 instances という辞書のリストになるので iterator でぐるぐる回して処理する感じです。

init_config:
  min_collection_interval: 300

instances:

  - check: True

スクリプトの書き方

例として shell コマンドを実行してその結果によって OK/NG を判定するスクリプトを作成します。

import logging
import subprocess
from checks import AgentCheck

class OreoreCheck(AgentCheck):

    # この check 関数は自動的に実行されるため、メイン処理に相当します。
    def check(self, instance):

        # ログを出力したい場合は logging をインポートします。 /var/log/datadog-agent/agent.log に出力されます。
        # Warning 以上でないと出力されませんので info や debug を出したければ logging を調べてみてください。
        logging.warning("もしもし、カーチャン? オレオレ!")
        # 必須パラメーターのチェックです。コンフィグに check という項目があるか見ています。
        if 'check' not in instance:
            self.service_check('hulft_send_check', self.WARNING)
            return
        # check が True なら後続実行、 False なら処理しないためここで終了させています。
        if not instance['check']:
            self.service_check('hulft_send_check', self.OK)
            return
        try:
            os.environ["WHO_ARE_YOU"] = "oreore"
            cmd = 'echo $WHO_ARE_YOU'
            p = subprocess.Popen(
                    cmd, 
                    stdout=subprocess.PIPE,
                    shell=True
            )
            p.wait()
            # 下記の処理で cmd の実行結果が response に格納されます。
            # 戻りが 1 行なら .split() は必要ないですが、複数行である可能性がある場合はリストにして iterator で回します。
            response = p.communicate()[0].split('\n')
            # 値を判定します。ここでは if の結果が True であれば Critical アラートを上げ、そうでなければ OK を返します。
            # 予期しない Exception が発生した場合は Warning を上げるようにしています。
            if 'oreore' == response[0]:
                self.service_check('oreore_check', AgentCheck.CRITICAL)
        except Exception as e:
            self.service_check('oreore_check', AgentCheck.WARNING)
            raise e
        self.service_check('oreore_check', AgentCheck.OK)

実行方法

上記を指定した箇所に格納して datadog-agent を再起動すれば実行されます。 思ったように動いてくれないとか、動きが変だとかっていう場合には logging でがんばってデバッグしたり、 datadog-agent check oreore_check で実行させたり、 datadog-agent status で正しく実行できているか、 metric が取得できているかなどを確認するとよいかと思います。

お気持ち表明

コマンドの部分はデフォルトだと dd-agent ユーザーが、サブプロセスのシェルを作成して実行します。 そのため、 root ユーザーではうまくコマンドが叩けたのに、 dd-agent ユーザーだと叩けない、望んだ結果が返ってこないなどということが実際にありました。それを確認するために、 $ sudo -u dd-agent echo $WHO_ARE_YOU などとして dd-agent が実行したらどういう結果になるか確認してみるのもデバッグに役立ちました。