绘制分布指标图表

本页介绍了如何创建和解读图表,以便显示具有 Distribution 值类型的指标数据。如果单个测量值太多而无法收集,但有关这些测量值的统计信息(如平均值或百分位)很有价值,服务无法使用此值类型。

例如,假设有一项测量请求 HTTP 延迟时间的服务。设计者选择使用分布值类型来报告已完成的 HTTP 请求的延迟时间数据。系统每分钟报告一次数据。该服务定义了一组存储分区,其中每个存储分区都定义了一系列延迟时间值。当 HTTP 请求完成后,该服务会递增范围包含请求延迟时间值的存储分区中的计数。这些存储分区计数用于创建该分钟的值的直方图。

如果存储分区是 [0, 4)、[4, 8)、[8, 12) 和 [12, 16),,并且以 1 分钟为间隔的请求的延迟时间为 5、1、3、5、6、10 和 14,那么这些数据的直方图为 [2, 3, 1, 1]:

存储分区 延迟时间测量值 存储分区中值的数量
[0,4) 1, 3 2
[4,8) 5, 5, 6 3
[8,12) 10 1
[12, 16) 14 1

将此类数据写入时间序列时,会创建一个 Point 对象。对于具有分布值的指标,该对象包含值直方图。对于此采样周期,Point 将包含 [2, 3, 1, 1]。单个测量值不会写入时间序列。

由于此类 HTTP 数据每分钟报告一次,因此时间序列可能包含以下直方图:

存储分区
1:00 的直方图

1:01 的直方图

1:02 的直方图

1:03 的直方图
[0, 4) 2 6 10 3
[4, 8) 3 1 1 8
[8,12) 1 0 2 2
[12, 16) 1 6 0 1

热图图表

热图图表旨在显示包含分布值的单个时间序列。对于这些图表,X 轴表示时间,Y 轴表示存储分区,值由颜色表示。颜色越亮表示值越高。例如,热图的深色区域表示存储分区计数低于黄色或白色区域。

下一张图是示例热图的一种表示形式。在本示例中,总和介于 0 到 10 之间。当值为零时,颜色为黑色。当值为 10 时,颜色为黄色。对于中间值(例如 6),颜色为橙色。

示例的热图图表。

由于热图图表只能代表一个时间序列,因此您必须设置聚合选项才能将所有时间序列合并到一个时间序列中:

  • 确保分组依据字段为空。
  • 分组依据函数选择 sum

折线图和条形图

折线图、堆叠条形图和堆叠折线图无法显示分布值。如果您的指标含有分布值,并且您希望使用上述图表类型之一显示该指标,则必须将 Point(例如 [2, 3, 1, 1])的直方图转换为数值。您可以通过多种方式完成此次转化。例如,您可以计算总和或选择一个百分位。

请考虑使用分布指标报告 HTTP 请求延迟时间的示例数据。下表以时间函数说明时间序列的直方图。最后一列显示直方图计数的总和。可以使用 x-y 图绘制最后一列:

时间 直方图1 直方图值的总和
1:00 [2, 3, 1, 1] 7
1:01 [6, 1, 0, 6] 13
1:02 [10, 1, 2, 0] 13
1:03 [3, 8, 2, 1] 14

1直方图存储分区为 [0, 4)、[4、8)、[8、12) 和 [12, 16)。直方图 [2, 3, 1, 1] 表示存储分区 [0, 4) 中的 2 个样本。

在此示例中,总和是有意义的测量结果,因为它可以被视为 HTTP 请求完成率:

示例折线图。

聚合和分布指标

聚合(即时间序列中正则化点和合并多个时间序列的过程)与分布类型指标(采用的值类型为整数或双精度数)的情况相同。但是,图表类型要求对用于校准和分组时间序列的选择施加一些要求。

热图图表

必须选择校准函数和分组依据函数,以便结果是含分布值的单个时间序列。

对于校准函数,您可以选择 sumdelta。这些函数在存储分区级别中将同一校准时间段的单个时间序列的所有样本组合在一起,并且结果为分布值。例如,如果时间序列的两个相邻样本为 [2, 3, 1, 1] 和 [2, 5, 4, 1],则 sum 校准函数会生成 [4, 8, 5, 2]。

对于分组依据函数,唯一的选项是 sum。此函数将相同存储分区中不同时间序列的值相加在一起。结果为分布值。例如,如果在 1:00 时 timeseries-A 直方图为
[2, 3, 1, 1],timeseries-B 直方图为 [1, 5, 2, 2 ],那么将这些直方图汇总到一起会生成 [3, 8, 3, 3]。

折线图

必须选择校准函数和分组依据函数,以确保在聚合完成后,分布值将转换为数值。您可以使用校准函数或“分组依据”函数将分布值转换为数值。

  • 如果您为校准函数选择了百分位,则在聚合的校准阶段期间,每个分布值都将转换为数值。给时间序列分组是可选操作。

    例如,要显示每个时间序列的第 99 百分位,请将校准函数设置为 99th percentile,请确保分组依据选项为空,并将“分组依据”函数设置为 none。采用这种配置时,图表可显示多条线,每个时间序列对应一个一条线。

  • 如果您选择 sumdelta 作为校准函数,则校准阶段结束时,每个样本都会包含一个分布值。使用这些校准函数时,您必须选择“分组依据”函数。“分组依据”函数将分布值转换为数值。

    例如,要显示所有时间序列的第 99 百分位,请将校准函数设置为 sum,请确保分组依据选项为空,并将“分组依据”函数设置为 99th percentile。由于分组依据选项为空,因此“分组依据”函数将所有时间序列的分布值合并成一个新的分布值,然后选择第 99 百分位。采用这种配置时,图表只会显示一条线。

了解分布百分位

在热图上绘制分布值指标图表时,您可以选择叠加第 50 百分位、第 95 百分位和第 99 百分位。如果要在折线图上显示分布值指标,则必须将其转换为数字指标,一种方法是选择百分位。您可能不清楚如何解释这些百分位或如何生成这些百分位。

百分位值是一个计算值。计算时会考虑存储分区的数量、存储分区的宽度和样本总数。由于实际测量值是未知的,因此百分位计算无法依赖此类数据。

含合成数据的示例

假设有一个 Exponential 存储分区模型,扩缩因数为 1,增长因数为 2。这将产生一系列存储分区,其中第 (i+1) 个存储分区的宽度是第 i 个存储分区的两倍。

案例 1:样本总数为 1。

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

存储分区 计数
[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

当只有一个测量值时,三个百分位值会有所不同,但它们仅显示同一存储分区的第 50、95 和 99 百分位。无法确定估计值与实际测量值之间的误差,因为测量值未知。唯一知道的是有一个读取值在 [128, 256) 区间内。此值可能为 128,也可能为 255。

案例 2:样本总数为 10。

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

存储分区 计数
[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

如本示例所示,当有 10 个样本时,第 50 百分位可能位于与第 95 百分位和第 99 百分位不同的存储分区。但是,仍没有足够的测量值使得第 95 百分位和第 99 百分位可位于不同的存储分区中。

含实际数据的示例

本部分包含一个详细示例,说明如何确定特定指标使用的存储分区模型,以及如何计算所计算百分位值中的潜在误差。

确定存储分区模型

若要确定用于此指标的存储分区,请使用 Cloud Monitoring API 的 projects.timeSeries/list 方法。

本示例使用 API Explorer 和以下设置从现有 Google Cloud 项目中拉取显示的数据:

  • 指标过滤器metric.type="networking.googleapis.com/google-service/backend_latencies" resource.type="google_service_gce_client" resource.label."zone"="us-central1-f"
  • 结束时间2020-11-03T10:06:36-05:00
  • 开始时间2020-11-03T10:04:00-05:00

此查询的响应包含存储分区模型和分布中的样本数量:

{
  "timeSeries": [
    {
      "metric": {
        "labels": {
          "service_name": "monitoring.googleapis.com",
          "protocol": "HTTP/2.0",
          "response_code_class": "200",
          "service_region": "us-central1"
        },
        "type": "networking.googleapis.com/google-service/backend_latencies"
      },
      "resource": {
          [redacted]
        }
      },
      "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"
              ]
            }
          }
        },

此结果表明,Service Networking 使用带有 66 个存储分区的指数模型写入后端延迟时间数据,扩缩因数为 1,增长因数为 1.4。API 响应显示,对于指定的 1 分钟时间间隔,3 个测量值的平均值为 25.889。

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

第 i 个间隔 下限1 上限2 中点 每百分位的贡献
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

1 下限 = 扩缩因数 * (增长因数)^(i-1)
2 上限 = 扩缩因数 * (增长因数)^i

基于之前的分析,我们预计如果第 50 百分位位于存储分区编号 10 中,那么第 50 百分位值为 24.78。

验证百分位计算

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

  • 校准器ALIGN_50ALIGN_95ALIGN_99
  • 校准时间段:60s

对于 ALIGN_50 选择,API 方法会返回以下数据:

{
  "timeSeries": [
    {
      "metric": {
         [redacted]
      },
      "resource": {
         [redacted]
         }
      },
      "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
          }
        }
      ]
    },

运行第 95 和第 99 百分位校准器的命令后,我们得到以下数据:

统计信息 样本 @ 15:06 样本 @ 15:05 样本 @ 15:04
平均值1 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

1 使用存储分区详细信息报告平均值。

百分位值与预期值一致。第 50 百分位值是间隔的中点。同样,如果您知道第 99 百分位位于存储分区 10 中,则第 99 百分位值应该约为 20.66 +(99*0.0827) 或 28.84。此值与报告的值一致。

在此类数据中,时间 15:05 和 15:06 报告的数据平均值与 50% 百分位值非常相似。这样,如果直方图中的样本数量足够大,则第 50 百分位也为总体平均值的合理估计值。

摘要

本页介绍了包含分布值的图表绘制指标。对于这些指标,每个 Point 都包含一个时间间隔和一个 DistributionDistribution 定义了存储分区,并包含与每个存储分区关联的计数的直方图。

您可以使用热图绘制包含分布值的指标。如果要使用折线图,则必须将直方图转换为数值。执行此转换的一种方法是绘制分布的特定百分位。

系统会计算分布指标的百分位值,并且算法取决于存储分区计数、存储分区宽度和直方图形状:

  • 第 50、第 95 和第 99 百分位的值始终不同。但是,它们在同一个存储分区中可能会显示不同的百分位。
  • 不会根据测量值生成这些百分位,因为这些值不可用。
  • 存储分区宽度确定计算百分位和测量值之间的最大误差。
  • 直方图中的样本数量很重要。例如,如果此数字小于 20,则第 95 和第 99 百分位始终在同一个存储分区中。
  • 对于任何分布指标,您可以使用 Cloud Monitoring API 来标识用于该指标的存储分区模型。由于此模型含时间戳,因此服务可以更改存储分区模型。