📈

Mackerelと連携する外形監視エージェント maprobe - fujiwara-ware 2024 day 18

2024/12/18に公開

この記事は fujiwara-ware advent calendar 2024 の18日目です。

maprobe とは

https://github.com/fujiwara/maprobe

maprobe は Mackerel と連携する外形監視エージェントです。

https://mackerel.io/ja/

Mackerel に登録されているホスト情報をサービスやロール単位で取得し、その各ホストに対して ping, TCP, HTTP での外形監視を行ったり、外部コマンドを実行してメトリクスを取得します。取得したメトリクスは Mackerel のカスタムメトリクスとして送信されます。

なぜ作ったのか

Mackerel の監視は Push 型と呼ばれるもので、各ホストが Mackerel サーバに対してメトリクスを送信する形態です。そのためホストがダウンしたという事象は「一定時間サーバに対して情報が送られてこない」ことによって検知されます。

しかしこのアーキテクチャの制約として、どうしてもホストがダウンしてデータが途切れたことを検知するまでに時間が掛かります。これを早くする方法がほしかったのです(2018年当時)。

また、クラウドのコンポーネント(例えば Amazon RDS や ElastiCache Redis)を AWS インテグレーションで Mackerel のホストとして登録した場合、これらのホストに対してプラグイン(mackerel-plugin-mysql や mackerel-plugin-redis) でのメトリック取得を行いたくなります。しかし、これらのコンポーネントはホストとして登録されているものの、ホスト上で mackerel-agent を動かすことはできないため、プラグインを実行する場所がありません。

ということで、

  • Mackerel に登録されているホスト情報を取得
  • そのホストに対して外形監視を行い、メトリクスを取得
  • そのメトリクスを Mackerel に送信

を実行するエージェントとして maprobe を開発しました。

基本的にはあるサービスの VPC 内部にひとつだけ配置して、その VPC 内のホストに対して監視メトリクス取得を行うことを想定しています。

使い方などはドキュメントや参考資料を参照してください。

使い方の例

次のような設定ファイルを用意して maprobe を実行すると、Mackerel上のサービス production、ロール redis を持つホストごとに以下の監視を行います。

  • TCP で 6379 ポートに接続し、PING という文字列を送信して PONG という文字列が返ってくることを確認
  • mackerel-plugin-redis を実行してメトリクスを取得
probes:
  - service: production
    role: redis
    tcp:
      host: '{{ .Host.IPAddress.eth0 }}'
      port: 6379
      send: "PING\n"
      expect_pattern: "PONG"
      quit: "QUIT\n"
    command:
      command:
        - "mackerel-plugin-redis"
        - "-host={{ .Host.IPAddress.eth0 }}"
        - "-tempfile=/tmp/redis-{{ .Host.ID }}"

設定ファイルの中ではテンプレート記法が使用できます。{{ .Host.IPAddress.eth0 }} はホストの eth0 インターフェースの IP アドレスを取得します。{{ .Host.ID }} はホストの ID を取得します。この .Host は maprobe が Mackerel から取得したホスト情報を表していて、実体は Go の構造体 (mackerel-client-go#Host) です。

ホストの情報を使うことで、プラグインや外形監視がアクセスするアドレスなどを動的に設定できます。

https://pkg.go.dev/github.com/mackerelio/mackerel-client-go#Host

最近のアップデート

最近は、OpenTelemetry のメトリクスを送信する機能を追加しました。

2024年には Mackerel が OpenTelemetry のメトリクスを受け付けるようになりました。このメトリクスは、従来の Mackerel プラグインが取得したメトリクスとの互換性がありません。運用の継続性を考えた場合、従来取得しているメトリクスを全て Otel 形式に置き換えるのは大変です。徐々に移行するにしても、これまでのプラグインのメトリクスと比較して切り替えていくことが望ましいでしょう。

ということで、maprobe に Otel メトリクスを Mackerel に送信する機能を追加しました。

https://sfujiwara.hatenablog.com/entry/maprobe-otel-metrics

使い方は簡単で、設定ファイルに以下のように追加するだけです。これで従来の Mackerel プラグインが取得したメトリクスを Otel 形式に変換して Mackerel に送信できます。

destination:
  mackerel:
    enabled: true
  otel:
    enabled: true
    endpoint: otlp.mackerelio.com:4317

まとめ

maprobe は Mackerel と連携する外形監視エージェントです。Otel対応もしているので、従来の Mackerel プラグインから Otel メトリクスに移行する際にも役立つかと思います。

Mackerel を使っている方はぜひお試しください。

それでは、明日もお楽しみに!

参考資料

https://sfujiwara.hatenablog.com/entry/2018/04/23/113316

https://sfujiwara.hatenablog.com/entry/maprobe-tips

https://sfujiwara.hatenablog.com/entry/maprobe-otel-metrics

https://speakerdeck.com/fujiwara3/mackerel-day-number-2

https://speakerdeck.com/fujiwara3/mackerel-drinkup-number-7

Discussion