在 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 個百分位數,請按照下列步驟操作:
- 使用值區計數來判斷包含第 50 個百分位數的值區。在這個範例中,第 8 個值區包含第 50 個百分位數。
使用下列規則計算預估值:
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 方法。
舉例來說,如要找出指標的值區模型,請按照下列步驟操作:
- 前往
projects.timeSeries/list網頁。 在 APIs Explorer 中,輸入指定指標、開始時間和結束時間的篩選器。
舉例來說,如要取得儲存 API 要求延遲時間的指標資訊,請輸入下列內容:
metric.type="serviceruntime.googleapis.com/api/request_latencies" resource.type="consumed_api"在這個範例中,篩選器欄位指定了指標類型和資源類型。如要進一步瞭解這些篩選器,請參閱「監控篩選器」。
按一下 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 百分位數進行比較。系統會傳回平均值和值區詳細資料。
後續步驟
如要瞭解如何以圖表呈現分布值指標,請參閱「關於分布值指標」。