本頁面將說明發出記錄以建立可用性和延遲 SLI 的基本概念。並提供實作範例,說明如何使用記錄指標定義 SLO。
使用記錄項目中的資料元素建立服務層級指標,是善用現有記錄酬載的一種方式。否則,您可以為現有服務新增記錄,這可能比建立指標檢測器更容易。
記錄檔和指標
記錄會收集稱為「記錄項目」的記錄,用於描述電腦系統中發生的特定事件。記錄是由程式碼、程式碼執行的平台服務 (例如 Dataflow),以及平台依賴的基礎架構 (例如 Compute Engine 執行個體) 所寫入。
由於現代系統中的記錄是從寫入磁碟的文字檔衍生而來 (有時仍是文字檔),因此記錄項目可視為記錄檔中的一行,可視為記錄的量子單位。
記錄項目至少包含兩個部分:
- 時間戳記,指示事件發生或擷取至記錄系統的時間
- 文字酬載,可能是非結構化文字資料或結構化資料,最常見的格式為 JSON。
記錄也可能會攜帶相關聯的中繼資料,尤其是在擷取至 Cloud Logging 時。這類中繼資料可能包括寫入記錄的資源、記錄名稱,以及每個項目的嚴重性。
記錄
記錄主要有兩種用途:
- 事件記錄會說明系統中發生的特定事件。您可以使用事件記錄輸出訊息,向使用者保證一切運作正常 (「工作已成功」),或在發生錯誤時提供資訊 (「收到來自伺服器的例外狀況」)。
- 交易記錄會說明系統或元件處理的每筆交易詳細資料。舉例來說,負載平衡器會記錄收到的每項要求 (無論要求是否已順利完成),並記錄其他資訊,例如要求的網址、HTTP 回應代碼,以及可能的資訊,例如用於處理要求的後端。
指標
與記錄檔不同,指標通常不會描述特定事件。指標通常用於代表系統在一段時間內的狀態或健康狀況。指標由一系列用於評估系統的資料點組成,每個資料點都包含時間戳記和數值。
指標也可能與中繼資料相關聯;一系列資料點 (稱為「時間序列」) 可能包含指標名稱、說明等資訊,以及通常用於指定哪個資源寫入資料的標籤。如要瞭解 Monitoring 指標模型,請參閱指標、時間序列和資源。
記錄指標
記錄指標是從記錄項目建立的指標,方法是從記錄項目擷取資訊,並轉換為時序資料。Cloud Logging 提供機制,可從記錄項目建立兩種指標:
計數器指標:計算符合特定篩選條件的記錄項目數量。您可以使用計數器指標判斷記錄檔中記錄的要求或錯誤數量。
分佈指標:使用規則運算式剖析每個記錄項目中的酬載,擷取數值做為分佈。
如要進一步瞭解 Cloud Logging 中的記錄指標,請參閱「使用記錄指標」。
使用記錄指標做為服務等級指標
您可以使用記錄指標,從記錄中擷取可用於在 Monitoring 中建立 SLI 的資料:
您可以使用記錄計數器指標,表達以要求為準的服務水準指標。
您可以使用以記錄為依據的分布指標,表達以要求為依據的延遲時間服務水準指標。
記錄項目範例
Stack Doctor 應用程式就是服務檢測工具的範例,可發出記錄訊息,其中包含服務收到的所有要求、錯誤和延遲時間相關資訊。您可以在 stack-doctor
GitHub 存放區中找到這項服務的程式碼。
服務會在 projects/stack-doctor/logs/bunyan_log
記錄中產生 Cloud Logging 記錄項目。每種事件類型的記錄項目都包含不同的 message
值。不同類型事件的記錄項目如下所示:
每項要求:
{ "insertId": "..........iTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "pid": 81846, "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)", "hostname": "<hostname>", "level": 30, "message": "request made", "v": 0, "name": "sli-log" }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:49.263999938Z", "severity": "INFO", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:50.003471183Z" }
成功要求:
{ "insertId": "..........qTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "name": "sli-log", "v": 0, "pid": 81846, "level": 30, "hostname": "<hostname>", "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)", "message": "success!" }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:49.874000072Z", "severity": "INFO", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:50.201547371Z" }
針對已完成的要求:
{ "insertId": "..........mTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)", "level": 30, "name": "sli-log", "message": "slept for 606 ms", "hostname": "<hostname>", "pid": 81846, "v": 0 }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:49.874000072Z", "severity": "INFO", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:50.201547371Z" }
發生錯誤時:
{ "insertId": "..........DTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "hostname": "<hostname>", "level": 50, "pid": 81846, "message": "failure!", "name": "sli-log", "time": "Mon Aug 31 2020 20:30:44 GMT-0700 (Pacific Daylight Time)", "v": 0 }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:44.414999961Z", "severity": "ERROR", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:46.182157077Z" }
您可以根據這些項目建立記錄指標,計算所有要求、錯誤數量,並追蹤要求延遲時間。接著,您可以使用基於記錄的指標建立可用性和延遲服務水準目標。
為 SLI 建立記錄指標。
您必須先建立記錄指標,才能在記錄指標上建立服務等級目標。
- 如要針對要求和錯誤計數建立可用性 SLI,請使用以記錄為基礎的計數器指標。
- 如要設定延遲時間 SLI,請使用記錄分佈指標。
建立記錄指標後,您可以在 Monitoring 中找到這些指標,方法是使用 Metrics Explorer 搜尋。在 Monitoring 中,記錄指標會加上前置字串 logging.googleapis.com/user
。
可用性 SLI 的指標
您可以在 Cloud Monitoring API 中,使用 TimeSeriesRatio
結構體,針對「良好」或「不良」要求與總要求的比率,表達以要求為依據的可用性 SLI。這個比率會用於 RequestBasedSli
結構體的 goodTotalRatio
欄位。
您必須建立記錄計數器指標,才能用於建立此比率。您必須建立下列兩項中的至少一項:
計算事件總數的指標;請在比率的
totalServiceFilter
中使用這項指標。以「stack-doctor」為例,您可以建立記錄檔指標,計算出現「request made」訊息字串的記錄項目。
這項指標會計算「不良」事件,請在比率的
badServiceFilter
中使用這項指標。以「stack-doctor」為例,您可以建立以記錄為基礎的指標,計算出現「failure!」訊息字串的記錄項目。
這項指標會計算「成功」事件,並在比率的
goodServiceFilter
中使用這項指標。以「stack-doctor」為例,您可以建立以記錄為基礎的指標,計算出現「success!」訊息字串的記錄項目。
本例所述的 SLI 是根據總要求指標 (名稱為 log_based_total_requests
) 和錯誤指標 (名稱為 log_based_errors
) 計算而得。
您可以使用 Google Cloud 控制台、Cloud Logging API 或 Google Cloud CLI 建立記錄指標。如要使用 Google Cloud 控制台建立記錄計數器指標,請按照下列程序操作:
-
在 Google Cloud 控制台中,前往「Log-based Metrics」(記錄指標) 頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
「以記錄為基礎的指標」頁面會顯示使用者定義指標表格和系統定義指標表格。
按一下使用者定義指標表格上方的「建立指標」。
在「指標類型」窗格中,選取「計數器」。
在「Details」窗格中,為新指標命名。以「stack-doctor」為例,請輸入
log_based_total_requests
或log_based_errors
。您可以忽略此範例中的其他欄位。
在「Filter selection」面板中建立查詢,只擷取您要在指標中計數的記錄項目。
以「stack-doctor」範例來說,
log_based_total_requests
的查詢可能會包含以下內容:resource.type="global" logName="projects/stack-doctor/logs/bunyan_log" jsonPayload.message="request made"
logs_based_errors
的查詢會變更訊息字串:resource.type="global" logName="projects/stack-doctor/logs/bunyan_log" jsonPayload.message="failure!"
按一下「預覽記錄檔」檢查篩選器,並視需要進行調整。
在本範例中,請忽略「Labels」窗格。
按一下「建立指標」,完成程序。
如要進一步瞭解如何建立記錄計數器指標,請參閱「建立計數器指標」。
延遲時間 SLI 的指標
您可以使用 DistributionCut
結構體,在 Cloud Monitoring API 中表示以要求為基礎的延遲 SLI,該結構體會用於 RequestBasedSli
結構體的 distributionCut
欄位。您必須建立記錄分布指標,才能建立延遲時間服務等級目標。這個範例會建立名為 log_based_latency.
的記錄分布指標
您可以使用 Google Cloud 控制台、Cloud Logging API 或 Google Cloud CLI 建立記錄指標。如要使用 Google Cloud 主控台建立以記錄為依據的分布指標,請按照下列程序操作:
-
在 Google Cloud 控制台中,前往「Log-based Metrics」(記錄指標) 頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
「以記錄為基礎的指標」頁面會顯示使用者定義指標表格和系統定義指標表格。
按一下使用者定義指標表格上方的「建立指標」。
在「指標類型」窗格中,選取「分布」。
在「Details」窗格中,為新指標命名。在「stack-doctor」範例中,請輸入
log_based_latency
。您可以忽略此範例中的其他欄位。
在「Filter selection」面板中建立查詢,只擷取您要在指標中計數的記錄項目。
以「stack-doctor」範例來說,
log_based_latency
的查詢可能會包含以下內容:resource.type="global" logName="projects/stack-doctor/logs/bunyan_log" jsonPayload.message="slept for"
請為篩選器查詢指定下列欄位:
- 欄位名稱:
json.message
規則運算式:
\s(\d*)\s
已完成要求的訊息字串格式為「slept for n ms」。規則運算式會從字串中擷取延遲時間值 n。
- 欄位名稱:
在本範例中,請忽略「Labels」窗格。
按一下「建立指標」,完成程序。
如要進一步瞭解如何建立以記錄為基礎的分布指標,請參閱「建立分布指標」。
可用性服務水準協議
在 Cloud Monitoring 中,您可以使用 TimeSeriesRatio
結構體表示以要求為準的可用性 SLI。以下範例顯示 SLO,其中使用 log_based_total_requests
和 log_based_errors
指標的比例。這個服務水準目標預期在 24 小時滾動期間內,「良好」要求與要求總數的比率至少為 98%:
{
"serviceLevelIndicator": {
"requestBased": {
"goodTotalRatio": {
"totalServiceFilter":
"metric.type=\"logging.googleapis.com/user/log_based_total_requests\"
resource.type=\"global\"",
"badServiceFilter":
"metric.type=\"logging.googleapis.com/user/log_based_errors\"
resource.type=\"global\""
}
}
},
"goal": 0.98,
"rollingPeriod": "86400s",
"displayName": "Log-Based Availability"
}
延遲時間 SLI
在 Cloud Monitoring 中,您可以使用 DistributionCut
結構來表示以要求為基礎的延遲時間 SLI。以下範例顯示使用 log_based_latency
指標的 SLO,並預期在 24 小時滾動期間,98% 的要求都會在 500 毫秒內完成:
{
"serviceLevelIndicator": {
"requestBased": {
"distributionCut": {
"distributionFilter":
"metric.type=\"logging.googleapis.com/user/log_based_latency\"
resource.type=\"global\"",
"range": {
"min": 0,
"max": 500
}
}
}
},
"goal": 0.98,
"rollingPeriod": "86400s",
"displayName": "98% requests under 500 ms"
}