本頁面說明如何發出記錄,以建立可用性和延遲 SLI。此外,本文也提供實作範例,說明如何使用記錄指標定義 SLO。
您可以利用記錄項目中的資料元素建立服務水準指標,善用現有的記錄酬載。否則,您或許可以為現有服務新增記錄功能,這可能比建立指標檢測更容易。
記錄檔和指標
記錄會收集稱為「記錄項目」的記錄,說明電腦系統中發生的特定事件。記錄是由程式碼、程式碼執行的平台服務 (例如 Dataflow),以及平台所依附的基礎架構 (例如 Compute Engine 執行個體) 寫入。
由於現代系統中的記錄是從寫入磁碟的文字檔衍生而來 (有時仍是),因此記錄項目類似於記錄檔中的一行,可視為記錄的量子單位。
記錄項目至少包含下列兩項內容:
- 時間戳記,指出事件發生時間或事件擷取到記錄系統的時間
- 文字酬載,可以是未經處理的文字資料或結構化資料,最常見的是 JSON 格式。
記錄也可以攜帶相關聯的中繼資料,特別是當記錄擷取到 Cloud Logging 時。這類中繼資料可能包括寫入記錄的資源、記錄名稱,以及每個項目的嚴重程度。
記錄
記錄主要有兩個用途:
- 事件記錄會說明系統中發生的特定事件。您可以使用事件記錄輸出訊息,向使用者保證一切運作正常 (「工作成功」),或在發生錯誤時提供資訊 (「收到來自伺服器的例外狀況」)。
- 交易記錄會說明系統或元件處理的每筆交易詳細資料。舉例來說,負載平衡器會記錄收到的每項要求,無論要求是否成功完成,並記錄額外資訊,例如要求的網址、HTTP 回應狀態碼,以及可能用來處理要求的後端。
指標
與記錄檔不同,指標通常不會描述特定事件。更常見的是,指標用於表示系統在一段時間內的狀態或健康情形。指標是由一系列資料點組成,用於評估系統的某項特徵;每個資料點都包含時間戳記和數值。
指標也可能含有相關聯的中繼資料;資料點序列 (稱為「時間序列」) 可能包含指標名稱、說明,以及通常會指定哪個資源正在寫入資料的標籤。如要瞭解 Monitoring 指標模型,請參閱指標、時間序列和資源。
記錄指標
記錄指標是從記錄項目建立的指標,方法是從記錄項目中擷取資訊,然後轉換為時間序列資料。Cloud Logging 提供機制,可從記錄項目建立兩種指標:
計數器指標:計算符合特定篩選條件的記錄項目數。舉例來說,您可以使用計數器指標,判斷記錄檔中記錄的要求或錯誤數量。
分布指標:使用規則運算式剖析每個記錄項目的酬載,以擷取數值做為分布。
如要進一步瞭解 Cloud Logging 中的記錄指標,請參閱「使用記錄指標」。
使用記錄指標做為服務等級指標
記錄指標可讓您從記錄中擷取資料,並以可用於在 Monitoring 中建立 SLI 的形式呈現:
您可以使用記錄計數器指標,表示以要求為準的可用性服務水準指標。
您可以使用以記錄為準的分布指標,表示以要求為準的延遲時間 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,請先建立記錄指標。
- 如要取得要求和錯誤計數的可用性 SLI,請使用記錄指標的計數器指標。
- 如果是延遲時間 SLI,請使用記錄指標的分佈指標。
建立記錄指標後,您可以在 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 控制台中,前往「記錄指標」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
記錄指標頁面會顯示使用者定義指標和系統定義指標的表格。
按一下使用者定義指標表格上方的「建立指標」。
在「指標類型」窗格中,選取「計數器」。
在「詳細資料」窗格中,為新指標命名。以「stack-doctor」 為例,請輸入
log_based_total_requests
或log_based_errors
。在本範例中,您可以忽略其他欄位。
在「篩選器選取」面板中,建立查詢,只擷取您要在指標中計數的記錄項目。
以「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!"
按一下「預覽記錄」檢查篩選器,並視需要調整。
在這個範例中,請忽略「標籤」窗格。
按一下「建立指標」,完成程序。
如要進一步瞭解如何建立記錄計數器指標,請參閱「建立計數器指標」。
延遲 SLI 的指標
您可以在 Cloud Monitoring API 中使用 DistributionCut
結構體,表示以要求為準的延遲時間 SLI,該結構體用於 RequestBasedSli
結構體的 distributionCut
欄位中。您必須建立記錄分布指標,才能建立延遲時間 SLI。
這個範例會建立名為 log_based_latency.
的記錄分布指標
您可以使用 Google Cloud 控制台、Cloud Logging API 或 Google Cloud CLI 建立記錄指標。如要使用 Google Cloud 控制台建立以記錄為準的分布指標,請按照下列程序操作:
-
在 Google Cloud 控制台中,前往「記錄指標」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
記錄指標頁面會顯示使用者定義指標和系統定義指標的表格。
按一下使用者定義指標表格上方的「建立指標」。
在「指標類型」窗格中,選取「分布」。
在「詳細資料」窗格中,為新指標命名。以「stack-doctor」為例,請輸入
log_based_latency
。在本範例中,您可以忽略其他欄位。
在「篩選器選取」面板中,建立查詢,只擷取您要在指標中計數的記錄項目。
以「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。
- 欄位名稱:
在這個範例中,請忽略「標籤」窗格。
按一下「建立指標」,完成程序。
如要進一步瞭解如何建立以記錄為基礎的分佈指標,請參閱建立分佈指標。
可用性 SLI
在 Cloud Monitoring 中,您可以使用 TimeSeriesRatio
結構體表示以要求為準的可用性服務水準指標。下列範例顯示在比率中使用 log_based_total_requests
和 log_based_errors
指標的 SLO。這項服務水準目標要求「良好」要求與要求總數的比率,在 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
結構表示以要求為準的延遲時間服務水準指標。以下範例顯示使用 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"
}
其他資源
- Can you alert on logs in Stackdriver? | 作者:Yuri Grinshteyn
- 設定記錄指標的通知 | Cloud Logging
- 使用記錄指標從記錄檔中擷取價值