"""Utils about histogram metrics""" def quantile(tuples: list[tuple[float, float]], q_value: float): """Calculate the quantile of the histogram. refer to https://github.com/prometheus/prometheus/blob/main/promql/quantile.go """ if len(tuples) == 0: return 0 tuples.sort(key=lambda x: x[0]) observations = tuples[len(tuples) - 1][1] if observations == 0: return 0 rank = q_value * observations for idx, bucket in enumerate(tuples): if rank > bucket[1]: continue bucket_start = 0 bucket_end = bucket[0] count = bucket[1] if idx == 0 and bucket_end <= 0: return bucket_end if idx > 0: bucket_start = tuples[idx - 1][0] count -= tuples[idx - 1][1] rank -= tuples[idx - 1][1] return bucket_start + (bucket_end - bucket_start) * (rank / count) return tuples[len(tuples) - 2][0]