Histogram không lưu từng giá trị mà đếm số quan sát rơi vào các bucket cộng dồn: le=0.1, le=0.5, le=1, le=+Inf. Mỗi bucket là một counter, cộng được giữa các instance. p99 được nội suy từ các bucket này (histogram_quantile(0.99, ...) trong PromQL), nên độ chính xác phụ thuộc vào việc bucket có đặt sát vùng giá trị thật hay không — bucket le=1 rồi nhảy thẳng le=10 thì mọi p99 trong khoảng đó đều là ước lượng thô.
Vì sao không trung bình các p99: phân vị không cộng tuyến tính. Trung bình của p99 hai instance không phải p99 của toàn hệ.
instance A: 1000 req/s, p99 = 100ms
instance B: 10 req/s, p99 = 900ms
average of the two p99 = 500ms # meaninglessA gánh gần như toàn bộ traffic nên p99 thật của cả cụm gần 100ms, không phải 500ms. Trung bình có trọng số theo traffic cũng vẫn sai, vì phân vị phụ thuộc vào hình dạng phân bố, không phải vào giá trị phân vị của từng phần.
Cách đúng: cộng bucket counter của mọi instance rồi mới tính phân vị một lần trên tổng:
histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))Lưu ý sum by (le) đứng bên trong.
Đây cũng là lý do nên dùng histogram thay vì summary: summary tính phân vị ngay tại phía client nên không gộp được giữa các instance.