カスタム Agent チェックの書き方

カスタム Agent チェックの書き方

概要

このページでは、min_collection_interval を使用してサンプルのカスタム Agent チェックを作成し、サンプルのカスタムチェックを拡張するためのユースケースの例を示します。カスタムチェックは、Agent ベースのインテグレーションと同じ固定間隔で実行されます。デフォルトでは 15 秒ごとです。

セットアップ

インストール

カスタム Agent チェックを作成するには、まず Datadog Agent をインストールします。

: Agent v7+ を実行している場合、Agent チェックは Python 3 と互換性がある必要があります。それ以外の場合は Python 2.7+ との互換性が必要です。

コンフィギュレーション

  1. システムの conf.d ディレクトリに移動します。conf.d ディレクトリの場所の詳細については、オペレーティングシステムの Agent コンフィギュレーション設定を参照してください。
  2. conf.d ディレクトリに、新しい Agent チェック用の新しいコンフィギュレーションファイルを作成します。ファイルに checkvalue.yaml という名前を付けます。
  3. ファイルを編集して、以下を含めます。
  init_config:

  instances:
    [{}]
  1. checks.d ディレクトリに新しいチェックファイルを作成します。ファイルに checkvalue.py という名前を付けます。
  2. ファイルを編集して、以下を含めます。
  from checks import AgentCheck
  class HelloCheck(AgentCheck):
    def check(self, instance):
      self.gauge('hello.world', 1)
  1. Agent を再起動します。1 分以内に、メトリクスサマリーhello.world という新しいメトリクスが表示されます。

: コンフィギュレーションファイルとチェックファイルの名前は一致している必要があります。チェックの名前が checkvalue.py の場合、コンフィギュレーションファイルの名前は checkvalue.yaml である必要があります。

結果

1 分以内に、メトリクスサマリーhello.world という新しいメトリクスが表示されます。これは 1 の値を送信します。

: カスタムチェックの名前を選択する際は、既存の Datadog Agent インテグレーションの名前との競合を避けるため、名前の前に custom_ を付けてください。たとえば、カスタム Postfix チェックの場合、チェックファイルの名前は、postfix.pypostfix.yaml ではなく、custom_postfix.pycustom_postfix.yaml にします。

収集間隔の更新

チェックの収集間隔を変更するには、checkvalue.yaml ファイルで min_collection_interval を使用します。デフォルト値は 15 です。Agent v6 の場合、min_collection_interval をインスタンスレベルで追加し、インスタンスごとに個別に構成する必要があります。例:

init_config:

instances:
  - min_collection_interval: 30

: min_collection_interval30 に設定しても、メトリクスが 30 秒ごとに収集されるというわけではなく、最短 30 秒ごとに収集されるという意味になります。コレクターはチェックを 30 秒ごとに実行しようとしますが、同じ Agent で有効にされているインテグレーションとチェックの数によっては、待機しなけらばならない場合があります。さらに、check メソッドが終了までに 30 秒以上かかった場合も、Agent はチェックがまだ実行中であると認識し、次の間隔まで実行をスキップします。

チェックの検証

チェックが実行されていることを確認するには、次のコマンドを使用します。

sudo -u dd-agent -- datadog-agent check <CHECK_NAME>

チェックが実行されていることを確認したら、Agent を再起動してチェックを含め、Datadog へのデータのレポートを開始します。

コマンドラインプログラムを実行するチェックの書き方

コマンドラインプログラムを実行し、その出力をカスタムメトリクスとしてキャプチャするカスタムチェックを作成することができます。たとえば、チェックで vgs コマンドを実行して、ボリュームグループに関する情報を報告できます。

チェック内でサブプロセスを実行するには、モジュール datadog_checks.base.utils.subprocess_output にある get_subprocess_output() 関数を使用します。get_subprocess_output() には、コマンドと引数を文字列としてリスト形式で渡します。

たとえば、次のようにコマンドプロンプトで入力されるコマンド:

$ vgs -o vg_free

次のように get_subprocess_output() に渡します。

out, err, retcode = get_subprocess_output(["vgs", "-o", "vg_free"], self.log, raise_on_empty_output=True)

 : チェックを実行する Python インタープリターは、マルチスレッド Go ランタイムに埋め込まれるため、Python 標準ライブラリにある subprocess または multithreading モジュールの使用は、Agent バージョン 6 以降ではサポートされていません。

結果

コマンドラインプログラムを実行すると、チェックはターミナルのコマンドラインで実行されているのと同じ出力をキャプチャします。出力で文字列処理を実行し、結果で int() または float() を呼び出して、数値型を返します。

サブプロセスの出力に対して文字列処理を行わず整数や浮動小数点数が返されない場合、チェックはエラーなく動作しているように見えても何もデータを報告しません。

以下に、コマンドラインプログラムの結果を返すチェックの例を示します。

# ...
from datadog_checks.base.utils.subprocess_output import get_subprocess_output

class LSCheck(AgentCheck):
    def check(self, instance):
        files, err, retcode = get_subprocess_output(["ls", "."], self.log, raise_on_empty_output=True)
        file_count = len(files.split('\n')) - 1  #len() はデフォルトで int 値を返します
        self.gauge("file.count", file_count,tags=['TAG_KEY:TAG_VALUE'] + self.instance.get('tags', []))

ユースケース - ロードバランサーからデータを送信する

カスタム Agent チェックを作成するための一般的な使用例は、ロードバランサーから Datadog メトリクスを送信したい場合です。まず、コンフィギュレーションの手順に従います。次に、次の手順に従ってファイルを展開し、ロードバランサーからデータを送信します。

  1. checkvalue.py のコードを次のように置き換えます (lburl の値をロードバランサーのアドレスに置き換えます)。
  import urllib2
  import simplejson
  from checks import AgentCheck

  class CheckValue(AgentCheck):
    def check(self, instance):

      lburl = instance['ipaddress']

      response = urllib2.urlopen("http://" + lburl + "/rest")
      data = simplejson.load(response)

      self.gauge('coreapp.update.value', data["value"])
  1. checkvalue.yaml ファイルを更新します (ipaddress をロードバランサーの IP アドレスに置き換えます)。
  init_config:

  instances:
    - ipaddress: 1.2.3.4
  1. Agent を再起動します。1 分以内に、ロードバランサーからメトリクスを送信する coreapp.update.value という新しいメトリクスがメトリクスサマリーに表示されます。
  2. このメトリクスのダッシュボードを作成します。

Agent のバージョン管理

次の try/except ブロックを使うと、カスタムチェックがどの Agent バージョンとも互換性を持つようになります。

try:
    # まず、新しいバージョンの Agent から基本クラスをインポートしてみます
    from datadog_checks.base import AgentCheck
except ImportError:
    # 上記が失敗した場合、チェックは Agent バージョン < 6.6.0 で実行されています
    from checks import AgentCheck

# 特別な変数 __version__ の内容は、Agent ステータスページに表示されます
__version__ = "1.0.0"

class HelloCheck(AgentCheck):
    def check(self, instance):
        self.gauge('hello.world', 1, tags=['TAG_KEY:TAG_VALUE'] + self.instance.get('tags', []))

その他の参考資料

お役に立つドキュメント、リンクや記事: