Ubuntu 14.04でプロメテウスを照会する方法パート1

Prometheusの共同作成者Julius Volzの記事

前書き

プロメテウスは、オープンソースの監視システムおよび時系列データベースです。 プロメテウスの最も重要な側面の1つは、多次元データモデルとそれに付随するクエリ言語です。 このクエリ言語を使用すると、ディメンションデータを細分化して、アドホックな方法で運用上の質問に答えたり、ダッシュボードに傾向を表示したり、システムの障害に関するアラートを生成したりできます。

このチュートリアルでは、Prometheus 1.3.1のクエリ方法を学習します。 適切なサンプルデータを使用するために、さまざまな種類の合成メトリックをエクスポートする3つの同一のデモサービスインスタンスを設定します。 次に、Prometheusサーバーをセットアップして、これらのメトリックをスクレイピングして保存します。 次に、サンプルのメトリックを使用して、単純なクエリから始めて、より高度なクエリに移るPrometheusのクエリ方法を学習します。

このチュートリアルの後、ディメンションに基づいて時系列を選択およびフィルタリングする方法、時系列を集計および変換する方法、および異なるメトリック間で算術を行う方法を学習します。 フォローアップチュートリアルでは、https://www.digitalocean.com/community/tutorials/how-to-query-prometheus-on-ubuntu-14-04-part-2 [Ubuntu 14.04パート2でPrometheusを照会する方法]、このチュートリアルの知識に基づいて、より高度なクエリのユースケースをカバーします。

前提条件

このチュートリアルを実行するには、次のものが必要です。

ステップ1-Prometheusのインストール

この手順では、Prometheusサーバーをダウンロード、構成、および実行して、3つの(まだ実行されていない)デモサービスインスタンスをスクレイピングします。

まず、Prometheusをダウンロードします。

wget https://github.com/prometheus/prometheus/releases/download/v1.3.1/prometheus-1.3.1.linux-amd64.tar.gz

tarballを抽出します。

tar xvfz prometheus-1.3.1.linux-amd64.tar.gz

ホストファイルシステムの `+〜/ prometheus.yml +`に最小限のPrometheus設定ファイルを作成します。

nano ~/prometheus.yml

ファイルに次の内容を追加します。

〜/ prometheus.yml

# Scrape the three demo service instances every 5 seconds.
global:
 scrape_interval: 5s

scrape_configs:
 - job_name: 'demo'
   static_configs:
     - targets:
       - 'localhost:8080'
       - 'localhost:8081'
       - 'localhost:8082'

nanoを保存して終了します。

この構成例では、Prometheusがデモインスタンスをスクレイプします。 Prometheusはプルモデルで動作するため、メトリックをプルするエンドポイントを認識するように設定する必要があります。 デモインスタンスはまだ実行されていませんが、後でポート「8080 +」、「 8081+」、および「8082」で実行されます。

`+ nohup +`を使用して、バックグラウンドプロセスとしてPrometheusを起動します。

nohup ./prometheus-1.3.1.linux-amd64/prometheus -storage.local.memory-chunks=10000 &

コマンドの先頭にある「+ nohup」は、出力を「+ stdout」ではなく「〜/ nohup.out」ファイルに送信します。 コマンドの最後にある「&」により、プロセスはバックグラウンドで実行を続けながら、追加のコマンドのプロンプトを表示できます。 プロセスをフォアグラウンドに戻す(つまり、ターミナルの実行中のプロセスに戻す)には、同じターミナルでコマンド「 fg +」を使用します。

すべてがうまくいけば、 `+〜/ nohup.out +`ファイルで、次のような出力が表示されるはずです。

Prometheusの起動からの出力

time="2016-11-23T03:10:33Z" level=info msg="Starting prometheus (version=1.3.1, branch=master, revision=be476954e80349cb7ec3ba6a3247cd712189dfcb)" source="main.go:75"
time="2016-11-23T03:10:33Z" level=info msg="Build context (go=go1.7.3, user=root@37f0aa346b26, date=20161104-20:24:03)" source="main.go:76"
time="2016-11-23T03:10:33Z" level=info msg="Loading configuration file prometheus.yml" source="main.go:247"
time="2016-11-23T03:10:33Z" level=info msg="Loading series map and head chunks..." source="storage.go:354"
time="2016-11-23T03:10:33Z" level=info msg="0 series loaded." source="storage.go:359"
time="2016-11-23T03:10:33Z" level=warning msg="No AlertManagers configured, not dispatching any alerts" source="notifier.go:176"
time="2016-11-23T03:10:33Z" level=info msg="Starting target manager..." source="targetmanager.go:76"
time="2016-11-23T03:10:33Z" level=info msg="Listening on :9090" source="web.go:240"

別の端末では、コマンド `+ tail -f〜/ nohup.out +`を使用してこのファイルの内容を監視できます。 コンテンツがファイルに書き込まれると、端末に表示されます。

デフォルトでは、Prometheusは設定を + prometheus.yml +(作成したばかり)から読み込み、現在の作業ディレクトリの `+。/ data +`にメトリックデータを保存します。

`+ -storage.local.memory-chunks`フラグは、このチュートリアルでホストシステムのごく少量のRAM(512MBのみ)と少数の保存された時系列に合わせてPrometheusのメモリ使用量を調整します。

これで、Prometheusサーバーに `+ http://:9090 / `でアクセスできるはずです。 ` http://:9090 / status `に移動し、* Targets *セクションで ` demo +`ジョブの3つのターゲットエンドポイントを見つけて、3つのデモインスタンスからメトリックを収集するように構成されていることを確認します。 デモインスタンスはまだ開始されておらず、スクレイプできないため、3つのターゲットすべての* State 列には、ターゲットの状態が DOWN *と表示されます。

image:https://assets.digitalocean.com/articles/prometheus_querying/demo.png [デモインスタンスはDOWNと表示されます]

ステップ2-デモインスタンスのインストール

このセクションでは、3つのデモサービスインスタンスをインストールして実行します。

デモサービスをダウンロードします。

wget https://github.com/juliusv/prometheus_demo_service/releases/download/0.0.4/prometheus_demo_service-0.0.4.linux-amd64.tar.gz

抽出する:

tar xvfz prometheus_demo_service-0.0.4.linux-amd64.tar.gz

個別のポートでデモサービスを3回実行します。

./prometheus_demo_service -listen-address=:8080 &
./prometheus_demo_service -listen-address=:8081 &
./prometheus_demo_service -listen-address=:8082 &

+&+`はバックグラウンドでデモサービスを開始します。 それらは何も記録しませんが、それぞれのポートの `+ / metrics + HTTPエンドポイントでPrometheusメトリックを公開します。

これらのデモサービスは、いくつかのシミュレートされたサブシステムに関する合成メトリックをエクスポートします。 これらは:

  • リクエストカウントとレイテンシーを公開するHTTP APIサーバー(パス、メソッド、および応答ステータスコードをキーとする)

  • 最後に成功した実行のタイムスタンプと処理されたバイト数を公開する定期的なバッチジョブ

  • CPUの数とその使用量に関する総合的なメトリック

  • ディスクの合計サイズとその使用量に関する総合的なメトリック

個々のメトリックは、後のセクションのクエリ例で紹介されています。

Prometheusサーバーは、3つのデモインスタンスのスクレイピングを自動的に開始するはずです。 `+ http://:9090 / status `のPrometheusサーバーのステータスページに移動し、 ` demo +`ジョブのターゲットが* UP *状態を示していることを確認します。

image:https://assets.digitalocean.com/articles/prometheus_querying/demo_up.png [デモターゲットはUPとして表示されるはずです]

手順3-クエリブラウザの使用

このステップでは、Prometheusに組み込まれているクエリとグラフのウェブインターフェースに慣れます。 このインターフェイスは、アドホックデータの調査やPrometheusのクエリ言語の学習には適していますが、永続的なダッシュボードの構築には適しておらず、高度な視覚化機能をサポートしていません。 ダッシュボードの構築については、https://www.digitalocean.com/community/tutorials/how-to-add-a-prometheus-dashboard-to-grafana [プロメテウスダッシュボードをGrafanaに追加する方法]の例を参照してください。

Prometheusサーバーの `+ http://:9090 / graph +`に移動します。 これは次のようになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/interface.png [Prometheusクエリおよびグラフ作成インターフェイス]

ご覧のとおり、* Graph Console *の2つのタブがあります。 Prometheusでは、2つの異なるモードでデータをクエリできます。

  • * Console *タブを使用すると、現在の時点でクエリ式を評価できます。 クエリの実行後、テーブルには各結果の時系列の現在の値が表示されます(出力シリーズごとに1つのテーブル行)。

  • [グラフ]タブでは、指定した時間範囲でクエリ式をグラフ化できます。

Prometheusは数百万の時系列に拡張できるため、非常に高価なクエリを作成することができます(これは、SQLデータベースの大きなテーブルからすべての行を選択することに似ていると考えてください)。 クエリのタイムアウトやサーバーの過負荷を避けるために、すぐにグラフ化するのではなく、最初に* Console *ビューでクエリの探索と構築を開始することをお勧めします。 単一の時点で潜在的にコストのかかるクエリを評価すると、一定の期間にわたって同じクエリをグラフ化するよりもはるかに少ないリソースを使用します。

クエリを十分に絞り込んだ後(ロードのために選択するシリーズ、実行する必要がある計算、および出力時系列の数に関して)、* Graph *タブに切り替えて、評価された式を経時的に表示できます。 。 クエリがグラフ化できるほど安価であることを知ることは正確な​​科学ではなく、データ、遅延要件、およびPrometheusサーバーを実行しているマシンの能力に依存します。 時間が経つにつれて、この感覚が得られます。

テスト用のPrometheusサーバーは大量のデータを収集しないため、このチュートリアルではコストのかかるクエリを実際に作成することはできません。 クエリの例は、* Graph ビューと Console *ビューの両方でリスクなしに表示できます。

グラフの時間範囲を縮小または拡大するには、-*または + ボタンをクリックします。 グラフの終了時間を移動するには、 << または >> ボタンを押します。 * stacked *チェックボックスを有効にすると、グラフを積み重ねることができます。 最後に、 Res。 (s)*入力により、カスタムクエリの解像度を指定できます(このチュートリアルでは不要です)。

ステップ4-単純な時系列クエリの実行

クエリを開始する前に、Prometheusのデータモデルと用語を簡単に確認しましょう。 Prometheusは基本的にすべてのデータを時系列として保存します。 各時系列は、メトリック名と、Prometheusが_labels_を呼び出すキーと値のペアのセットによって識別されます。 メトリック名は、測定されているシステムの全体的な側面を示します(たとえば、プロセスの起動以降に処理されたHTTPリクエストの数、 + http_requests_total +)。 ラベルは、HTTPメソッドなどのメトリックのサブディメンションを区別するのに役立ちます(例: + method =" POST "+)またはパス(例: + path =" / api / foo "+)。 最後に、一連のサンプルが一連の実際のデータを形成します。 各サンプルはタイムスタンプと値で構成されます。タイムスタンプの精度はミリ秒で、値は常に64ビットの浮動小数点値です。

作成できる最も単純なクエリは、指定されたメトリック名を持つすべてのシリーズを返します。 たとえば、デモサービスは、ダミーサービスによって処理される合成API HTTPリクエストの数を表すメトリック「+ demo_api_request_duration_seconds_count 」をエクスポートします。 メトリック名に文字列 ` duration_seconds `が含まれている理由を疑問に思うかもしれません。 これは、このカウンターが、主にリクエスト期間の分布を追跡するが、追跡されたリクエストの総数(ここでは「 _count 」で終わる)を有用な副産物として公開する、「 demo_api_request_duration_seconds +」という名前の大きなヒストグラムメトリックの一部であるためです。

  • Console クエリタブが選択されていることを確認し、ページ上部のテキストフィールドに次のクエリを入力し、 Execute *ボタンをクリックしてクエリを実行します。

demo_api_request_duration_seconds_count

Prometheusは3つのサービスインスタンスを監視しているため、追跡された各サービスインスタンス、パス、HTTPメソッド、およびHTTPステータスコードごとに、このメトリック名を持つ27の結果時系列を含む表形式の出力が表示されます。 サービスインスタンス自体によって設定されるラベル( + method ++ path +、および + status +)に加えて、シリーズには適切な `+ job `および ` instance +`ラベルがあり、異なるサービスインスタンスを互いに区別します。 プロメテウスは、スクレイプされたターゲットから時系列を保存するときに、これらのラベルを自動的に添付します。 出力は次のようになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/api_requests.png [APIリクエストは表形式の出力としてカウント]

右側の表の列に表示される数値は、各時系列の現在の値です。 このクエリと後続のクエリの出力を自由にグラフ化して([グラフ]タブをクリックし、[*実行]をもう一度クリックして)、値が時間とともにどのように変化するかを確認してください。

ラベルマッチャーを追加して、ラベルに基づいて返されるシリーズを制限できるようになりました。 ラベルマッチャーは、中括弧内のメトリック名に直接続きます。 最も単純な形式では、特定のラベルの正確な値を持つシリーズをフィルタリングします。 たとえば、このクエリは、 `+ GET +`リクエストのリクエストカウントのみを表示します。

demo_api_request_duration_seconds_count{method="GET"}

マッチャーはコンマを使用して組み合わせることができます。 たとえば、インスタンス `+ localhost:8080 `およびジョブ ` demo +`からのみメトリックのフィルタリングを追加できます。

demo_api_request_duration_seconds_count{instance="localhost:8080",method="GET",job="demo"}

結果は次のようになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/api_filtered.png [フィルターされたAPI要求は表形式の出力としてカウント]

複数のマッチャーを結合する場合、シリーズを選択するにはそれらすべてが一致する必要があります。 上記の式は、ポート8080で実行され、HTTPメソッドが「+ GET 」であったサービスインスタンスのAPIリクエストカウントのみを返します。 また、 ` demo +`ジョブに属するメトリックのみを選択するようにします。

等式マッチングに加えて、Prometheusは非等式マッチング( +!= +)、正規表現マッチング( + =〜+)、および負の正規表現マッチング( !〜)をサポートしています。 メトリック名を完全に省略し、ラベルマッチャーを使用したクエリのみを省略することもできます。 たとえば、 `+ path `ラベルが ` / api +`で始まるすべてのシリーズ(メトリック名またはジョブに関係なく)を一覧表示するには、次のクエリを実行できます。

{path=~"/api.*"}

正規表現は常にPrometheusの完全な文字列に一致するため、上記の正規表現は「+。* +」で終わる必要があります。

結果の時系列は、異なるメトリック名を持つ系列の混合になります。

image:https://assets.digitalocean.com/articles/prometheus_querying/regex_matched.png [表形式出力としての正規表現一致シリーズ]

これで、メトリック名およびラベル値の組み合わせによって時系列を選択する方法がわかりました。

ステップ5-レートおよびその他のデリバティブの計算

このセクションでは、メトリックのレートまたはデルタを経時的に計算する方法を学習します。

Prometheusで最も頻繁に使用する関数の1つは、 `+ rate()`です。 インストルメント化されたサービスでイベントレートを直接計算する代わりに、Prometheusでは、生のカウンターを使用してイベントを追跡し、クエリ時間中にPrometheusサーバーがレートをアドホックに計算できるようにすることが一般的です(これには、レートスパイクを失わないなど、多くの利点がありますクエリ間で動的平均化ウィンドウを選択できるようにするだけでなく)。 監視対象のサービスが開始されると、カウンターは「+0」から始まり、サービスプロセスの有効期間にわたって継続的に増加します。 監視対象プロセスが再起動すると、そのカウンターが「0」にリセットされ、そこから再び上昇を開始することがあります。 生のカウンターをグラフ化することは通常、あまり便利ではありません。これは、時折リセットされる線が増え続けるためです。 デモサービスのAPIリクエストカウントをグラフ化することでそれを確認できます。

demo_api_request_duration_seconds_count{job="demo"}

次のようになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/raw_counters.png [生カウンターのグラフ化]

カウンターを便利にするために、 `+ rate()`関数を使用して、それらの_per-second_増加率を計算できます。 シリーズマッチャーの後に範囲セレクター( ` [5m] `など)を提供することにより、どの時間ウィンドウでレートを平均化するかを rate()+に伝える必要があります。 たとえば、直前の5分間の平均として、上記のカウンターメトリックの1秒あたりの増加を計算するには、次のクエリをグラフ化します。

rate(demo_api_request_duration_seconds_count{job="demo"}[5m])

結果は、はるかに便利になりました。

image:https://assets.digitalocean.com/articles/prometheus_querying/graphing_rates.png [カウンターのグラフ化率]

`+ rate()+`は賢く、カウンター値の減少がリセットであると想定することでカウンターのリセットを自動的に調整します。

`+ rate()`の変形は ` irate()`です。 ` rate()`は指定された時間ウィンドウ(この場合は5分)のすべてのサンプルのレートを平均しますが、 ` irate()`は過去の2つのサンプルのみを振り返ります。 これらの2つのサンプルの時間を最大限に遡るまでの時間を知るために、時間枠( ` [5m] `など)を指定する必要があります。 ` irate()`はレートの変化により速く反応するため、通常はグラフでの使用が推奨されます。 対照的に、 ` rate()+`はよりスムーズなレートを提供し、アラート式で使用することをお勧めします(短いレートのスパイクが減衰され、夜間に目が覚めないため)。

`+ irate()+`を使用すると、上記のグラフは次のようになり、リクエストレートの断続的な短い低下が明らかになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/graphing_instant.png [カウンターのインスタントレートのグラフ化]

`+ rate()`と ` irate()`は常に_per-second_レートを計算します。 場合によっては、カウンタが一定期間にわたって増加したが、カウンタのリセットは正しいという合計量を知りたい場合があります。 これは ` increase()+`関数で実現できます。 たとえば、過去1時間に処理されたリクエストの総数を計算するには、次のクエリを実行します。

increase(demo_api_request_duration_seconds_count{job="demo"}[1h])

カウンター(増加のみ可能)に加えて、ゲージメトリックがあります。 ゲージは、温度や空きディスク容量など、時間とともに上昇または下降する可能性がある値です。 時間の経過に伴うゲージの変化を計算する場合、関数の + rate()+ / + irate()+ / `+ increase()`ファミリは使用できません。 これらはすべて、メトリック値の減少をカウンタリセットとして解釈し、それを補正するため、カウンタを対象としています。 代わりに、線形回帰に基づいてゲージの1秒あたりの導関数を計算する ` deriv()+`関数を使用できます。

たとえば、デモサービスによってエクスポートされた架空のディスク使用量が、過去15分間の線形回帰に基づいて(MiB /秒で)増加または減少する速度を確認するには、次のクエリを実行できます。

deriv(demo_disk_usage_bytes{job="demo"}[15m])

結果は次のようになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/disk_usage.png [ディスク使用量の派生物をグラフ化する]

ゲージのデルタとトレンドの計算の詳細については、http://prometheus.io/docs/querying/functions/#delta [+ delta()+]およびhttp://prometheus.io/docs/も参照してください。 querying / functions /#predict_linear [+ predict_linear()+]関数。

異なる平均化動作で1秒あたりのレートを計算する方法、レート計算でカウンターリセットを処理する方法、およびゲージの導関数を計算する方法がわかりました。

ステップ6-時系列の集計

このセクションでは、個々のシリーズを集計する方法を学びます。

プロメテウスは、高次元の詳細でデータを収集します。これにより、メトリック名ごとに多くのシリーズが作成される可能性があります。 ただし、多くの場合、すべてのディメンションを考慮する必要はなく、妥当な方法で一度にすべてをグラフ化するにはシリーズが多すぎる場合もあります。 解決策は、いくつかのディメンションで集計し、関心のあるディメンションのみを保持することです。 たとえば、デモサービスは、API HTTP要求を「+ method 」、「 path 」、および「 status 」で追跡します。 プロメテウスは、ノードエクスポーターからこのメトリックをスクレイピングする際に、このメトリックにさらにディメンションを追加します。メトリックを取得したプロセスを追跡する「 instance 」および「 job 」ラベル。 ここで、すべてのディメンションの合計リクエストレートを確認するには、 ` sum()+`集計演算子を使用できます。

sum(rate(demo_api_request_duration_seconds_count{job="demo"}[5m]))

ただし、これは_all_次元で集計し、単一の出力シリーズを作成します。

image:https://assets.digitalocean.com/articles/prometheus_querying/summing.png [すべてのリクエストレートディメンションの合計]

ただし、通常は、出力のディメンションの_some_を保持する必要があります。 このため、 `+ sum()`およびその他のアグリゲーターは、集約するディメンションを指定する ` without(<label names>)`句をサポートします。 また、保持するラベル名を指定できる ` by(<label names>)+`句の反対の代替手段もあります。 3つすべてのサービスインスタンスとすべてのパスで合計された合計リクエストレートを知りたいが、メソッドとステータスコードで結果を分割したい場合、次のクエリを実行できます。

sum without(method, status) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m]))

これは以下と同等です。

sum by(instance, path, job) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m]))

結果の合計は、「インスタンス」、「パス」、および「ジョブ」でグループ化されます。

image:https://assets.digitalocean.com/articles/prometheus_querying/preserving.png [集計中に一部の寸法を保持]

Prometheusは次の集計演算子をサポートします。それぞれの演算子は、保持するディメンションを選択するために、 `+ by()`または ` without()+`句をサポートします。

  • + sum +:集約されたグループ内のすべての値を合計します。

  • + min +:集約されたグループ内のすべての値の最小値を選択します。

  • + max +:集約されたグループ内のすべての値の最大値を選択します。

  • + avg +:集約されたグループ内のすべての値の平均(算術平均)を計算します。

  • + stddev +:集約されたグループ内のすべての値のhttps://en.wikipedia.org/wiki/Standard_deviation [標準偏差]を計算します。

  • + stdvar +:集計グループ内のすべての値のhttps://en.wikipedia.org/wiki/Variance [標準分散]を計算します。

  • + count +:集約されたグループ内のシリーズの総数を計算します。

これで、シリーズのリストを集計する方法と、関心のあるディメンションのみを保持する方法を学習しました。

ステップ7-算術の実行

このセクションでは、プロメテウスで算術を行う方法を学びます。

最も単純な算術の例として、プロメテウスを数値計算機として使用できます。 たとえば、* Console *ビューで次のクエリを実行します。

(4 + 7) * 3

`+ 33 +`の単一のスカラー出力値を取得します。

image:https://assets.digitalocean.com/articles/prometheus_querying/scalar.png [スカラー演算結果]

スカラー値は、ラベルのない単純な数値です。 これをさらに便利にするために、Prometheusでは時系列ベクトル全体に一般的な算術演算子( +-+ * ++ / +)を適用できます。 。 たとえば、次のクエリは、シミュレートされた最後のバッチジョブで処理されたバイト数をMiBに変換します。

demo_batch_last_run_processed_bytes{job="demo"} / 1024 / 1024

結果はMiBに表示されます:

image:https://assets.digitalocean.com/articles/prometheus_querying/mib.png [MiB変換された処理済みバイト]

これらのタイプの単位変換には単純な算術を使用するのが一般的ですが、優れた視覚化ツール(Grafanaなど)も変換を処理します。

プロメテウスの専門分野(およびプロメテウスが本当に輝いている場所)は、2つの時系列セット間のバイナリ算術です。 2組のシリーズ間でバイナリ演算子を使用する場合、Prometheusは操作の左右で同じラベルセットを持つ要素を自動的に一致させ、一致する各ペアに演算子を適用して出力シリーズを生成します。

たとえば、 + demo_api_request_duration_seconds_sum +`メトリックスはHTTPリクエストへの応答に費やされた秒数を示し、 `+ demo_api_request_duration_seconds_count +`は_many_ HTTPリクエストがどのようにあったかを示します。 両方のメトリックのディメンションは同じです( `+ method i、` + path + + status`、 + instance、` + job`)。 これらの各ディメンションの平均リクエストレイテンシを計算するために、リクエストに費やした合計時間をリクエストの総数で割った比率をクエリするだけです。

   rate(demo_api_request_duration_seconds_sum{job="demo"}[5m])
/
   rate(demo_api_request_duration_seconds_count{job="demo"}[5m])

また、操作の両側に `+ rate()+`関数をラップして、最後の5分間に発生したリクエストのレイテンシのみを考慮することに注意してください。 これにより、カウンタのリセットに対する復元力も追加されます。

結果の平均リクエスト遅延グラフは次のようになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/average_latency.png [平均リクエスト遅延のグラフ化]

しかし、ラベルが両側で正確に一致しない場合はどうしますか? これは、操作の両側に異なるサイズの時系列セットがある場合に特に起こります。一方の側には他方の側よりも多くの次元があるためです。 たとえば、デモジョブは、さまざまなモード(「+ idle」、「+ user」、「+ system」)で費やされた架空のCPU時間を、「+ mode 」ラベルディメンションのメトリック「 demo_cpu_usage_seconds_total 」としてエクスポートします。 また、CPUの架空の合計数を「 demo_num_cpus +」としてエクスポートします(このメトリックに余分なディメンションはありません)。 3つのモードのそれぞれについて、平均CPU使用率をパーセントで算出するために、一方を他方に分割しようとした場合、クエリは出力を生成しません。

# BAD!
   # Multiply by 100 to get from a ratio to a percentage
   rate(demo_cpu_usage_seconds_total{job="demo"}[5m]) * 100
/
   demo_num_cpus{job="demo"}

これらの1対多または多対1のマッチングでは、マッチングに使用するラベルのサブセットをPrometheusに伝える必要があり、余分な次元の処理方法を指定する必要もあります。 一致を解決するために、一致するラベルを指定する二項演算子に `+ on(<label names>)`句を追加します。 より大きな側面の余分な次元の個々の値によって計算を広げてグループ化するには、 ` group_left(<label names>)`または ` group_right(<label names>)+`句を追加してそれぞれ左側または右側の余分な寸法。

この場合の正しいクエリは次のとおりです。

   # Multiply by 100 to get from a ratio to a percentage
   rate(demo_cpu_usage_seconds_total{job="demo"}[5m]) * 100
/ on(job, instance) group_left(mode)
   demo_num_cpus{job="demo"}

結果は次のようになります。

image:https://assets.digitalocean.com/articles/prometheus_querying/average_cpu.png [モードごとの平均CPU使用率のグラフ化]

`+ on(job、instance)`は、演算子に、それらの ` job `および ` instance `ラベルで左右のシリーズのみに一致するよう指示します(したがって、 ` mode `ラベルでは一致しません。一方、 ` group_left(mode)`句は、モードごとのCPU使用率の平均をファンアウトして表示するようオペレーターに指示します。 これは、多対1一致の場合です。 逆(1対多)マッチングを行うには、同じ方法で ` group_right(<label names>)+`句を使用します。

これで、時系列セット間で算術演算を使用する方法と、さまざまなディメンションを処理する方法がわかりました。

結論

このチュートリアルでは、デモサービスインスタンスのグループを設定し、Prometheusで監視しました。 次に、収集したデータに対してさまざまなクエリ手法を適用して、関心のある質問に答える方法を学びました。 これで、シリーズを選択してフィルター処理する方法、ディメンション全体を集計する方法、レートまたはデリバティブを計算する方法、または算術を行う方法がわかりました。 また、一般的なクエリの構築にアプローチする方法と、Prometheusサーバーの過負荷を回避する方法も学びました。

ヒストグラムからパーセンタイルを計算する方法、タイムスタンプベースのメトリックを処理する方法、またはサービスインスタンスの状態をクエリする方法など、Prometheusのクエリ言語の詳細については、https://www.digitalocean.com/community/に進んでください。 tutorials / how-to-query-prometheus-on-ubuntu-14-04-part-2 [Ubuntu 14.04でPrometheusを照会する方法パート2]。

Related