ネスト クエリ

概要

Datadog では、各メトリクス クエリは既定で 2 つの集計レイヤーで構成されます。ネスト クエリを使うと、先に実行したクエリの結果を後続のクエリで再利用できます。

ネスト クエリを使うことで、次のような強力な機能が利用できるようになります:

マルチ レイヤー集計

Datadog では、各メトリクス クエリは 2 段階の集計で評価されます。まず時間で集計し、続いてタグ単位で集計します。マルチ レイヤー集計を使うと、時間集計またはタグ集計のレイヤーをさらに重ねられます。集計の詳細は、メトリクス クエリの構造 を参照してください。

ネスト クエリ適用の前後の例

マルチ レイヤー時間集計

rollup 関数を使うと、マルチ レイヤー時間集計を利用できます。メトリクス クエリには最初から rollup (時間集計) が含まれており、グラフに表示されるデータ ポイントの粒度を制御します。詳しくは、ロールアップ ドキュメントを参照してください。

後続の rollup を重ねることで、時間集計のレイヤーを追加できます。

最初の rollup では、次の集計子を使用できます:

  • avg
  • sum
  • min
  • max
  • count

マルチ レイヤー時間集計で追加する後続レイヤーでは、次の時間集計子を使用できます:

  • avg
  • sum
  • min
  • max
  • count
  • arbitrary percentile pxx (p78, p99, p99.99, etc.)
  • stddev

マルチ レイヤー時間集計は次の関数と組み合わせて使用できます:

サポートされる関数説明
算術演算子+, -, *, /
Timeshift 関数<METRIC_NAME>{*}, -<TIME_IN_SECOND>
hour_before(<METRIC_NAME>{*})
day_before(<METRIC_NAME>{*})
week_before(<METRIC_NAME>{*})
month_before(<METRIC_NAME>{*})
Top-k 選択top(<METRIC_NAME>{*}, <LIMIT_TO>, '<BY>', '<DIR>')

上記に含まれない関数は、マルチ レイヤー時間集計と組み合わせられません。

このクエリではまず、envteam でグループ化した各 EC2 インスタンスの CPU 使用率を平均し、5 分間隔にロールアップします。次にマルチ レイヤー時間集計を適用し、このネスト クエリの結果について 30m 間隔で時間方向の 95 パーセンタイルを算出します。

UI / JSON でのマルチ レイヤー時間集計の例
JSON でのマルチ レイヤー時間集計の例

マルチ レイヤー空間集計

空間集計の 1 つ目のレイヤーでグループ化に使うタグを指定したら、Group By 関数でマルチ レイヤー空間集計を利用できます。

後続の Group By を重ねて、空間集計のレイヤーを追加できます。 注: 最初の空間集計レイヤーでグループ化するタグを指定しない場合、マルチ レイヤー空間集計は利用できません。

空間集計の最初のレイヤーでは、次の集計子をサポートします:

  • avg by
  • sum by
  • min by
  • max by

空間集計の追加レイヤーでは、次の集計子をサポートします:

  • avg by
  • sum by
  • min by
  • max by
  • arbitrary percentile pXX (p75, p99, p99.99, etc.)
  • stddev by

マルチ レイヤー空間集計は次の関数と組み合わせて使用できます:

サポートされる関数説明
算術演算子+, -, *, /
Timeshift 関数<METRIC_NAME>{*}, -<TIME_IN_SECOND>
hour_before(<METRIC_NAME>{*})
day_before(<METRIC_NAME>{*})
week_before(<METRIC_NAME>{*})
month_before(<METRIC_NAME>{*})
Top-k 選択top(<METRIC_NAME>{*}, <LIMIT_TO>, '<BY>', '<DIR>')

上記に含まれない関数は、マルチ レイヤー空間集計と組み合わせられません。

パーセンタイルの空間集計子を除き、空間集計子は引数が 1 つで、グループ化に使うタグ キーを指定します。パーセンタイルの空間集計子は 2 つの引数が必要です:

  • 任意のパーセンタイル pXX
  • グループ化するタグ

初期クエリ avg:aws.ec2.cpuutilization{*} by {env,host}.rollup(avg, 300) は、envhost でグループ化した CPU 使用率の平均を 5 分ごとに計算します。続いてマルチ レイヤー空間集計を適用し、env ごとに平均 CPU 使用率の最大値を算出します。

UI または JSON タブでは、次のように表示されます:

UI でのマルチ レイヤー空間集計の例
JSON でのマルチ レイヤー空間集計の例

集計済みの count/rate/gauge に対するパーセンタイルと標準偏差

時間集計と空間集計のマルチ レイヤー集計を使うと、count/rate/gauge のクエリ結果からパーセンタイルや標準偏差を取得できます。大規模データ セットのばらつきや分布をつかみやすくなり、外れ値も見つけやすくなります。

: ネスト クエリ内のパーセンタイルまたは標準偏差の集計子は、すでに集計された count/rate/gauge メトリクスの結果を使って計算されます。未集計の生データ (raw) からグローバルに正確なパーセンタイルを求めたい場合は、代わりに ディストリビューション メトリクス を使用してください。

マルチ レイヤー時間集計では、パーセンタイルを使ってネスト クエリの結果 (5 分ごとに envteam 別の平均 CPU 使用率) を要約できます。具体的には、このネスト クエリの p95 値を 30 分ごとに計算します。

UI でネスト クエリを用いて MLA 時間集計のパーセンタイルを算出する例
JSON でネスト クエリを用いて MLA 時間集計のパーセンタイルを算出する例

マルチ レイヤー空間集計では、パーセンタイルを使ってネスト クエリの結果 (5 分ごとに envteam 別の平均 CPU 使用率) を要約できます。具体的には、このネスト クエリの p95 値を、env の各ユニーク値ごとに算出します。

UI または JSON タブでは、次のように表示されます:

UI でネスト クエリを用いて MLA 空間集計のパーセンタイルを算出する例
JSON でネスト クエリを用いて MLA 空間集計のパーセンタイルを算出する例

標準偏差は、データ セットのばらつき (散らばり) を測る指標です。次のクエリでは、マルチ レイヤー時間集計で標準偏差を使用し、ネスト クエリ (API リクエスト数の合計を 4 時間で平均化したもの) の標準偏差を、より長い 12 時間区間で計算します:

UI または JSON タブでは、次のように表示されます:

UI でネスト クエリと標準偏差を使用する例
JSON でネスト クエリと標準偏差を使用する例

過去の期間に対する高解像度クエリ

各メトリクス クエリには、表示されるデータ ポイントの粒度を制御する初期の時間集計レイヤー (rollup) が含まれています。Datadog では、クエリ対象期間が長くなるほど既定の rollup 間隔も粗くなるように設計されています。ネスト クエリを使えば、長い過去期間でもより細かな高解像度データにアクセスできます。

UI で過去期間に対して高解像度クエリを実行する例

従来は、過去 1 か月のメトリクスをクエリすると、既定で 4 時間粒度のデータが表示されていました。ネスト クエリを使うと、この過去期間でもより細かな粒度のデータを参照できます。以下は過去 1 か月を対象にした例です。まずクエリ バッチ カウントを 5 分間隔で rollup し、その後マルチ レイヤー時間集計を適用して、このネスト クエリの時間方向の標準偏差を 4 時間区間で算出します。こうすることで、より人が読み取りやすいグラフにできます。

: Datadog では、最初の rollup はできるだけ細かい間隔で定義し、その後により粗い rollup 間隔のマルチ レイヤー時間集計を使って、読みやすいグラフに整えることを推奨しています。

UI または JSON タブでは、次のように表示されます:

UI でネスト クエリを用いて高解像度クエリを実行する例
JSON でネスト クエリを用いて高解像度クエリを実行する例

moving rollup

Datadog には、指定した時間ウィンドウでデータ ポイントを集計できる moving_rollup 関数があります。詳しくは moving rollup を参照してください。ネスト クエリを使うと、この関数を拡張して lookback モードを取り込み、元のクエリ ウィンドウを超えるデータ ポイントも分析できるようになります。これにより、指定した時間ウィンドウにおけるクエリの傾向やパターンを、より包括的に把握できます。

従来版と新しい moving_rollup 関数の比較例

既存の moving_rollup 関数がサポートする集計子は次のとおりです:

  • avg
  • sum
  • min
  • max
  • median

クエリをネストする場合、利用できるのは lookback モード版の moving_rollup 関数のみです。このバージョンでは次の集計子をサポートします:

  • avg
  • sum
  • min
  • max
  • count
  • count by
  • arbitrary percentile pxx (p78, p99, p99.99, etc.)
  • stddev

これらの moving_rollups をネストする場合、指定する rollup 間隔は UI または JSON タブに示すとおり段階的に大きくする必要があります:

UI で moving rollup を設定する例
JSON で moving rollup を設定する例

lookback をサポートする新しい moving rollup 関数では、パーセンタイルや標準偏差も利用できます。また、lookback を有効にした moving rollup のネストも行えます。

UI または JSON タブでは、次のように表示されます:

UI で標準偏差を含む moving rollup を設定する例
JSON で標準偏差を含む moving rollup を設定する例

ブール値しきい値のリマップ関数

リマップ関数を使うと、特定の条件に基づいてクエリ結果を絞り込んだり変換したりでき、監視や分析の幅を広げられます。ネスト クエリにより、次の 3 つの新しい関数が利用できるようになります:

  • is_greater (<QUERY>, <THRESHOLD>)
  • is_less (<QUERY>, <THRESHOLD>)
  • is_between (<QUERY>, <LOWER THRESHOLD>, <UPPER THRESHOLD>)

is_greater() は、クエリの値が定数 30 を上回るポイントでは 1.0 を返し、それ以外は 0.0 を返します。

UI または JSON タブでは、次のように表示されます:

UI で is_greater のマッピング関数を使用する例
JSON で is_greater のマッピング関数を使用する例

is_less() は、クエリの値が定数 30 を下回るポイントでは 1.0 を返し、それ以外は 0.0 を返します。

UI または JSON タブでは、次のように表示されます:

UI で is_less のマッピング関数を使用する例
JSON で is_less のマッピング関数を使用する例

is_between() は、クエリの値が 10 と 30 の間 (端点は含まない) のポイントでは 1.0 を返し、それ以外は 0.0 を返します。

UI または JSON タブでは、次のように表示されます:

UI で is_between のマッピング関数を使用する例
JSON で is_between のマッピング関数を使用する例

Datadog の API でネスト クエリを使用する

ネスト クエリの機能は、時系列データをクエリするための公開 API でも利用できます。formula オブジェクトの内容を変更してください。

JSON でネスト クエリを用いて高解像度クエリを実行する例

参考資料