【Prometheus】PromQLを使ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/07352d4c-0284-c65d-80a2-ab90f2ed7783.png)

#概要

- Prometheusの原則
- Prometheusデータの概念
- インストールと構成の側面
- PromQLを使用したPrometheusクエリ
- まとめ

この記事では、一般的な監視ツールであるPrometheusと、PromQLの使用方法に焦点を当てます。 PrometheusはGo言語を使用しており、多くのサービスとシステムを同時に監視できます。 これらのマルチコンポーネントシステムをより適切に監視できるようにするため、Prometheusには強力な組み込みデータストレージとタグ付け機能があります。 PromQLを使用してこれらのメトリックをクエリするには、Prometheusのデータストレージのアーキテクチャと、メトリックの命名とタグ付けの仕組みを理解する必要があります。

ここからは、Prometheusの原理とデータストレージアーキテクチャについて説明し、PromQLの使用方法の10例の概要を紹介していきます。 
この記事で学んだことを[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Getting%20started%20with%20PromQL)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Getting%20started%20with%20PromQL)で試してみてください。 Hosted Prometheusサービスがあり、データの送信を開始して、すぐにクエリを練習できます。

#Prometheusの原則
Prometheusは、次のデータ操作のための一連のツールと考えることができます。

- ストレージ
- 集計
- 視覚化
- アラート

Prometheusの利点は、1つの場所から多くのシステムとサーバーを制御する機能を提供することです。 Prometheusは、分散型の自己管理型アーキテクチャでこれを実現します。 同時に、個々のコマンドを個々のサーバーに使用できます。

これを既存のデータベースと比較すると、Prometheusは時系列データベースであり、機能を監視およびデータ分析に拡張するさまざまなツールを追加できます。

Prometheusアーキテクチャの一般的な構造について説明し、それがどのように機能するかの背後にある原理をよりよく理解しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/34392970-5086-b540-587d-3bee86dbc1a1.png)

Prometheusには、次のコンポーネントが含まれています。

- **Prometheusサーバー**は、データ要求（メトリック）を処理してデータベースに保存するサーバーです。
- **ターゲット（[エクスポーター](https://prometheus.io/docs/instrumenting/exporters/)）** – 監視プロセスが実行されるシステムまたはサービス。 ほとんどの場合、サーバーに定期的にデータを送信します。 彼らは、Prometheusサーバーが理解できる形式でデータをエクスポートします。
- **[Pushgateway](https://prometheus.io/docs/practices/pushing/)**は、短期間のジョブのメトリックを処理するコンポーネントです。
- **ダッシュボード** – ネイティブWebインターフェースまたは[Grafana](https://grafana.com/)を使用したメトリックの視覚化。
- **[クライアントライブラリ](https://prometheus.io/docs/instrumenting/clientlibs/)**: さまざまなプログラミング言語とデータエクスポートツールを接続します。
- **[Alertmanager](https://prometheus.io/docs/alerting/alertmanager/)**: 通知を送信するためのマネージャー

このアーキテクチャーのコアはPrometheusサーバーで、データを個別に処理し、ローカルまたは選択したリソースに保存します。オブジェクトをスクレイピングして、メトリックに必要な重要な情報を受け取ります。その結果、個々のシステムではなく、Prometheus側でのみ監視プロセスを構成する必要があります。このアプローチにより、監視システムの展開が簡素化されます。必要なのは、サーバーをインストールして監視パラメーターを定義することだけです。

メトリックコレクションは、プルおよびプッシュメカニズムで実装されます。 2番目のケースでは、保護されたシステムからメトリックをエクスポート（収集）するために、または接続プロセスを短時間で実行する必要がある場合に、特別なプッシュゲートウェイコンポーネントを使用します。 Prometheusは、さまざまなテクノロジー向けのすぐに使用できる輸出業者のコレクションを提供します。

次に、ネイティブクエリ言語PromQLを使用すると、受信したデータセットから必要な情報を選択し、Grafanaダッシュボードを使用してそのデータを分析および視覚化できます。 Alertmanagerはこのデータから通知を生成し、電子メール、PagerDutyなどの方法を使用して通知を送信します。

#Prometheusデータの概念
Prometheusでのデータ表現は、データ表現のモデルとメトリックタイプの2つの要因に依存します。 PromQLコマンドの監視と正しいプログラミングのプロセスを理解するために、これら2つの要因とPrometheusでのそれらのアプリケーションについて簡単に説明します。

Prometheusメトリックから始めましょう。 それらの計算と処理は、監視の重要で不可欠な段階です。 一般に、メトリックは監視対象オブジェクトの状態を表す数値インジケータです。 リモートサーバーを監視するためのメトリックの簡単な例は、プロセッサ、メモリ、ディスク、ネットワークなどのリソースの監視です。同様に、訪問者数、サーバーの応答時間、主要な要求などのWebリソースの統計情報を監視することもできます。

ここで、さまざまな種類のPrometheusメトリック表示を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/28bc42fc-4af3-0525-42c2-81ff95e29ebe.png)

- カウンター (Counter)–時間とともに増加する値のみを受け入れ、保存します。
- ゲージ (Gauge)–増加と減少の両方が可能な、異なる値を取ることができる値を格納します。
- ヒストグラム (Histogram)–観測値（通常はリクエスト期間や応答サイズなど）をサンプリングし、構成可能なバケットでカウントします。 また、すべての観測値の合計が提供されるため、平均を計算できます。
- 要約 (Summary)–追加の統計（分位数）を使用した、より詳細なデータ表現のヒストグラム。

メトリックを適切かつ正確に表示するための重要な要件は、対応するデータタイプの選択です。たとえば、Gaugeは、期間中のメトリックの進化を常に正しく表示するとは限りません。このためには、ヒストグラムメトリックを使用する必要があります。また、ヒストグラムとサマリーのどちらを選択するかは、一定期間または継続的な評価などデータプレゼンテーションのニーズによって決まります。

それでは、Prometheusのメトリック構造化システムに進みましょう。各メトリックには、測定対象のシステムの側面を表すメトリック名があります。オプションで、各メトリックにラベルを割り当てることもできます。ラベルを追加すると、メトリック名で定義されたより大きなグループ内に時系列のサブセットが作成されます。各メトリック名とラベルは値とペアになっています。値はシステムから送信された実際の数値データポイントです。メトリック名、ラベル、値はセットとして保存され、この情報を使用して時系列情報を照会します。

- メトリック名は、測定するシステム機能を説明します
- ラベルはメトリックの数値を格納します
- 値は、監視している機能から送信された数値データポイントです。
 
以下では、このモデルをグラフとして示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/7181cb16-a27d-afaf-6cd2-328365b07492.png)

したがって、ラベルを使用してデータをフィルタリングすることで、より柔軟にモデルを構成できます。 フィルタリングは、クエリに含めるラベルを選択するプロセスです。 通常、これにより、Prometheusで高速かつ単純なデータ集約が可能になります。

Prometheusの詳細については、[公式ドキュメント](https://prometheus.io/docs/prometheus/latest/querying/basics/)をご覧ください。

#インストールと構成の側面
Prometheusのアーキテクチャにより、ほぼすべてのプラットフォームに非常に簡単に統合できます。 基本的なインストール手順は、Prometheusサーバーのデプロイ、[エクスポーター](https://prometheus.io/docs/instrumenting/exporters/)の構成、およびクライアントライブラリの構成で構成されます。 Prometheusのセットアップとインストールの詳細については、[PrometheusをKubernetesにデプロイする](https://qiita.com/MetricFire/items/1ae3d0ed0aa230e40f63)および[Prometheusを基礎から解説](https://qiita.com/TomoEndo/items/8a16632590ac558a9a14)をご覧ください。

簡単な概要については、このセクションの最も重要なポイントを見ていきます。 Prometheusコンポーネントには、コンパイル可能なバイナリファイルがあり、内部プログラムの依存関係と[libc](https://www.gnu.org/software/libc/)サポートのみが必要です。 したがって、Prometheusモニタリングシステムは、ほぼすべてのプラットフォームで動作します。さまざまなサーバーシステムや、LinuxまたはWindowsを搭載したユーザーコンピューターでも動作します。

インストール方法は3つあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/8c242f20-6222-c88b-26e3-60aff4ebaec0.png)

- パッケージマネージャを使用（Linuxのみ）
- [公式Webサイト](https://prometheus.io/download/)のバイナリソースファイルを使用する（利用可能なすべてのプラットフォーム）
- インストールされたシステムをDocker[コンテナ](https://hub.docker.com/u/prom)にデプロイする
 

最初の方法は最も簡単です。パッケージを見つけて、インストールを開始します。 ただし、Linuxリポジトリには最新のソフトウェアバージョンが含まれていないことがよくあります。 2番目の方法はユーザー側から見ると最も複雑ですが、監視システムのすべてのコンポーネントをカスタマイズできます。 Dockerコンテナーを使用する方法は、リモートサーバーまたは一部のクラウドプラットフォームに展開する段階で便利です。

インストール手順の後、[prometheus.yml](https://prometheus.io/docs/prometheus/latest/configuration/configuration/)ファイルでオプションを定義して、Prometheusを構成する必要があります。 主な設定を以下に示します。

- **スクレイピング間隔**: スクレイピングの時間間隔
- **評価間隔**: ルールと比較する時間間隔
- **スクレイプ構成**: 監視ターゲットを定義および設定
- **ルールファイル**: 監視ルールへのパス

これらのパラメータの具体的な値は、監視の目的とターゲットによって異なります。 この記事では、Prometheusを使用してWindows上のローカルコンピューターリソースを監視します。 次に、システム要件に一致するソースバイナリファイルを選択し、バージョン2.15.2でPrometheusを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/da12673d-1014-7e53-b33a-fafef63ffa68.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/0a69ab09-7990-4bdd-17b0-f3312999f9a7.png)

Webインターフェースは、ローカルのPrometheusサーバーおよび関連するパラメーターと監視オプションへのアクセスを提供します。 接続されているモジュールとサーバーの全体的なステータスを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/59af8ba7-9655-b8b0-20be-8b7e0cb7b3fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/acede574-ba79-3d16-9b9a-95d3cb24ec65.png)

また、このインターフェースは、PromQLでの事前定義メトリックとカスタムクエリの使用をサポートしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/f2686310-6488-f553-a51c-49975501bb47.png)

以下のPromQLクエリの記述方法を見てみましょう。

#PromQLを使用したPrometheusクエリ
PromQLは、クエリを作成し、Prometheusサーバーからデータを抽出またはフィルタリングするための言語です。 これは、Prometheusデータ表現モデルを「Key＆Value」の形式で使用し、結果をベクトルとして返します。

Prometheusは2つのタイプのベクトルを返すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/0fd831a6-6abe-0389-c601-ad4816de3e10.png)

**インスタントベクトル**: 最後の時間間隔内からのすべてのメトリックの要求された値の出力。
**範囲ベクトル**: 選択した期間に対して計算される一連のベクトルとしていくつかのメトリックの値を表します。
 
使用するベクトルのタイプの選択は、リクエストしているメトリックと探している結果によって異なります。 メトリックの表示を要求すると、これらのベクトルの値が組み込みのWebインターフェースにグラフィックとして表示されます。 このようなリクエストの10の簡単な例でこれを示します。

1. カウンタメトリック**prometheus_http_requests_total**を使用して、常時時系列の値を表示しましょう。 これにより、このメトリック名または「キー」で示されるすべてのデータが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/fa161be9-98e6-ff15-0f59-ef05f9c939f6.png)

2. 次に、例1と同じメトリックを見てみましょう。ただし、ラベルをいくつか追加します。 「job」と「code」のラベルの値を追加してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/42234acc-f5d7-f19d-8d8b-fef6b94f8eb0.png)

このクエリの結果は、グラフまたはダッシュボードです。 また、グラフインターフェイスの日時基準を使用して、重要なデータをフィルタリングすることもできます。


3. 例1のメトリックをもう一度見てみましょう。時間間隔コンポーネントを追加してみましょう。 次の例では、クエリの最後に[15m]と入力して、間隔コンポーネントを追加しています。 結果は、グラフタブではなく、Webインターフェイスのコンソールタブに表示されます。 結果は値のリストとして表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/b20d8fff-1f03-b030-db34-2e07da310eef.png)

ベクトルはタイムスタンプごとに複数の値を持っているため、グラフを描画できないことに注意してください。

4.複雑なフィルターを作成するには、Go – RE2構文に正規表現を使用します。 「handler」フィールドと「In」記号で始まる「le」フィールドのすべての「/ alerts」値を除外するヒストグラムメトリックのフィルターを作成してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/1d5e8689-f79c-fc85-cd49-9ef11a68ba28.png)

クエリ実行の結果は、指定されたメトリックのフィルタリングされた値を除外するダッシュボードです。 このようにして、視覚化から不要なデータを除外できます。

5. 他のフィルタリングルールを使用して、さらに複雑なクエリを作成できます。 次の例では、インスタンス名、および「Code」の2つの特定の値でフィルタリングします。 「Localhost：9090」という名前のインスタンスのみを表示し、「Code」が503または400のいずれかに等しいことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/62c09831-e83b-3946-b261-677c61e4dfe2.png)

「Code」の2つの値をクエリすると、「and」と「or」の両方の論理関数が自動的に視覚化されることに注意してください。

6. PromQLクエリ機能では、名前を使用してさまざまなメトリックを組み合わせるフィルターを作成することもできます。 同様の名前のヒストグラムおよびカウンターメトリックについてそれを示しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/3f59f0ce-3ec2-f353-2701-d6ac54f4c793.png)


このアプローチにより、類似した名前を持つ単純なメトリック値の集計が可能になります。

7. 通常、詳細分析には計算機能が必要です。 それらの1つは、時系列の1秒あたりのレートを計算するレート関数です。 詳細については、[Prometheusのrate（）に関する記事](https://qiita.com/TomoEndo/items/356054a458f4ef88d86c)をご覧ください。 例1の[10m]時間値を使用して、カウンターメトリックのrate（）クエリを作成してみましょう。 [10m]時間値は、グラフ上の各ポイントについて1秒あたりのレートが計算される時間の範囲を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/e7968aa3-1430-bb27-4d84-91ba26d76f52.png)

8. PromQLは、基本的な比較、論理、および[算術演算](https://prometheus.io/docs/prometheus/latest/querying/operators/#arithmetic-binary-operators)で動作します。 以下で調べてみましょう。

[比較と論理演算](https://prometheus.io/docs/prometheus/latest/querying/operators/#arithmetic-binary-operators)：

- greater (>)
- greater-or-equal (>=)
- less (<)
- less-or-equal (<=)
- equal (==)
- not equal (!=)
- and (intersection)
- or (union)
- unless (complement)

[算術演算](https://prometheus.io/docs/prometheus/latest/querying/operators/#arithmetic-binary-operators)：

- 足し算 (+)
- 引き算 (-)
- 割り算 (/)
- 掛け算 (*)
- 累乗 (^)
- 剰余演算 (%)

この機能は、追加のデータ分析のための基本的な計算を提供します。 例として、これらは測定単位を必要な形式に変換するために使用できます。 次に、バイト単位で記録された仮想メモリサイズデータをゲージメトリックのメガバイトに変換する方法を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/81638a28-32eb-f098-e967-23b4db872fed.png)

算術演算は時系列で実行でき、これらの演算はこれらの系列の対応する値に対してのみ可能です。

また、要約メトリックといくつかの制限へのパラメーターの制限を伴う比較操作の例も示していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/aba018ad-468e-ad8b-8b9f-ca68631fb414.png)

9.　多くの場合、多くのラベルの場合、それらを正しくグループ化して集約する必要があります。 PromQLには、この問題のための[組み込み機能](https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators)があります。 前の例と同じメトリックとrate（）計算を使用してそれを実証しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/b7f56881-6140-fcaf-39ea-cad2f42055af.png)

ご覧のとおり、結果のデータはクエリの対応するカテゴリで並べ替えられています。 このような機能は、さらに分析するために監視データを準備するのにとても役立ちます。

10.　通常、ゲージタイプのメトリックを使用する場合、メトリック値を制限、スケーリング、または変換する必要があります。 このタイプのクエリを実装するには、[<aggregation> _over_time PromQL](https://prometheus.io/docs/prometheus/latest/querying/functions/#aggregation_over_time)機能を使用する必要があります。 デモとして、定義された時間範囲ごとの平均リクエスト数の統計データを計算するために使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/dc879cfe-962c-63f6-e46f-1ffee2263116.png)

Prometheusモニタリングシステムによるクエリの柔軟なカスタマイズを示すために、PromQL機能のごく一部のみを示しました。 PromQL機能の完全なリストと説明は、[公式Webサイト](https://prometheus.io/docs/prometheus/latest/querying/functions/)で入手できます。

#まとめ
この記事では、PromQLに重点を置いて、Prometheusモニタリングシステムの基本機能を紹介します。 基本的な原理とその操作の機能について説明しました。これは、将来のタスクで使用するのに役立ちます。 また、PromQLを使用してクエリを作成する機能と機能も示しました。

Hosted Prometheusサービスを試してみたい方は、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Getting%20started%20with%20PromQL)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Getting%20started%20with%20PromQL)をお試しください。 私たちのプラットフォーム内でPromQLの使用を開始できます。 また、MetricFireがモニタリングのニーズにどのように役立つかについて興味がある場合は、[デモを予約](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Getting%20started%20with%20PromQL)して直接弊社にご連絡ください。