本文档介绍如何理解 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。
以下是某个 Trusted 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 百分位进行比较。将返回平均值和桶详细信息。