arthur-1 Mackerel Advent Calendar 2023 マラソン10日目の記事です。
MackerelはOpenTelemetry対応を進めています
Mackerelはテレメトリデータを収集・エクスポートすることに関する標準規格であるOpenTelemetryへの対応を進めています。
その第一弾として、ラベル対応メトリック機能をオープンβリリースしています。
2023年12月現在では、OpenTelemetry MetricsのうちgaugeをOTLP/gRPCでMackerelに投稿し、PromQLを用いてグラフ化することができます。ベンダー独自のExporterを使わずともメトリックをエクスポートできるのが魅力の一つです。
ラベル対応メトリックのオープンベータテストは以下のフォームからお申し込みできますので、ぜひ使ってみてください。
KubernetesのメトリックをOTLPでMackerelに投稿する
ラベル対応メトリック機能をdogfoodingするにあたり、自宅でRaspberry Piを寄せ集めて作ったKubernetes クラスタのメトリックをMackerelで見えるようにしていきます。
OpenTelemetry CollectorをKubernetes上で動かすことで、ホストやクラスターに関するメトリックを外部サービスに投稿することができます。Helm Chartを使うと比較的手間なく導入できるので、その方法をご紹介します。
下準備
OpenTelemetryのHelm Chartのrepositoryを追加しましょう。また、今後のためにnamespaceを切っておきます。
$ helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts $ kubectl create namespace otel-collector
ホストメトリックを投稿する
まずは以下のような設定ファイルをvalues-daemonset.yamlとして用意しましょう。このファイルの雛形はhttps://github.com/open-telemetry/opentelemetry-helm-charts/blob/main/charts/opentelemetry-collector/values.yamlです。
mode: daemonset presets: hostMetrics: enabled: true kubernetesAttributes: enabled: true config: exporters: otlp: endpoint: otlp.mackerelio.com:4317 compression: gzip headers: Mackerel-Api-Key: ***your-mackerel-api-key*** processors: batch: timeout: 1m # 本来はここでresourcedetectorの設定もするのが望ましいはず、、 service: pipelines: metrics: exporters: [otlp]
config部分はOpenTelemetry Collectorの設定ですね。presetsの部分ですが、ここでパラメータを指定していくと対応するReceiverを作ってくれるだけでなく、実際に動かすために他に必要なリソース(ServiceAccountなど)もHelm Chartで面倒を見て作ってくれるようです。
yamlファイルができたら、以下のようにしてReleaseを作っていきます。
$ helm install otel-collector-daemonset open-telemetry/opentelemetry-collector -n otel-collector --values values-daemonset.yaml
以下のようにPodが立っていたら成功です。
$ kubectl get pods -n otel-collector NAME READY STATUS RESTARTS AGE otel-collector-daemonset-opentelemetry-collector-agent-6mjwd 1/1 Running 0 36m otel-collector-daemonset-opentelemetry-collector-agent-xr69w 1/1 Running 0 36m
クラスターメトリックを投稿する
今度はクラスターメトリックを投稿していきましょう。先程と同様に、values-deployment.yamlを作ります。
mode: deployment presets: clusterMetrics: enabled: true kubernetesAttributes: enabled: true config: exporters: otlp: endpoint: otlp.mackerelio.com:4317 compression: gzip headers: Mackerel-Api-Key: *** processors: batch: timeout: 1m service: pipelines: metrics: exporters: [otlp]
今度はmodeがdeploymentに変わっています。Helm Chartのドキュメントに書いてあるのですが、作成したいReceiverごとに推奨されるmodeが違います。
そしてhelm installでリソースを作成していきます。
$ helm install otel-collector-deployment open-telemetry/opentelemetry-collector -n otel-collector --values values-deployment.yaml
以下のようにPodが増えていたら成功です。daemonsetでは全てのノードにPodが配置されるのに対し、deploymentではある1つのノードにPodが配置されます。
$ kubectl get pods -n otel-collector NAME READY STATUS RESTARTS AGE otel-collector-daemonset-opentelemetry-collector-agent-6mjwd 1/1 Running 0 36m otel-collector-daemonset-opentelemetry-collector-agent-xr69w 1/1 Running 0 36m otel-collector-deployment-opentelemetry-collector-748ddcbdfjs8v 1/1 Running 1 (45m ago) 75m
本当はもう1つkubeletMetricsというメトリックの種類もあるのですが、自分の環境でうまく動かなかったので宿題にさせてください。
投稿されたメトリックをMackerel上で見ていく
Mackerelのカスタムダッシュボード編集画面でグラフウィジェットを作成し、グラフのタイプを「クエリグラフ」にします。オープンベータテストに申し込んでいないとクエリグラフの選択肢が出てきません。
クエリ部分にk8s.node.condition_ready
と入力すると、ノードごとReady状態か否かのメトリックがグラフとして表示されます。
たくさんAttributeがついているのでグラフの凡例が煩雑ですが、以下のように凡例に使いたいAttributeを選ぶことが可能です。
PromQLのsubsetが使えるので、例えばcount_values集約演算子を用いて、phaseごとのpodの数を数えてグラフにすることもできます。