百分位和分布值指标

本文档介绍如何理解 Distribution 值类型的指标数据的百分位和直方图模型。分布指标定义值的范围(称为“桶”),并记录每个桶中的测量值数量。分布指标不报告各个测量值,而是报告桶中数量的直方图。如果单个测量值太多而无法收集,但有关这些测量值的统计信息(如平均值或百分位)很有价值,服务便会使用此值类型。

在热图上绘制分布值指标图表时,您可以使用图表工具栏中的选项叠加第 50、第 95 和第 99 百分位。如果要在折线图上显示分布值指标,则必须配置图表以将分布值转换为数值。您可以使用选择一个百分位的校准器来执行这一转换。

本页面的下一节使用一个合成示例来展示如何确定百分位。该示例显示,百分位值取决于桶的数量、桶的宽度和样本总数。百分位值与实际的测量值无关,因为直方图中没有这些值。

含合成数据的示例

假设有一个 Exponential 存储分区模型,扩缩因数为 1,增长因数为 2。在使用此桶模型的分布中,索引为 n+1 的桶的宽度是索引为 n 的桶的两倍。

此示例显示桶的宽度决定了计算百分位与测量值之间的最大误差。此示例还表明,直方图中的样本数量很重要。例如,如果样本数量少于 20,则第 95 和第 99 百分位将始终在同一个桶中。

案例 1:样本总数为 1。

当只有一个测量值时,三个百分位值不同,但它们仅显示同一桶的第 50、第 95 和第 99 百分位。无法确定估计值与实际测量值之间的误差,因为测量值未知。例如,如果单一测量值在范围为 [128, 256) 的桶中,您无法知道测量值是 128 还是 255。

例如,假设测量值的直方图如下表所示:

存储桶 计数
[0, 1) 0
[1, 2) 0
[2, 4) 0
[4, 8) 0
[8, 16) 0
[16, 32) 0
[32, 64) 0
[64, 128) 0
[128, 256) 1

如需计算第 50 百分位,请执行以下操作:

  1. 使用桶计数确定 [128, 256) 桶包含第 50 百分位。
  2. 假设所选桶中的测量值均匀分布。

在这些规则下,第 50 百分位的最佳估计是桶中点。

通过使用相同逻辑,您可以计算任何桶的任何百分位。下表中的每一行都列出了百分位、相应的桶和计算值:

百分位 存储分区
第 50 百分位 [128, 256) 192
第 95 百分位 [128, 256) 249.6
第 99 百分位 [128, 256) 254.7

估计值与实际测量值之间的误差是有界限的,但无法确定,因为测量值未知。

案例 2:样本总数为 10。

有 10 个样本时,第 50 百分位可能与第 95 和第 99 百分位位于不同的桶。但是,没有足够的测量值使得第 95 百分位和第 99 百分位位于不同的桶。

例如,假设测量值的直方图如下表所示:

存储桶 计数
[0, 1) 4
[1, 2) 2
[2, 4) 1
[4, 8) 1
[8, 16) 1
[16, 32) 0
[32, 64) 0
[64, 128) 0
[128, 256) 1

通过之前描述的过程,可以计算出百分位数。下表中的每一行都列出了百分位、相应的桶和计算值:

百分位 存储分区 最大误差
第 50 百分位 [1, 2) 1.5 0.5
第 95 百分位 [128, 256) 249.6 121.6
第 99 百分位 [128, 256) 254.7 126.7

含实际数据的示例

本部分包含一个示例,说明如何确定特定指标使用的桶模型。本部分还说明了如何计算所计算的百分位值中的潜在误差。

确定桶模型

如需确定在特定时间间隔用于某个指标的桶,请调用 Cloud Monitoring API 的 projects.timeSeries/list 方法。

例如,要确定某个指标的桶模型,请执行以下操作:

  1. 转到 projects.timeSeries/list 网页。
  2. API Explorer 中,输入指定指标的过滤条件、开始时间和结束时间。

    例如,如需获取存储 API 请求延迟时间的指标的相关信息,请输入以下命令:

    metric.type="serviceruntime.googleapis.com/api/request_latencies"
    resource.type="consumed_api"
    

    在此示例中,过滤条件字段指定了指标类型和资源类型。如需详细了解这些过滤条件,请参阅监控过滤条件

  3. 点击 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 数组中存储的数据。countmean 字段报告在指定时间间隔内有 3 个测量值,它们的平均值为 25.889。bucketOptions 字段显示,指数模型配置为具有 66 个桶,标度为 1,增长因数为 1.4。

要计算索引为 n 的桶的下限和上限,请使用以下规则:

  • 下限 = 标度 * (增长因数)^(n-1)
  • 上限 = 标度 * (增长因数)^n

下表中显示了此指标的存储分区,以及每个存储分区的中点和百分位:

n 个间隔 下限 上限 中点 每百分位的贡献
0 -infinity 0 不适用
1 0 1.4 0.7 0.014
2 1.4 1.96 1.58 0.0056
9 14.75 20.66 17.7 0.0591
10 20.66 28.93 24.78 0.0827
11 28.9 40.5 34.7 0.116

每百分位的贡献中的值的计算方法如下:

    Each percentile contribution = (Upper bound - Lower bound) / 100

例如,对于桶 10,每个百分位为 (28.93-20.66)/100 = 0.0827。

桶 10 的第 50 百分位的计算方法如下:

    50th percentile = Lower bound + (50 * Each percentile contribution)
                    = 20.66 + 50*0.0827
                    = 24.79

验证百分位计算

现在已知桶配置,您可以预测为第 50、第 95 和第 99 百分位值返回的值。例如,如果第 50 百分位位于 10 号桶,则第 50 百分位值为 24.79。

如果要检索指标的第 50、第 95 和第 99 百分位值,您可以使用 API 方法 projects.timeSeries/list,并添加校准时间段和校准器。在此示例中,选择了以下设置:

  • 校准器ALIGN_PERCENTILE_50ALIGN_PERCENTILE_95ALIGN_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_50ALIGN_PERCENTILE_95ALIGN_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 百分位值始终是桶的中点。ALIGN_PERCENTILE_50 计算值也是时间间隔的中点。同样,如果您知道第 99 百分位位于桶 10 中,则第 99 百分位的预期值约为 20.66 +(99*0.0827),即 28.84。ALIGN_PERCENTILE_99 查询返回的值与此预期值匹配。

如需确定第 50 百分位是否是对平均值的合理估计,您可以将平均值与第 50 百分位进行比较。将返回平均值和桶详细信息。

后续步骤

如需了解如何直观呈现分布值指标,请参阅绘制分布指标图表