【VictoriaMetrics】時系列データを上書きしたように見せる

皆さんこんにちは!WESEEK ソフトウェアエンジニアの 増山 です。

今回のブログでは、時系列データベース VictoriaMetrics でデータを上書きしたように見せる方法を解説します。

VictoriaMetrics をまだご存知ない方には こちらの記事 で入門していただくことをおすすめします。

目次

VictoriaMetrics ができないこと

そもそも VictoriaMetrics は v1.80 の時点では時系列データの上書きをサポートしていません。また、ある特定の時系列データの、ある期間におけるデータの削除もできません。

よって、上書き前のデータと上書き後のデータが vmstorage 上に存在する状態で、擬似的に上書き後のデータのみが取得できるようにする方法を考えます。

想定ユースケース

  • 時系列データを一定間隔で投入する運用
  • 間違ったデータが投入される可能性があり、あとから backfill することで正しいデータで擬似的に上書きしたい

前提条件

この解説では、10分ごとにデータを投入する場合を想定しています。

データが上書きされたように見せる

方法

  1. vmselect のオプションに -search.setLookbackToStep=true, -dedup.minScrapeInterval=1ms を設定します
  2. 編集したいとするデータ、を前回投入したデータのタイムスタンプに 1ms を加えたタイムスタンプで投入します
  3. /query_range をクエリパラメータ?start=<ある 10m 間隔における最初のデータポイントの timestamp + 10m59s>&end=<start と同じ>&step=10m で GET リクエストします

解説

  • -search.setLookbackToStep=true

    • この設定値のとき、Range query の step パラメータが Lookback の値になります
      • Lookback = データポイントが存在しないタイムスタンプを対象に Range query をリクエストしたとき、Lookback に設定された時間分遡ってデータポイントを発見しに行く仕組みです
    • この設定のときは step と Lookback が同じ値になるため、step=10m では最大 10分遡ってデータを見つけに行きます。そのため、常に 最初のデータ投入時間+10m59s の時刻を start に設定してリクエストしておくことで、擬似的に上書き後のデータのみが取得できます
    • また他にも、step に設定された時間を超えた範囲のデータを取得しようとしたときには結果を返さなくなるので、間違った start/end を設定してしまった際にミスに気づくことができるというメリットもあります
  • -dedup.minScrapeInterval=1ms

    • この設定値にすると、 vmselect は "全く同じタイムスタンプ" に異なるデータ(Sample)が複数存在するときにランダムな値を deduplicate します。この "全く同じタイムスタンプ" でしか deduplicate されないことを利用して、ある 10 分の間に 1ms 間隔で擬似的な上書き値を挿入することが可能になっています
    • -dedup.minScrapeInterval=0 にすると重複排除されないため注意
    • これが 1ms で無いときは "異なるタイムスタンプ" のデータでも deduplication の対象になってしまいます
  • 最大擬似上書き可能回数

    • 最大 600,000 - 1 = 599,999回上書きできます(10min は 600,000 ms)
  • Range query

    • Range query は startend でまず区間を指定し、step の値に応じて複数の時刻で promQL(MetricsQL) を評価するエンドポイントです。start の時刻では必ずクエリが評価されます。stepend-start より大きいとき、さらに start+step の時刻でクエリが評価されます。この評価ごとに Lookback が発生します
    • 詳しくは: https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries

注意点

この方法で VictoriaMetrics を運用した場合、データの投入には全く影響はないが、データを集計して取得する際には影響があります。

  • 生のデータが上書きされているわけではない
    • 新しいデータを少し時間をずらして入れることで擬似的な上書きを実現しているため、余計なデータが vmstorage に残ったままになります
    • データの平均値を計算したいなどのときには、PromQL の rangeresolution を正しく設定しないと擬似的な上書き前のデータが集計に使用される場合があります

まとめ

ここまでお読みいただきありがとうございました。

質問等ありましたら 増山の Twitter に DM 送っていただければ答えられる範囲でお答えします。

関連記事