本文档介绍如何理解 Distribution 值类型的指标数据的百分位和直方图模型。分布指标定义值的范围(称为“桶”),并记录每个桶中的测量值数量。分布指标不报告各个测量值,而是报告桶中数量的直方图。如果单个测量值太多而无法收集,但有关这些测量值的统计信息(如平均值或百分位)很有价值,服务便会使用此值类型。
本页面的下一节使用一个合成示例来展示如何确定百分位。该示例显示,百分位值取决于范围的数量、范围的宽度、测量值的分布情况和样本总数。 百分位值与实际的测量值无关,因为直方图中没有这些值。
含合成数据的示例
假设有一个 Exponential 范围模型,扩缩因数为 1,增长因数为 2,有限范围数为 10。此直方图包含 12 个范围,其中 10 个是有限范围,1 个仅指定上限,1 个仅指定下限。在此示例中,索引为 n+1 的有限范围的宽度是索引为 n 的有限范围的两倍。
以下示例显示,范围的宽度决定了计算百分位与测量值之间的最大误差。这些示例还表明,直方图中的样本数量很重要。例如,如果样本数量少于 20,则第 95 和第 99 百分位将始终在同一个桶中。
案例 1:样本总数为 1。
当只有一个测量值时,三个百分位值不同,但它们仅显示同一桶的第 50、第 95 和第 99 百分位。无法确定估计值与实际测量值之间的误差,因为测量值未知。
例如,假设测量值的直方图如下表所示:
| 范围编号 | 下限 | 上限 | 计数 | 百分位范围 |
|---|---|---|---|---|
| 0 | 1 | 0 | 0 | |
| 1 | 1 | 2 | 0 | 0 |
| 2 | 2 | 4 | 0 | 0 |
| 3 | 4 | 8 | 0 | 0 |
| 4 | 8 | 16 | 0 | 0 |
| 5 | 16 | 32 | 0 | 0 |
| 6 | 32 | 64 | 0 | 0 |
| 7 | 64 | 128 | 0 | 0 |
| 8 | 128 | 256 | 1 | 0 - 100 |
| 9 | 256 | 512 | 0 | 0 |
| 10 | 512 | 1024 | 0 | 0 |
| 11 | 1024 | 0 | 0 |
如需计算第 50 百分位,请执行以下操作:
- 使用范围计数确定包含第 50 百分位的范围。在此示例中,编号为 8 的范围包含第 50 百分位。
使用以下规则计算估计值:
pth percentage = bucket_low + (bucket_up - bucket_low)*(p - p_low)/(p_up - p_low)在上面的表达式中,
p_low和p_up是相应范围的百分位范围的下限和上限。同样,bucket_low和bucket_up是范围的下限和上限。p_low和p_up的值取决于不同范围之间的计数分布情况。
例如,第 50 百分位的计算方式如下:
50th percentile = 128 + (256-128)*(50-0)/(100-0)
= 128 + 128 * 50 / 100
= 128 + 64
= 192如需计算第 95 百分位,请将上一个表达式中的 50 替换为 95。在此示例中,只有一个样本,百分位数如下所示:
| 百分位 | 范围编号 | 值 |
|---|---|---|
| 第 50 百分位 | 8 | 192 |
| 第 95 百分位 | 8 | 249.6 |
| 第 99 百分位 | 8 | 254.7 |
估计值与实际测量值之间的误差是有界限的,但无法确定,因为测量值未知。
案例 2:样本总数为 10。
有 10 个样本时,第 50 百分位可能与第 95 和第 99 百分位位于不同的桶。但是,没有足够的测量值使得第 95 百分位和第 99 百分位位于不同的桶。
例如,假设测量值的直方图如下表所示:
| 范围编号 | 下限 | 上限 | 计数 | 百分位范围 |
|---|---|---|---|---|
| 0 | 1 | 4 | 0 - 40 | |
| 1 | 1 | 2 | 2 | 40 - 60 |
| 2 | 2 | 4 | 1 | 60 - 70 |
| 3 | 4 | 8 | 1 | 70 - 80 |
| 4 | 8 | 16 | 1 | 80 - 90 |
| 5 | 16 | 32 | 0 | 0 |
| 6 | 32 | 64 | 0 | 0 |
| 7 | 64 | 128 | 0 | 0 |
| 8 | 128 | 256 | 1 | 90 - 100 |
| 9 | 256 | 512 | 0 | 0 |
| 10 | 512 | 1024 | 0 | 0 |
| 11 | 1024 | 0 | 0 |
您可以使用之前描述的流程来计算第 50、第 95 和第 99 百分位。例如,第 50 百分位(位于编号为 1 的范围中)的计算方式如下:
50th percentile = 1 + (2-1)*(50-40)/(60-40)
= 1 + (1 * 10 / 20)
= 1 + 0.5
= 1.5
同样,第 95 百分位的计算方式如下:
95th percentile = 128 + (256-128)*(95-90)/(100-90)
= 128 + 128 * 5 / 10
= 128 + 64
= 192
通过之前描述的过程,可以计算出百分位数。下表中的每一行都列出了百分位、相应的桶和计算值:
| 百分位 | 范围编号 | 值 | 最大误差 |
|---|---|---|---|
| 第 50 百分位 | 1 | 1.5 | 0.5 |
| 第 95 百分位 | 8 | 192 | 74 |
| 第 99 百分位 | 8 | 243.2 | 115.2 |
在此示例和上一个示例中,第 95 百分位都位于编号为 8 的范围中;不过,百分位计算方式有所不同。这种差异是由于样本的分布方式造成的。在第一个示例中,所有样本都位于同一范围中,而在最新示例中,样本位于不同的范围中。
含实际数据的示例
本部分包含一个示例,说明如何确定特定指标使用的桶模型。本部分还说明了如何计算所计算的百分位值中的潜在误差。
确定桶模型
如需确定在特定时间间隔用于某个指标的桶,请调用 Cloud Monitoring API 的 projects.timeSeries/list 方法。
例如,要确定某个指标的桶模型,请执行以下操作:
- 转到
projects.timeSeries/list网页。 在 API Explorer 中,输入指定指标的过滤条件、开始时间和结束时间。
例如,如需获取存储 API 请求延迟时间的指标的相关信息,请输入以下命令:
metric.type="serviceruntime.googleapis.com/api/request_latencies" resource.type="consumed_api"在此示例中,过滤条件字段指定了指标类型和资源类型。如需详细了解这些过滤条件,请参阅监控过滤条件。
点击 Enter。
以下是某个 Google Cloud 项目上提供的一个分布值指标的 list API 响应:
{
"timeSeries": [
{
"metric": {...},
"resource": {...},
},
"metricKind": "DELTA",
"valueType": "DISTRIBUTION",
"points": [
{
"interval": {
"startTime": "2020-11-03T15:05:00Z",
"endTime": "2020-11-03T15:06:00Z"
},
"value": {
"distributionValue": {
"count": "3",
"mean": 25.889,
"bucketOptions": {
"exponentialBuckets": {
"numFiniteBuckets": 66,
"growthFactor": 1.4,
"scale": 1
}
},
"bucketCounts": [
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"3"
]
}
}
},
在 API 响应中,value 字段描述 points 数组中存储的数据。count 和 mean 字段报告在指定时间间隔内有 3 个测量值,它们的平均值为 25.889。bucketOptions 字段显示,指数模型配置为具有 66 个桶,标度为 1,增长因数为 1.4。
要计算索引为 n 的桶的下限和上限,请使用以下规则:
- 下限(1 ≤ n < N)= 标度 *(增长因数)(n-1)
- 上限(0 ≤ n < N-1)= 标度 *(增长因数)n
在上面的表达式中,N 是范围的总数。
下表中显示了此指标的范围,以及每个范围的中点:
| 第 个范围 | 下限 | 上限 | 中点 |
|---|---|---|---|
| 0 | 1 | 不适用 | |
| 1 | 1 | 1.40 | 1.20 |
| 2 | 1.40 | 1.96 | 1.68 |
| … | |||
| 9 | 14.76 | 20.66 | 17.71 |
| 10 | 20.66 | 28.93 | 24.79 |
| 11 | 28.93 | 40.50 | 34.71 |
| … |
验证百分位计算
现在已知范围配置,对于任何一组测量值,您都可以预测第 50、第 95 和第 99 百分位值。例如,如果只有一个样本,且该样本位于编号为 10 的范围中,则第 50 百分位值为 24.79。
如果要检索指标的第 50、第 95 和第 99 百分位值,您可以使用 API 方法 projects.timeSeries/list,并添加校准时间段和校准器。在此示例中,选择了以下设置:
- Aligner:
ALIGN_PERCENTILE_50、ALIGN_PERCENTILE_95或ALIGN_PERCENTILE_99 - 校准时间段:60 秒
如果选择 ALIGN_PERCENTILE_50,时序中的每个值都是桶的第 50 百分位:
{
"timeSeries": [
{
"metric": {...},
"resource": {...},
"metricKind": "GAUGE",
"valueType": "DOUBLE",
"points": [
{
"interval": {
"startTime": "2020-11-03T15:06:36Z",
"endTime": "2020-11-03T15:06:36Z"
},
"value": {
"doubleValue": 24.793256140799986
}
},
{
"interval": {
"startTime": "2020-11-03T15:05:36Z",
"endTime": "2020-11-03T15:05:36Z"
},
"value": {
"doubleValue": 34.710558597119977
}
},
{
"interval": {
"startTime": "2020-11-03T15:04:36Z",
"endTime": "2020-11-03T15:04:36Z"
},
"value": {
"doubleValue": 24.793256140799986
}
}
]
},
两个示例的第 50 百分位位于桶 10 中,另一个示例则位于桶 11 中。
下表展示了使用不同校准器执行 projects.timeSeries/list 方法的结果。第一行对应于未指定校准器的情况。如果未指定校准器,则返回桶模型和平均值。接下来的三行列出了校准器设置为 ALIGN_PERCENTILE_50、ALIGN_PERCENTILE_95 和 ALIGN_PERCENTILE_99 时返回的数据:
| 统计信息 | 样本 @ 15:06 | 样本 @ 15:05 | 样本 @ 15:04 |
|---|---|---|---|
| 平均值 | 25.889 | 33.7435 | 不可用。 |
| 第 50 百分位 | 24.79 | 34.71 | 24.79 |
| 第 95 百分位 | 28.51 | 39.91 | 28.51 |
| 第 99 百分位 | 28.84 | 40.37 | 28.84 |
如两个含合成数据的示例所示,百分位数值取决于样本的分布情况。当所有样本都在样本范围中时,第 50 百分位是该范围的中点。不过,当样本位于不同的范围中时,这种分布会影响估计值。
如需确定第 50 百分位是否是对平均值的合理估计,您可以将平均值与第 50 百分位进行比较。将返回平均值和桶详细信息。
后续步骤
如需了解如何直观呈现分布值指标,请参阅分布值指标简介。