時系列データストリームのダウンサンプリング

ダウンサンプリングは、時系列データのフットプリントを削減する方法を提供し、低い粒度で保存します。

メトリクスソリューションは、時間とともに増加する大量の時系列データを収集します。そのデータが古くなるにつれて、システムの現在の状態に対する関連性が低下します。ダウンサンプリングプロセスは、固定の時間間隔内のドキュメントを単一の要約ドキュメントにまとめます。各要約ドキュメントには、元のデータの統計的表現が含まれています:各メトリックのためのminmaxsum、およびvalue_count。データストリームの時系列次元は変更されずに保存されます。

ダウンサンプリングは、実質的にデータの解像度と精度をストレージサイズと交換することを可能にします。データが古くなるにつれて、メトリクスデータのボリュームと関連コストを自動的に管理するために、インデックスライフサイクル管理(ILM)ポリシーに含めることができます。

詳細については、以下のセクションを確認してください:

仕組み

時系列は、特定のエンティティに対して時間をかけて取得された観察のシーケンスです。観察されたサンプルは、時系列次元が一定で、時系列メトリックが時間とともに変化する連続関数として表現できます。

時系列関数

Elasticsearchインデックスでは、各タイムスタンプに対して単一のドキュメントが作成され、不変の時系列次元とメトリック名、変化するメトリック値が含まれます。単一のタイムスタンプに対して、いくつかの時系列次元とメトリックが保存される場合があります。

時系列メトリックの解剖

最新かつ関連性の高いデータの場合、メトリックシリーズは通常、低いサンプリング時間間隔を持ち、高いデータ解像度を必要とするクエリに最適化されています。

時系列オリジナル

図4. オリジナルメトリックシリーズ

ダウンサンプリングは、古い、あまり頻繁にアクセスされないデータに対して機能し、元の時系列を高いサンプリング間隔のデータストリームとそのデータの統計的表現に置き換えます。元のメトリックサンプルが例えば10秒ごとに取得されていた場合、データが古くなるにつれて、サンプルの粒度を時間単位または日単位に減らすことを選択できます。coldのアーカイブデータの粒度を月単位またはそれ以下に減らすことを選択できます。

時系列ダウンサンプリング

図5. ダウンサンプルされたメトリックシリーズ

時系列データのダウンサンプリングの実行

時系列インデックスをダウンサンプリングするには、ダウンサンプルAPIを使用し、fixed_intervalを希望する粒度のレベルに設定します:

Python

  1. resp = client.indices.downsample(
  2. index="my-time-series-index",
  3. target_index="my-downsampled-time-series-index",
  4. config={
  5. "fixed_interval": "1d"
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.indices.downsample(
  2. index: 'my-time-series-index',
  3. target_index: 'my-downsampled-time-series-index',
  4. body: {
  5. fixed_interval: '1d'
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.indices.downsample({
  2. index: "my-time-series-index",
  3. target_index: "my-downsampled-time-series-index",
  4. config: {
  5. fixed_interval: "1d",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST /my-time-series-index/_downsample/my-downsampled-time-series-index
  2. {
  3. "fixed_interval": "1d"
  4. }

ILMの一部として時系列データをダウンサンプリングするには、ILMポリシーにダウンサンプルアクションを含め、fixed_intervalを希望する粒度のレベルに設定します:

Python

  1. resp = client.ilm.put_lifecycle(
  2. name="my_policy",
  3. policy={
  4. "phases": {
  5. "warm": {
  6. "actions": {
  7. "downsample": {
  8. "fixed_interval": "1h"
  9. }
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.ilm.put_lifecycle(
  2. policy: 'my_policy',
  3. body: {
  4. policy: {
  5. phases: {
  6. warm: {
  7. actions: {
  8. downsample: {
  9. fixed_interval: '1h'
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.ilm.putLifecycle({
  2. name: "my_policy",
  3. policy: {
  4. phases: {
  5. warm: {
  6. actions: {
  7. downsample: {
  8. fixed_interval: "1h",
  9. },
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);

コンソール

  1. PUT _ilm/policy/my_policy
  2. {
  3. "policy": {
  4. "phases": {
  5. "warm": {
  6. "actions": {
  7. "downsample" : {
  8. "fixed_interval": "1h"
  9. }
  10. }
  11. }
  12. }
  13. }
  14. }

ダウンサンプルされたインデックスのクエリ

ダウンサンプルされたインデックスをクエリするには、_searchおよび_async_searchエンドポイントを使用できます。複数の生データおよびダウンサンプルされたインデックスを単一のリクエストでクエリでき、単一のリクエストには異なる粒度(異なるバケットの時間間隔)のダウンサンプルされたインデックスを含めることができます。つまり、15m1h1dなど、複数のダウンサンプリング間隔を持つダウンサンプルされたインデックスを含むデータストリームをクエリできます。

時間ベースのヒストグラム集約の結果は均一なバケットサイズであり、各ダウンサンプルされたインデックスはダウンサンプリング時間間隔を無視してデータを返します。例えば、date_histogram集約を"fixed_interval": "1m"でダウンサンプルされたインデックスで実行すると、クエリは分0のすべてのデータを含む1つのバケットを返し、その後59の空のバケットが続き、次の時間のために再びデータを含むバケットが返されます。

ダウンサンプルクエリに関する注意事項

ダウンサンプルされたインデックスをクエリする際に注意すべき点がいくつかあります:

  • KibanaやElasticソリューションを通じてクエリを実行すると、ダウンサンプルされたインデックスがあることを通知することなく、通常の応答が返されます。
  • 日付ヒストグラム集約では、fixed_intervals(カレンダー対応の間隔ではなく)のみがサポートされています。
  • タイムゾーンのサポートには注意が必要です:
    • 時間の倍数の間隔での日付ヒストグラムは、UTCで生成された値に基づいています。これは、+5:00や-3:00のように時間単位であるタイムゾーンにはうまく機能しますが、報告された時間バケットをオフセットする必要があります。例えば、ダウンサンプリングが時間ごとに集約される場合、タイムゾーン+5:30(インド)では2020-01-01T10:30:00.000ではなく2020-03-07T10:00:00.000として報告されます。この場合、結果には時間バケットがシフトしていることを示すフィールドdownsampled_results_offset: trueが含まれます。15分のダウンサンプリング間隔を使用すると、シフトされたバケットの時間ごとの値を正しく計算できるため、これを回避できます。
    • 日ごとの倍数の間隔での日付ヒストグラムも同様に影響を受けます。ダウンサンプリングが日ごとに集約される場合、ダウンサンプルされた値が生成されるときに各日の始まりは常にUTCで計算されるため、時間バケットをシフトする必要があります。例えば、タイムゾーンAmerica/New_Yorkの場合、2020-03-07T19:00:00.000ではなく2020-03-07T00:00:00.000として報告されます。この場合もフィールドdownsampled_results_offset: trueが追加されます。
    • 夏時間やタイムゾーンに関する特異な点は、日付ヒストグラム集約のタイムゾーンに記載されているように、報告された結果に影響を与えます。さらに、日ごとの間隔でのダウンサンプリングは、夏時間の変更に関連する情報の追跡を妨げます。

制限と制約

ダウンサンプリングには以下の制限と制約が適用されます:

  • 時系列データストリーム内のインデックスのみがサポートされています。
  • データは時間次元のみに基づいてダウンサンプリングされます。他のすべての次元は、変更なしで新しいインデックスにコピーされます。
  • データストリーム内では、ダウンサンプルされたインデックスが元のインデックスを置き換え、元のインデックスは削除されます。特定の時間期間に対しては、1つのインデックスのみが存在できます。
  • ソースインデックスは、ダウンサンプリングプロセスが成功するために読み取り専用モードである必要があります。詳細については、手動でダウンサンプリングを実行の例を確認してください。
  • 同じ期間のデータを何度もダウンサンプリングすること(ダウンサンプルされたインデックスのダウンサンプリング)はサポートされています。ダウンサンプリング間隔は、ダウンサンプルされたインデックスの間隔の倍数でなければなりません。
  • ダウンサンプリングはILMアクションとして提供されます。ダウンサンプルを参照してください。
  • 新しいダウンサンプルされたインデックスは、元のインデックスのデータティアに作成され、その設定(例えば、シャード数やレプリカ数)を継承します。
  • 数値gaugeおよびcounter メトリックタイプがサポートされています。
  • ダウンサンプリング構成は、時系列データストリームのインデックスマッピングから抽出されます。唯一の追加の必須設定は、ダウンサンプリングfixed_intervalです。

試してみる

ダウンサンプリングをテストするには、手動でダウンサンプリングを実行の例を試してみてください。

ダウンサンプリングは、ILMポリシーに簡単に追加できます。方法を学ぶには、ILMでダウンサンプリングを実行の例を試してみてください。