本文の内容は、2023年3月1日に JAVIER MARTÍNEZが投稿したブログ(https://sysdig.com/blog/monitoring-custom-metrics)を元に日本語に翻訳・再構成した内容となっております。 カスタムメトリクスとは、Prometheusのような監視システムから直接アウトオブボックスで提供されるメトリクス(例:Kube State Metricsやnode exporter)とは異なり、アプリケーションレベルまたはビジネス関連のオーダーメイドメトリクスのことです。 Prometheusで監視プロジェクトを開始すると、Node ExporterとKube State Metricsだけでアウトオブボックスのメトリクスを初期セットで入手できることに気づくかもしれません。しかし、これではブラックボックス監視を行うだけなので、ここまでしかできません。次のレベルに進み、その先にあるものを観察するにはどうしたらよいでしょうか。 ビジネスやアプリのレベルとは別の次元を提供するため、クラウドネイティブなシステムの日常的な監視には欠かせない存在となっています。
- エクスポーターが提供するメトリクス
- お客様が設計したテーラーメードなメトリクス
- 以前の既存のメトリクスを集約したもの
- カスタムメトリクスが重要な理由
- カスタムメトリクスを使用するタイミング
- カスタムメトリクスを作成する際の注意点
- KubernetesメトリクスAPI
- Prometheusのカスタムメトリクス
- カスタムメトリクスを使用する際の課題
カスタムメトリクスが重要な理由
カスタムメトリクスを利用することで、お客様は以下のことが可能になります。- 主要業績評価指標(KPI)を監視する
- 問題を迅速に検出する
- リソースの利用状況を把握する
- レイテンシーの測定
- サービスやシステムから得られる特定の値を追跡する
- トランザクションのレイテンシー(ミリ秒単位)
- データベースにおけるオープン接続
- キャッシュヒット数/キャッシュミス数
- eコマースサイトの注文/売上
- 遅いレスポンスの %
- リソースを大量に消費するレスポンスの %
カスタムメトリクスを使用するタイミング
オートスケーリング
システムを具体的に可視化することで、ワークロードがどのように拡張されるべきかのルールを定義することができます。- 水平方向のオートスケーリング:Podのレプリカを追加または削除します
- 垂直方向のオートスケーリング:コンテナのリミットとリクエストを変更します
- クラスターオートスケーリング:クラスター内のノードを追加または削除します
レイテンシー監視
レイテンシーは、システムがリクエストに応答するのにかかる時間を測定します。この監視のゴールデンシグナルは、アプリケーションのエンドユーザーエクスペリエンスがどうなっているかを理解するために不可欠です。 これらは、Kube State MetricsやNode Exporterから得られるアウトオブボックスのメトリクスセットの一部ではないため、カスタムメトリクスとみなされます。レイテンシーを測定するには、個々のシステム(データベース、API)またはエンドツーエンドのいずれかを追跡するとよいでしょう。アプリケーションレベルの監視
Kube-state-metricsやnode-exporterは、可観測性のための良い出発点かもしれませんが、ブラックボックス監視を行うため、表面を削るに過ぎません。独自のアプリケーションやサービスをインストルメント化することで、特定のケース向けに精選され、パーソナライズされたメトリクスセットを作成します。カスタムメトリクスを作成する際の注意点
ネーミング
既存の名前と衝突したり、混乱を招く可能性があるため、ネーミングに関する既存の規約がないか確認します。カスタムメトリクスの名前は、その目的のための最初の説明です。ラベル
ラベルのおかげで、メトリクスにパラメータを追加することができ、追加の特性を通してフィルタリングし、絞り込むことができるようになります。カーディナリティとは、各ラベルに対して取り得る値の数であり、取り得る値の組み合わせごとに時系列の入力が必要となるため、リソースが大幅に増加する可能性があります。正しいラベルを慎重に選択することが、リソース消費急増の原因の一つであるこのカーディナリティの爆発を回避する鍵となる。コスト
カスタム・メトリクスは、お客様が使用している監視システムによっては、コストがかかる場合があります。コストを測定するために使用される次元が何であるかを再確認してください。- タイムシリーズの数
- ラベルの数
- データストレージ
カスタムメトリクスのライフサイクル
カスタムメトリクスがジョブや短命のスクリプトに関連している場合、Pushgatewayの利用を検討します。Kubernetes メトリクスAPI
Kubernetesの最も重要な機能の1つは、メトリクスの値に基づいてワークロードを自動的にスケールする機能です。 メトリクスAPIは、Kubernetesの公式リポジトリで定義されています。metrics.k8s.io
custom.metrics.k8s.io
external.metrics.k8s.io
新しいメトリクスの作成
以下のようにK8sメトリクスAPIを呼び出すことで、新しいメトリクスを設定することができます:curl -X POST \ -H 'Content-Type: application/json' \ http://localhost:8001/api/v1/namespaces/custom-metrics/services/custom-metrics-apiserver:http/proxy/write-metrics/namespaces/default/services/kubernetes/test-metric \ --data-raw '"300m"'
Prometheusのカスタムメトリクス
前述の通り、Prometheusインテグレーションに含まれる各エクスポーターは、いくつかのカスタムメトリクスを考慮しています。 Prometheusのメトリクスについては、こちらの記事で詳しく解説しています。カスタムメトリクスを使用する際の課題
カーディナリティの爆発
メトリクスによって消費されるリソースはごくわずかかもしれませんが、それらがクエリーでラベルとともに使用できるようになった瞬間、手に負えなくなる可能性があります。 カーディナリティとは、メトリクスとラベルのカーテシアン積のことを指します。その結果は、その単一のメトリクスに必要な時系列項目の量となります。
scrape_interval
に基づいて時系列データベースに格納されます。この値が高ければ高いほど、時系列エントリーの量も多くなります。
これら全ての要素が最終的にもたらすものは
- リソース消費量の増加
- ストレージ需要の増大
- 監視のパフォーマンス低下