概要

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>')

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

このクエリではまず、env と team でグループ化した各 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) は、env と host でグループ化した CPU 使用率の平均を 5 分ごとに計算します。続いてマルチ レイヤー空間集計を適用し、env ごとに平均 CPU 使用率の最大値を算出します。

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

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

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

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

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

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

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

マルチ レイヤー空間集計では、パーセンタイルを使ってネスト クエリの結果 (5 分ごとに env と team 別の平均 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 でネスト クエリを用いて高解像度クエリを実行する例

参考資料