Mackerel と連携する外形監視エージェント maprobe でマネージドサービスのメトリック収集を自動化する

Mackerel Advent Calendar 2018 22日目の記事です。

ちょっと前に maprobe という、Mackerel のホスト情報と連携して外形監視を行うエージェントツールを作りました。

sfujiwara.hatenablog.com

maprobe は指定した Mackerel のサービス、ロールに存在しているホストに対して外形監視を行った結果をホストメトリックとして投稿するものです。定義にしたがって外から pingTCP, HTTP の疎通を確認した結果を投稿できるのですが、mackerel-agent のメトリックプラグインと互換性のある出力をするコマンドを実行する機能もあります。

今回は AWS インテグレーションで管理されているマネージドサービスのホストに、maprobe でメトリックプラグインで取得したメトリックを追加することで、運用負荷を下げる手法を紹介します。

AWS インテグレーションで管理されたホストにカスタムメトリックを投稿する方法(おさらい)

メトリックプラグインによって得られたメトリックを AWS インテグレーションで管理されているホストに送信することは、mackerel-agent でも可能です。

例として ElastiCache Redis に対してメトリック収集を行いたい場合、どこかのホストで実行されている mackerel-agent の設定に以下のような記述をします。

[plugin.metrics.redis-001]
command = [
  "mackerel-plugin-redis",
  "-host=redis-001.xxxx.apne1.cache.amazonaws.com",
  "-tempfile=/tmp/mackerel-plugin-redis-001",
  "-config-command=",
]
custom_identifier = "redis-001.xxxx.0001.apne1.cache.amazonaws.com"
  • ElastiCache では CONFIG コマンドが実行できないので、-config-command= の設定で CONFIG による値取得を無効化しています
  • -tempfile の指定は、同一 agent で複数の ElastiCahce を監視する場合に状態管理ファイルを分離するために必要です

ポイントは custom_identifier で、ここに mkr hosts --verbose で確認できる customIdentifier の値を指定します。

これによって AWS インテグレーションで認識された ElastiCache のホストに、mackerel-plugin-redis によって取得したメトリックを投稿することができます。

mackerel-agent でメトリック収集する場合の運用負荷

このように maprobe を使わずとも mackerel-agent でもメトリック収集自体は可能なのですが、運用上面倒な点があります。

  • custom_identifier を調べる必要がある
    • 何らかの方法 (mkr コマンドや API) で調べた値を、config に静的に書き込む必要があります
  • ホストが増減した時の設定更新が必要
    • AWS 上でインテグレーション対象のホストを増減した場合、config の記述もそれに合わせて増減する必要があります
    • 具体的には、設定ファイルを再生成して mackerel-agent の reload が必要になります

maprobe で解決すること

maprobe は指定したサービス、ロールのホストを Mackerel API から収集し、その時点で存在している全てのホストに対して外形監視、コマンド実行を行います。メトリック投稿には API で得られた Mackerel のホストIDを使用するので、custom_identifier を調べる必要はありません。

ホストが増減した場合には自動的に追従するため、設定ファイルの変更は必要ありません。

設定ファイルが変更されている場合には自動で再読み込みを行うため、新しい監視設定を追加しても再起動は必要ありません。

maprobe の設定例

先に記述した、ElastiCache Redis にカスタムメトリックを投稿する例は maprobe では以下のようになります。(v0.2.3で command に配列を渡せるようになりました)

probes:
  - service: production
    role: ElastiCache
    command:
      command:
        - "mackerel-plugin-redis"
        - "-host={{.Host.CustomIdentifier}}"
        - "-tempfile=/tmp/mackerel-plugin-redis-{{.Host.ID}}"
        - "-config-command="
      graph_defs: true

graph_defs: true を指定すると、プラグインから得たグラフ定義の投稿 (MACKEREL_AGENT_PLUGIN_META=1 で得られる結果) を自動的に投稿するため、Mackerel 上での見た目は mackerel-agent でメトリック収集したものと同一になります。

さらに maprobe では、ping, TCP, HTTP による外形監視 (check-{tcp,http} とほぼ同等機能) も行えるため、Redis プロトコルPING, PONG による外形監視も追加できます。

probes:
  - service: production
    role: ElastiCache
    tcp:
      host: "{{ .Host.CustomIdentifier }}"
      port: 6379
      send: "PING\n"
      expect_pattern: "PONG"
    command:
      command:
        - "mackerel-plugin-redis"
        - "-host={{.Host.CustomIdentifier}}"
        - "-tempfile=/tmp/mackerel-plugin-redis-{{.Host.ID}}"
        - "-config-command="
      graph_defs: true

Mackerel 本体で提供されている外形監視は、現時点ではグローバルな HTTP(S) に対するもののみです。マネージドサービスのホストでは mackerel-agent が稼働しないため、Unreachable なアラートも上げられません。そのためダウン検知がむずかしいのですが、maprobe では外形監視によりホストのダウンを素早く検知できます。

まとめ

maprobe は Go で実装された OSS です。Mackerel API を利用して、簡単な設定で指定したサービス、ロールのホストに対する外形監視とメトリック収集、投稿を行えます。

github.com

DockerHub でイメージも公開 しているため、コンテナ環境での利用も容易です。

マネージドサービスのホストが増減しても、特に監視設定の変更を意識せずにメトリック収集、外形監視を追従できるため、運用負荷を下げることができるでしょう。