Skip to content

diamondではデータポイント数が少ない場合に1時間以上の粒度で表示できない

[! Obsoleted] この仕様は2025年に廃止した。告知は表示期間内に1点でもメトリック投稿されていれば、グラフが表示されるようになりましたで書いた。

diamondとmichizaneには、描画するグラフの範囲によって粒度が切り替わる実装が入っている。具体的にはselectStepの辺り。

func selectStep(now, start, end time.Time) time.Duration {
duration := end.Sub(start)
...
case int64(duration/(24*time.Hour)) > 240:
return 24 * time.Hour
case int64(duration/(time.Hour)) > 240:
return time.Hour
case int64(duration/(5*time.Minute)) > 240:
return 5 * time.Minute
default:
return time.Minute

このとき startendrender エンドポイントの sinceuntil に相当する。

また、サービスメトリック以外では、diamondには粒度が1時間よりも大きい場合、集約された元データのポイント数が一定に満たないデータポイントを除外している。最小の個数は mackerel-diamond リポジトリのRollupLeastMetricPointCountで定めている。

func RollupLeastMetricPointCount(step int, name string) uint8 {
count := uint8(1)
if !serviceMetricPattern.MatchString(name) {
switch step {
case 60 * 60:
count = 6
case 60 * 60 * 24:
count = 12
}
}
return count
}

これらが組み合わさると、小さい粒度ではグラフが見えるけれど広げたときにデータが無いという表示になる。事例としては【要調査】特定の粒度だけ見えないグラフがあるがある。

粒度最小個数最小を満たす投稿間隔
1分1点
5分1点
1時間6点5分毎に1点が必要
1日12点2時間毎に1点が必要

集計自体は行っていて、メトリック取得時に除外しているだけなので、1時間毎に1回投稿しているメトリックは1時間粒度だけ欠損する。対策は特定の粒度だけメトリックの見えないグラフがある件の作戦を立てるで行われる見込みだが、2025年4月時点では動いていない。

この仕様が導入されたのはdiamond開発: ロールアップ時にデータポイント数も記録するだけども、1点の値がそのまま平均とされるのは違和感あると思いつつ、欠損扱いにする決定はモチベーションが分からない。