Mackerelと連携する外形監視エージェントmaprobeにOtel metrics送信機能を追加した

この記事はMackerel Advent Calendar 2023 12月19日分の記事です。

Mackerelと連携する外形監視エージェント、maprobeというOSSを5年ほど前に作って、ずっと使っています。今回は maprobe v0.7.0で Otel (OpenTelemetry) metrics を送信する機能を追加したというお話です。

github.com

maprobeについては以下の記事もどうぞ。 sfujiwara.hatenablog.com

3行でまとめ

  • maprobeはMackerelに登録されているホスト情報を取得して、そのホストに対してping, TCP, HTTPによる外形監視とmackerel-pluginの実行によるメトリック取得を定期的に実行するエージェントです
  • maprobe v0.7.0 では外形監視の結果とpluginの実行結果を、Mackerelのホストメトリックとしてだけではなく、OpenTelemetry Metricsとしても送信できるようになりました
  • 既存pluginや自作pluginによるメトリック取得を、シームレスにOpenTelemetry metricsに移行することができます

設定方法

ここでは例として、Mackerelの「service=prd」「role=redis」のホストに対して、mackerel-plugin-redis によるメトリック取得をする例を載せます。

probes:
  - service: prd
    role: redis
    attributes:
      host.name: '{{ Host.Name }}'
      instance.type: '{{ index .Host.Meta.Cloud.MetaData "cache-node-type" }}'
    command:
      command:
        - mackerel-plugin-redis
        - -host={{.Host.CustomIdentifier}}
        - -config-command=

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

maprobeは service=prd, role=redis のホストをMackerelから取得し、その全てのホストに対してpluginを実行します。pluginの実行対象 (-host=の値) には、Goのtext/template記法でホストの情報を取りだして展開することができます。{{ .Host.CustomIdentifier }} に具体的なRedis(ここではElastiCache Redis)のnode DNS名が入っているため、今回はそれを指定しています。

通常、pluginで取得したメトリックはMackerelの対象ホストのホストメトリックとして送信されますが、v0.7.0 から増えた destination という設定を追加することで、任意の OpenTelemetry Collector に対して gRPC を使って送信することができるようになりました。

ここで指定している otlp.mackerelio.com:4317 は、現在絶賛βテスト中の、Mackerelが開発中のOpenTelemetry metrics endpointです。Mackerelが提供しているendpointだけではなく、任意のendpointを指定できます。

mackerel.io

また、Otel Metricsの特徴としてメトリックに任意の属性(attribute)を付与できる点があります。 maprobeはデフォルトで host.idservice.name という属性をメトリックに付与しますが、追加で任意のattributeを含めることが可能です。

    attributes:
      instance.type: '{{ index .Host.Meta.Cloud.MetaData "cache-node-type" }}'

この設定例では、ホストのメタデータに含まれる cache-node-type(いわゆるインスタンスタイプ)を追加しています。

取得した結果

ということで、Mackerelに送信されたOtel metricsをクエリグラフ機能によって描画したものがこちらです。

クエリグラフ

maprobeで指定した属性がメトリックに付与されていることが分かります。この属性を利用して、特定の属性を持つメトリックだけ描画したり、特定の属性のメトリックを合計/平均などの演算をして柔軟にグラフを描画できますね。

どのように使うのか

Otel metricsは、特定の監視ツールによらない汎用的なメトリック取得を可能にしてくれます。また、Mackerelの従来の機能では実現できないような、柔軟なグラフ描画も可能になります。

しかし、従来からMackerelをご利用中の皆様は、既存pluginや自作pluginによって現在のモニタリングを構築していることでしょう。それらを全て別の手段によって取得したOtel metricsに置き換えるのは大変ですし、取得方法や項目が変われば監視自体の継続性にも問題が出てきます。

maprobeによって既存pluiginによって取得した値をOtel metricsとして送信することで、既存の監視項目やノウハウを引き継ぎつつ、新たにOtel metricsによる柔軟なグラフ描画(や、現在はまだありませんがアラート)に移行できるかと思います。どうぞご利用ください。

Mackerel OpenTelemetry metric機能の正式公開が待ち遠しいですね!