好的,下面是关于 Prometheus 中 Histogram 和 Summary 的详细对比,并提供一些示例。
- 相同点
- 都用于度量分布式系统性能。
- 都可以记录和展示观测值的分布情况。
- 都支持各种聚合操作,如 sum、count、quantile 等。
- 不同点
- Histogram 通过将观测值划分成固定区间(桶)来记录数据分布情况;而 Summary 则通过百分位数来确定桶的边界。
- Histogram 更适合处理长尾型数据或极端事件,Summary 则更适合记录短周期内的数据变化。
下面给出两个具体的示例:
Histogram 示例:假设我们要度量某个 Web 服务请求的延迟时间。我们可以使用 Histogram 记录每个请求花费的时间,并将其划分为若干区间。例如,我们可以定义以下四个桶:
{le="10"} // 请求完成时间小于等于 10 毫秒
{le="50"} // 请求完成时间大于 10 毫秒且小于等于 50 毫秒
{le="100"} // 请求完成时间大于 50 毫秒且小于等于 100 毫秒
{le="+Inf"} // 请求完成时间大于 100 毫秒
然后,我们可以在 Prometheus 中定义一个名为 request_latency_seconds 的 Histogram 类型指标:
request_latency_seconds = Histogram(
name = "request_latency_seconds",
help = "Request latency in seconds.",
buckets = [10, 50, 100, float('inf')],
)
接下来,在每次请求完成时,我们可以记录请求的延迟时间:
start_time = time.time()
do_something()
elapsed_time = time.time() - start_time
request_latency_seconds.observe(elapsed_time)
最后,我们可以使用 Prometheus 的查询语句来计算各种聚合操作(如 sum、count、quantile 等),并在 Grafana 中绘制直方图等可视化图表。
Summary 示例:假设我们要度量某个 Web 服务的处理速率。我们可以使用 Summary 记录每秒钟处理请求数,并自动计算出不同百分位数的值。例如,我们可以定义以下三个百分位数:
0.5 // 50% 百分位数
0.9 // 90% 百分位数
0.99 // 99% 百分位数
然后,在 Prometheus 中定义一个名为 request_rate 的 Summary 类型指标:
request_rate = Summary(
name = "request_rate",
help = "Request rate per second.",
objectives = {
'0.5': 0.01,
'0.9': 0.001,
'0.99': 0.0001,
},
)
接下来,在每次请求完成时,我们可以记录处理请求数:
current_timestamp_ms = int(time.time() * 1000)
requests_per_second = 1 / elapsed_time
request_rate.observe(requests_per_second, current_timestamp_ms)
最后,我们可以使用 Prometheus 的查询语句来计算各种聚合操作(如 sum、count、avg 等),并在 Grafana 中绘制可视化图表。例如,以下查询语句可以计算出前一分钟内请求处理速率的平均值:
rate(request_rate[1m])