百分位數和分布值指標

在 Cloud Monitoring 中,值類型為 Distribution 的指標會將大量測量結果分組為稱為「值區」的值範圍,而不是記錄每個個別資料點。將值區計數記錄為直方圖,可讓服務匯總大量測量結果,以便分析平均值和百分位數等統計資料。

在熱視圖圖表中,您可以從圖表工具列疊加第 50、第 95 和第 99 個百分位數。如要在折線圖上顯示分布值指標,請使用校準器選取百分位數,將每個分布轉換為數值。

本文中的範例說明如何透過值區數量、值區寬度、測量結果分布和樣本大小,判斷預估百分位數值,而不必儲存個別測量結果。

合成資料範例

假設 Exponential 值區模型的尺度為 1、成長係數為 2,且有 10 個有限值區。這個直方圖包含 12 個值區:10 個有限值區、1 個僅指定上限的值區,以及 1 個僅指定下限的值區。在本例中,索引為 n+1 的有限值區寬度是索引為 n 的有限值區的兩倍。

以下範例顯示,值區寬度決定了計算出的百分位數與測量值之間的最大誤差。此外,這些範例也顯示直方圖中的樣本數很重要。舉例來說,如果樣本數少於 20,第 95 和 99 個百分位數一律會落在同一個值區。

案例 1:樣本總數為 1

如果只有一項測量結果,三個百分位數值會有所不同,但只會顯示同一個值區的第 50、95 和 99 個百分位數。由於無法得知實際測量值,因此無法判斷預估值與實際測量值之間的誤差。

舉例來說,假設測量結果的直方圖如下表所示:

bucket 數量 下限 上限 數量 百分位數範圍
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 個百分位數,請按照下列步驟操作:

  1. 使用值區計數來判斷包含第 50 個百分位數的值區。在這個範例中,第 8 個值區包含第 50 個百分位數。
  2. 使用下列規則計算預估值:

    pth percentile = 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。在這個範例中,只有一個樣本,百分位數如下:

百分位數 Bucket 號碼 值
第 50 8 192
第 95 百分位 8 249.6
第 99 百分位 8 254.7

預估值和實際測量值之間的誤差可以限定,但由於測量值未知,因此無法確定。

案例 2:樣本總數為 10

如果有 10 個樣本,第 50 個百分位數可能與第 95 和 99 個百分位數位於不同的值區。不過,由於測量結果不夠多,第 95 和 99 個百分位數無法分到不同值區。

舉例來說,假設測量結果的直方圖如下表所示:

bucket 數量 下限 上限 數量 百分位數範圍
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

使用先前所述的程序,即可計算百分位數。下表中的每一列都會列出百分位數、對應的值區和計算值:

百分位數 Bucket 號碼 值 最大誤差
第 50 1 1.5 0.5
第 95 百分位 8 192 74
第 99 百分位 8 243.2 115.2

在這個範例和上一個範例中,第 95 個百分位數位於第 8 個值區,但百分位數的計算方式不同。差異在於樣本的分佈方式。在第一個範例中,所有樣本都在同一個值區中,而在最近的範例中,樣本則位於不同的值區中。

實際資料範例

本節提供範例,說明如何判斷特定指標使用的值區模型。本節也說明如何評估計算出的百分位數值中可能存在的誤差。

找出值區模型

如要判斷特定時間間隔內指標使用的值區,請呼叫 Cloud Monitoring API 的 projects.timeSeries/list 方法。

舉例來說,如要找出指標的值區模型,請按照下列步驟操作:

  1. 前往 projects.timeSeries/list 網頁。
  2. 在 APIs 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 陣列中的資料。count 和 mean 欄位會回報在指定時間間隔內有 3 個測量值,平均值為 25.889。bucketOptions 欄位顯示指數模型已設為 66 個 bucket、1 個級別和 1.4 的成長係數。

如要計算索引 n 的值區下限和上限,請使用下列規則:

  • 下限 (1 ≤ n < N) = 比例 * (成長係數)(n-1)
  • 上限 (0 ≤ n < N-1) = 縮放比例 * (成長係數)n

在上述運算式中,N 是值區總數。

下表列出這項指標的 bucket,以及每個 bucket 的中點:

第 n 個 bucket 下限 上限 播到一半
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
...

驗證百分位數計算結果

瞭解 bucket 設定後,您就能預測任何一組測量結果的第 50、95 和 99 個百分位數值。舉例來說,如果只有一個樣本,且位於第 10 個值區,則第 50 個百分位數值為 24.79。

如要擷取指標的第 50、95 和 99 個百分位數值,您可以使用 API 方法 projects.timeSeries/list,並加入對齊週期和對齊器。在這個範例中,我們選取了下列設定:

  • 校正函式:ALIGN_PERCENTILE_50、ALIGN_PERCENTILE_95 或 ALIGN_PERCENTILE_99
  • Alignment period (對齊週期):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 百分位數進行比較。系統會傳回平均值和值區詳細資料。

後續步驟

如要瞭解如何以圖表呈現分布值指標,請參閱「關於分布值指標」。