Datadog Agentユーザにread権限を与えずに特定ディレクトリの使用量のメトリクスを送る

環境

  • Datadog Agent v6.15.0
  • CentOS 7.3.1611

背景

Datadogに特定のディレクトリの使用量のメトリクスを送るには、 公式で提供されている以下のインテグレーションを用いることで実現できる。 docs.datadoghq.com

しかし、このインテグレーションだと対象のディレクトリについてDatadog Agentのユーザに対してread権限を与える必要がある。 状況によってはDatadog Agentユーザにそのディレクトリのread権限を与えたくない場合がある。 対象のディレクトリにDatadog Agentユーザのread権限を与えずに使用量をDatadogに送りたい。

方法

Datadog Agentユーザに対して、sudoersの設定でディレクトリ容量取得コマンドの実行を許可する。 具体的には,sudo /usr/bin/du -sb ${対象のディレクトリのパス} を許可する。 /etc/sudoers に対して、${Datadog Agentのユーザ名} ALL= NOPASSWD: /usr/bin/du -sb ${対象ディレクトリパス} を追加する。

次に、DatadogのカスタムAgentチェックを作成する。 docs.datadoghq.com 公式ドキュメントを参考にして、以下のファイルをconf.d/custom_directory.yamlとして配置する。

init_config:
instances:
  - directory: ${directory_path}

さらに、以下のファイルをchecks.d/custom_directory.pyに配置する。

# -*- coding: utf-8 -*-
try:
    from checks import AgentCheck
except ImportError:
    from datadog_checks.checks import AgentCheck
from datadog_checks.base.utils.subprocess_output import get_subprocess_output

__version__ = "1.0.0"

class DirectoryCheck(AgentCheck):
    def check(self, instance):
        directory = instance['directory']
        size_bytes = self.__collect_directory_size_bytes(directory)
        self.gauge('ここにメトリクス名', size_bytes, tags=[ここにタグ])

    def __collect_directory_size_bytes(self, directory):
        # Datadog Agent ユーザで
        # sudo du -sb <directoryパス>
        # が実行できる必要があります
        out, err, retcode = get_subprocess_output(
            ["sudo", "/usr/bin/du", "-sb", directory],
            self.log,
            raise_on_empty_output=True,
        )
        if retcode != 0:
            raise RuntimeError(err)
        return int(out.split()[0])

対象環境でDatadog Agentを再起動すれば、custom_directoryカスタムチェックが動作し、 対象ディレクトリの容量がメトリクスとして送信される。