# マテリアライズドメトリクス
## 定義
Prometheus のカウンタ系列に対し、pod ラベルのようなインフラ由来ラベルをスクレイプ時に畳み込んで集約し、専用の集約済み系列(materialized series)として保存する手法。カウンタが累積型であるため単純合算は reset を跨いで破綻するが、値を delta(差分)化してから固定間隔ごとに強制リセットする「ジグザグカウンタ(zigzag counter)」を生成することで、複数レプリカ間で合意プロトコルなしに比較・重複排除・欠損補完が可能な擬似カウンタとして Prometheus に書き戻せる。
(Source: [[@2026__RedditEng__Materialized Metrics in Prometheus]])
### 動機: recording rule の限界
recording rule によるラベル削除・集約は、大規模では rule 評価自体がクエリ評価とほぼ同等のコストを要し、レイテンシ問題を「クエリ時」から「継続的な背景負荷」へ移すだけになる。事前にルールを定義する toil も発生し、系列数が急増すればルール自体もタイムアウトしうる。マテリアライズドメトリクスはこの限界を、スクレイプ時点(並行実行かつ最新データ)で集約することで回避する。
### ジグザグカウンタの生成アルゴリズム
```
last = 0
for every 15s:
delta = delta_since_last_flush()
if delta < last:
last = delta
else:
last = delta + last
flush(last)
```
delta をスクレイプ間隔ごとに強制リセットすると、増加とリセットを繰り返す鋸波(ジグザグ)状のカウンタが生成される。複数レプリカのジグザグは周波数こそ異なるが値のスケールが揃うため、一方で他方の欠損を埋めたり重複排除したりできる(サンプル5点で平均誤差率0.15%)。
### レプリカ間重複排除とジグザグ制約
Prometheus は2時間ブロック単位でデータを保存するため、複数ブロックにまたがる長時間クエリでは異なるレプリカのジグザグ間を移動する際に重複排除が破綻しうる。ほぼ同時刻でわずかに値が下がった連続サンプルが「リセット」と誤認され、異常なレート急騰を生む。対策として、ジグザグ生成関数に「連続する減少は1回まで」という制約を課し、真のジグザグパターンを強制する。パターンを破る値はレプリカ切り替わりの証拠として明示的に除外し、除外は直近の谷ではなく**先読みして最初の谷**を落とすことで両ストリームに滑らかな移行を作る。
## 横断的知見
- 現時点では単一ソース([[@2026__RedditEng__Materialized Metrics in Prometheus]])のみ。追加ソースで更新予定。関連する [[Prometheusシリーズチャーン]] 概念には、同じ Reddit オブザーバビリティチームによる別解法(stale-series compaction、ストレージ層)との対比を記載している。
## 未解決の問い
- ジグザグカウンタの本番実装(Prometheus フォークの具体的なコード)は公開されているか。OSS Prometheus へのアップストリーム提案は進んでいるか
- VictoriaMetrics の streaming aggregation(コメント欄で言及された代替アプローチ)との定量的な性能・精度比較はあるか
- ジグザグ制約(連続する減少は1回まで)が誤って正当な急減少(例: カウンタリセットの連鎖)を排除してしまうケースはないか
- gauge・summary・native histogram など、カウンタ以外の型に本手法を拡張する設計は存在するか
## 関連
- [[Prometheus]] / [[Prometheus TSDB]] / [[Prometheusシリーズチャーン]]
- [[@2026__RedditEng__Materialized Metrics in Prometheus]]
- [[Aleksandr Krivoshchekov]] / [[Walther Lee]] / [[Reddit]]
## 出典
- [[@2026__RedditEng__Materialized Metrics in Prometheus]]: Aleksandr Krivoshchekov・Walther Lee (Reddit)、2026年公開(推定)