使用記錄指標

本頁面說明如何發出記錄,以建立可用性和延遲 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 欄位。

您必須建立記錄指標計數器指標,才能建構這個比率。您必須建立至少兩個下列項目:

  1. 計算事件總數的指標;請在比率的totalServiceFilter中使用這項指標。

    以「stack-doctor」為例,您可以建立記錄指標,計算訊息字串中出現「request made」的記錄項目。

  2. 計算「不良」事件的指標,請在比率中使用這項指標。 badServiceFilter

    以「stack-doctor」為例,您可以建立記錄指標,計算訊息字串中出現「failure!」的記錄項目。

  3. 這項指標會計算「良好」事件,可用於比率的分子。goodServiceFilter

    以「stack-doctor」為例,您可以建立記錄指標,計算訊息字串中出現「success!」的記錄項目。

本例中描述的 SLI 是以名為 log_based_total_requests 的總要求指標,以及名為 log_based_errors 的錯誤指標為依據。

您可以使用 Google Cloud 控制台、Cloud Logging API 或 Google Cloud CLI 建立記錄指標。如要使用 Google Cloud 控制台建立記錄計數器指標,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往「記錄指標」頁面:

    前往「記錄指標」

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果

    記錄指標頁面會顯示使用者定義指標和系統定義指標的表格。

  2. 按一下使用者定義指標表格上方的「建立指標」

  3. 在「指標類型」窗格中,選取「計數器」

  4. 在「詳細資料」窗格中,為新指標命名。以「stack-doctor」 為例,請輸入 log_based_total_requestslog_based_errors

    在本範例中,您可以忽略其他欄位。

  5. 在「篩選器選取」面板中,建立查詢,只擷取您要在指標中計數的記錄項目。

    以「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!"
    
  6. 按一下「預覽記錄」檢查篩選器,並視需要調整。

  7. 在這個範例中,請忽略「標籤」窗格。

  8. 按一下「建立指標」,完成程序。

如要進一步瞭解如何建立記錄計數器指標,請參閱「建立計數器指標」。

延遲 SLI 的指標

您可以在 Cloud Monitoring API 中使用 DistributionCut 結構體,表示以要求為準的延遲時間 SLI,該結構體用於 RequestBasedSli 結構體的 distributionCut 欄位中。您必須建立記錄分布指標,才能建立延遲時間 SLI。 這個範例會建立名為 log_based_latency. 的記錄分布指標

您可以使用 Google Cloud 控制台、Cloud Logging API 或 Google Cloud CLI 建立記錄指標。如要使用 Google Cloud 控制台建立以記錄為準的分布指標,請按照下列程序操作:

  1. 在 Google Cloud 控制台中,前往「記錄指標」頁面:

    前往「記錄指標」

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果

    記錄指標頁面會顯示使用者定義指標和系統定義指標的表格。

  2. 按一下使用者定義指標表格上方的「建立指標」

  3. 在「指標類型」窗格中,選取「分布」

  4. 在「詳細資料」窗格中,為新指標命名。以「stack-doctor」為例,請輸入 log_based_latency

    在本範例中,您可以忽略其他欄位。

  5. 在「篩選器選取」面板中,建立查詢,只擷取您要在指標中計數的記錄項目。

    以「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

  6. 在這個範例中,請忽略「標籤」窗格。

  7. 按一下「建立指標」,完成程序。

如要進一步瞭解如何建立以記錄為基礎的分佈指標,請參閱建立分佈指標

可用性 SLI

在 Cloud Monitoring 中,您可以使用 TimeSeriesRatio 結構體表示以要求為準的可用性服務水準指標。下列範例顯示在比率中使用 log_based_total_requestslog_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"
}

其他資源