このトピックでは、メトリックデータに対するクエリと分析の構文と制限について説明します。
Simple Log Service は、メトリックデータに対するクエリと分析について、次のタイプの構文をサポートしています。
PromQL: PromQL は、Prometheus が提供するクエリ言語です。 PromQL 構文を使用すると、メトリックデータに対するクエリと分析を簡素化できます。 詳細については、「Prometheus ドキュメント」をご参照ください。
SQL: SQL 構文を使用して、データのエンコード形式に基づいてメトリックデータのクエリと分析を実行できます。
SQL と PromQL の組み合わせ: Simple Log Service が提供する 5 つの PromQL 関数と共に SQL 構文を使用して、ネストされたクエリを実行できます。 PromQL 構文を使用する場合、Simple Log Service の機械学習構文も使用できます。 詳細については、「機械学習構文」をご参照ください。
クエリと分析に PromQL 構文または SQL と PromQL の組み合わせを使用する場合、指定するメトリック名とラベルは命名規則に準拠している必要があります。 詳細については、「メトリック識別子」をご参照ください。
PromQL
PromQL 構文の使用方法の例を次に示します。
メトリック名が http_requests_total で、job ラベルが apiserver で、handler ラベルが /api/comments である時系列をクエリします。
http_requests_total{job="apiserver", handler="/api/comments"}
過去 5 分間の app と proc でグループ化された上位 3 つの CPU ユーザーをクエリします。 app はアプリケーションを指定し、proc はプロセス タイプを指定します。
topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))
異常なポッドをクエリします。
min_over_time(sum by (namespace, pod) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed"})[15m:1m]) > 0
Kubernetes DaemonSet の CPU 使用率の合計をクエリします。
sum (rate (container_cpu_usage_seconds_total{pod=~"^x.*$",cluster=~".*",namespace=~".*"}[1m])) / sum (kube_pod_container_resource_limits_cpu_cores{pod=~"^null.*$",cluster=~".*",namespace=~".*"}) * 100
PromQL 構文の詳細については、「Prometheus ドキュメント」および「クエリの例」をご参照ください。
SQL
SQL 構文の使用方法の例を次に示します。
すべてのデータをクエリおよび分析します。
*| SELECT * FROM "my_metric_store.prom" WHERE __name__ != ''
http_request_count メトリックについて、__labels__, 'domain' フィールドの値が www.example.com であるデータをクエリし、__value__ フィールドの値の合計を取得します。
*| SELECT sum(__value__) FROM "my_metric_store.prom" WHERE __name__='http_request_count' and element_at(__labels__, 'domain')='www.example.com'
http_request_count メトリックについて、__labels__, 'domain' フィールドの値が www.example.com であるデータをクエリし、__value__ フィールドの値の合計を取得し、1 時間ごとにデータを集計します。
*| SELECT sum(__value__),date_trunc('hour', __time_nano__/1000000) as t FROM "my_metric_store.prom" WHERE __name__='http_request_count' and element_at(__labels__, 'domain')='www.example.com' GROUP BY t ORDER BY t DESC
SQL 構文の一覧を次に示します。
メトリックデータの SQL 構文は、ログデータの SQL 構文と同じです。 詳細については、「ログ分析の概要」をご参照ください。 SQL 構文を使用してメトリックデータをクエリおよび分析する場合、FROM 句のテーブル名は {metrics_store_name}.prom 形式である必要があります。 {metrics_store_name} は、作成する Metricstore の名前を指定します。
説明テーブル名は二重引用符( "" )で囲む必要があります。
element_at() 関数を使用して、__labels__ フィールドからキーの値を取得できます。 例: element_at(__labels__, 'key')。
テーブルスキーマの詳細については、「エンコード形式」をご参照ください。
SQL と PromQL の組み合わせ
Simple Log Service は、7 つの PromQL 関数を提供します。 promql_query、promql_labels、promql_label_values、promql_series の各関数は、Metricstore のクエリと分析ページでのみ呼び出すことができます。 次の表に、これらの関数を示します。
SQL と PromQL の組み合わせを使用する場合、FROM 句のテーブル名は metrics である必要があります。
PromQL 関数の API エンドポイントと説明の詳細については、「Prometheus ドキュメント」をご参照ください。
関数 | 説明 | 例 |
promql_query(string) | インスタントクエリを評価します。 この関数を呼び出して、特定の時間範囲の終了時刻に最も近いデータをクエリできます。 この関数は、Prometheus の /query API と同等です。 パラメータ設定: query=<string> および time=<EndTime>。 | *| SELECT promql_query('up') FROM metrics |
promql_query_range(string, string) | StartTime パラメータと EndTime パラメータで指定された時間範囲内のデータに対してクエリを評価します。 この関数は、Prometheus の /query_range API と同等です。 パラメータ設定: query=<string>、step=<duration>、start=<StartTime>、end=<EndTime>。 | *| SELECT promql_query_range('up', '5m') FROM metrics |
promql_labels() | すべてのラベルキーを返します。 デフォルトでは、[<EndTime> - 5 分、<EndTime>] の範囲内のデータのみが返されます。 | *| SELECT promql_labels() FROM metrics |
promql_labels(string) | 特定の条件に一致するラベルキーを返します。 match[] パラメータを追加して、<series_selector> によって一致する時系列からラベルキーを返すことができます。 match[] パラメータには 1 つの条件のみを指定できます。 例: promql_labels('up')。 デフォルトでは、[<EndTime> - 5 分、<EndTime>] の範囲内のデータのみが返されます。 | *| SELECT promql_labels('up') FROM metrics |
promql_label_values(string) | ラベルの値を返します。 デフォルトでは、[<EndTime> - 5 分、<EndTime>] の範囲内のデータのみが返されます。 | *| SELECT promql_label_values('__name__') FROM metrics |
promql_label_values(string, string) | 特定の条件に一致するラベル値を返します。 match[] パラメータを追加して、<series_selector> によって一致する時系列から特定のラベルの値を返すことができます。 match[] パラメータには 1 つの条件のみを指定できます。 match[] パラメータの後に label パラメータを指定する必要があります。 例: promql_label_values('up', '__label_name__')。 デフォルトでは、[<EndTime> - 5 分、<EndTime>] の範囲内のデータのみが返されます。 | *| SELECT promql_label_values('up', '__label_name__') FROM metrics |
promql_series(string) | 一致する時系列を返します。 デフォルトでは、[<EndTime> - 5 分、<EndTime>] の範囲内のデータのみが返されます。 | *| SELECT promql_series('up') FROM metrics |
PromQL 関数はユーザー定義テーブル生成関数( UDTF )に似ており、テーブルを返します。
次の表に、promql_query(string) 関数または promql_query_range(string, string) 関数によって返されるテーブルのスキーマを示します。
フィールド
タイプ
説明
metric
varchar
時系列のメトリック名。 クエリ文に GROUP BY 句が含まれている場合、このフィールドは空の場合があります。
labels
map<varchar, varchar>
ラベル。 値はマップです。
time
bigint
時間。
value
double
特定の時点での値。
クエリの例:
promql_query(string) 関数
promql_query_range(string, string) 関数
次の表に、promql_labels() 関数、promql_labels(string) 関数、promql_label_values(string) 関数、または promql_label_values(string, string) 関数によって返されるテーブルのスキーマを示します。
フィールド
タイプ
説明
label
varchar
ラベルキー。
クエリの例:
promql_labels() 関数
promql_labels(string) 関数
promql_label_values(string) 関数
promql_label_values(string, string) 関数
次の表に、promql_series(string) 関数によって返されるテーブルのスキーマを示します。
フィールド
タイプ
説明
series
map<varchar, varchar>
時系列。
クエリの例
制限
Metricstore は、/query や /query_range などの Prometheus のクエリ API エンドポイントのみをサポートしています。 /admin、/alerts、/rules などの他の API エンドポイントはサポートされていません。
クエリと分析に PromQL 構文または SQL と PromQL の組み合わせを使用する場合、最大 11,000 時点の値を返すことができます。