百分位數和分布值指標

本文說明如何瞭解百分位數和直方圖模型,適用於採用 Distribution 值類型的指標資料。分布指標會定義值範圍 (稱為「值區」),並記錄落入每個值區的測量值計數。分布指標不會回報個別評估值,而是回報值區中的計數直方圖。當個別測量值過多而無法收集,但這些測量值的統計資訊 (例如平均值或百分位數) 很有價值時,服務就會使用這個值類型。

在熱圖上繪製分布值指標時,您可以使用圖表工具列中的選項,重疊第 50、95 和 99 個百分位數。如要在折線圖上顯示分佈值指標,您必須設定圖表,將分佈值轉換為數值。您可以使用選取百分比的對齊器,執行這項轉換。

本頁的下一節將使用綜合範例,說明如何判斷百分位數。這個範例顯示百分位數值取決於值區數量、值區寬度、測量值分布情形,以及樣本總數。百分位數值不依賴實際測量值,因為直方圖中沒有這些值。

使用綜合資料的範例

請考慮 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 百分位數,請按照下列步驟操作:

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

    pth percentage = bucket_low +
                    (bucket_up - bucket_low)*(p - p_low)/(p_up - p_low)
    

    在前述運算式中,p_lowp_up 分別是 bucket 百分比範圍的下限和上限。同樣地,bucket_lowbucket_up 是值區的下限和上限。p_lowp_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 方法。

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

  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 的值區下限和上限,請使用下列規則:

  • 下限 (1 ≤ n < N) = 比例 * (成長因子)(n-1)
  • 上限 (0 ≤ n < N-1) = 比例 * (成長因子)n

在上述運算式中,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,並加入校正時間範圍和校正器。在本例中,選取了下列設定:

  • AlignerALIGN_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 百分位數即為該值區的中間點。不過,如果樣本位於不同的值區,則分布情形會影響估計值。

如要判斷第 50 個百分位數是否為平均值的合理估計值,您可以將平均值與第 50 個百分位數進行比較。系統會傳回平均值和 bucket 詳細資料。

後續步驟

如要瞭解如何將分布值指標視覺化,請參閱「關於分布值指標」。