使用記錄指標

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

您必須建立記錄計數器指標,才能用於建立此比率。您必須建立下列兩項中的至少一項:

  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 控制台中,前往「Log-based Metrics」(記錄指標) 頁面:

    前往「記錄指標

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

    「以記錄為基礎的指標」頁面會顯示使用者定義指標表格和系統定義指標表格。

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

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

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

    您可以忽略此範例中的其他欄位。

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

  7. 在本範例中,請忽略「Labels」窗格。

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

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

延遲時間 SLI 的指標

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

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

  1. 在 Google Cloud 控制台中,前往「Log-based Metrics」(記錄指標) 頁面:

    前往「記錄指標

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

    「以記錄為基礎的指標」頁面會顯示使用者定義指標表格和系統定義指標表格。

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

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

  4. 在「Details」窗格中,為新指標命名。在「stack-doctor」範例中,請輸入 log_based_latency

    您可以忽略此範例中的其他欄位。

  5. 在「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

  6. 在本範例中,請忽略「Labels」窗格。

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

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

可用性服務水準協議

在 Cloud Monitoring 中,您可以使用 TimeSeriesRatio 結構體表示以要求為準的可用性 SLI。以下範例顯示 SLO,其中使用 log_based_total_requestslog_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"
}

其他資源