Cloud Functions 記錄及追蹤程式碼研究室

本程式碼研究室的目標是讓您瞭解如何運用所有 Cloud 函式開發人員提供的記錄和監控工具。這些工具隨附所有以支援語言部署的 Cloud 函式,因此在編寫及操作無伺服器程式碼時,應能提高生產力。

這裡將使用 HTTP 觸發的函式,但其涵蓋的所有內容也適用於其他語言和由其他事件觸發的函式 (儲存空間值區、Pub/Sub 等)。

自行調整環境設定

如果您還沒有 Google 帳戶 (Gmail 或 Google Apps),請先建立帳戶。登入 Google Cloud Platform 主控台 (console.cloud.google.com),然後建立新專案:

2016-02-10 12:45:26.png 的螢幕擷取畫面

提醒您,專案編號是所有 Google Cloud 專案的不重複名稱 (使用上述名稱後就無法使用,敬請見諒!)此程式碼研究室稍後將稱為 PROJECT_ID

接著,您必須在 Cloud Console 中啟用計費功能,才能使用 Google Cloud 資源。

完成這個程式碼研究室的成本應該不會超過新臺幣 $300 元,但如果您決定繼續使用更多資源,或是讓資源繼續運作 (請參閱本文件結尾的「清除設定」一節),就有可能需要更多成本。

新加入 Google Cloud Platform 的使用者可免費試用 $300 美元

Google Cloud Shell

雖然您可以在筆記型電腦上遠端使用 Google Cloud Functions 及其記錄和監控功能,但在這個程式碼研究室中,我們會使用 Google Cloud Shell,這是一個在 Cloud 中執行的指令列環境。

這款以 Debian 為基礎的虛擬機器會載入您需要的所有開發工具。這項服務提供永久性的 5GB 主目錄,可在 Google Cloud 中運作,大幅提升網路效能和驗證效能。也就是說,這個程式碼研究室只需使用瀏覽器 (是,您可以在 Chromebook 上使用)。

如要啟用 Google Cloud Shell,只要在開發人員控制台中,按一下右上角的按鈕 (只需幾分鐘即可佈建並連線至環境):

啟用 Cloud Shell.png

按一下 [Start Cloud Shell] 按鈕:

Screen Shot 2017-06-14 晚上 10.13.43 PM.png

連線至 Cloud Shell 之後,您應該會看到您已經通過驗證,且專案已設為 PROJECT_ID

gcloud auth list

指令輸出

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

根據預設,Cloud Shell 也會設定某些環境變數,當您執行未來指令時可能會用到這個變數。

echo $GOOGLE_CLOUD_PROJECT

指令輸出

<PROJECT_ID>

如果因為某些原因而無法設定專案,只要發出下列指令即可:

gcloud config set project <PROJECT_ID>

正在尋找您的 PROJECT_ID 嗎?您可以查看在設定步驟中使用的 ID,或是在控制台資訊主頁查詢 ID:

專案 ID.png

重要事項:最後,請設定預設區域和專案設定:

gcloud config set compute/zone us-central1-f

您可以選擇多種不同的區域。詳情請參閱地區和區域說明文件

為了監控需要監控的項目,讓我們建立 Hello World 雲端函式。在主控台的左選單中,依序按一下 [Cloud Functions] 和 [Create function]。:

為新函式命名「hello-monitor」:

... 然後保留所有原始碼的預設值 (不過您也可以視需要選擇不同語言/執行階段):

最後,請使用「Create」按鈕來建立函式:

不久之後,您會看到函式已列為可叫用 (以綠色勾號表示):

現在已成功部署雲端函式,我們將透過指令列進行測試。

首先,使用 Cloud Shell 發出以下指令:

$ gcloud functions describe hello-monitor

系統應會傳回函式說明,包括 httpsTrigger 的網址,這是叫用函式的 HTTP(S) 端點。格式如下:https://<region>-<project-id>.cloudfunctions.net/hello-monitor

現在觸發函式的過程應該和 curl' 這個網址 一樣簡單:

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

我們現在使用 Vegeta 這個簡單的 HTTP 負載測試工具。如要安裝此程式,只要從 Cloud Shell 輸入以下指令:

$ go get -u github.com/tsenart/vegeta

如要將一些流量傳送至您的 Cloud Functions (每秒要求 5 次,請稍候幾分鐘),請使用下列指令:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

在函式詳細資料檢視畫面中,按一下「查看記錄」右側的選單 :

這應該會將您導向專案的 Stackdriver Logging 區段,僅顯示您的 Cloud Functions 記錄:

希望對函式的所有要求都會傳回 200 狀態碼。

這個記錄檢視器可讓您:

  • 依記錄層級篩選 (在本例中,所有記錄均為 Debug 層級)
  • 選取特定的時間範圍 (相對或絕對值)
  • 啟用紀錄串流功能 (畫面頂端的「播放」按鈕)
  • 複製記錄項目的連結 (以便與小組成員分享)
  • 在資源內容中顯示記錄項目
  • 固定記錄項目 (以視覺化提示形式)
  • 將記錄匯出至 BigQuery、Cloud Storage 或 Cloud Pub/Sub (或直接下載 JSON 或 CSV 格式)

另請注意,您可使用左上方的篩選器,按函式篩選紀錄。您也可以在視窗頂端的搜尋列中搜尋標籤或全文搜尋。在我們的案例中,標籤為 hello-monitor (函式名稱) 以及每個要求的執行 ID。

您也可以複製篩選器來分享 (請參閱搜尋框中的下拉式選單):

使用主控台瀏覽至「函式詳細資料」;檢視和觀察我們透過負載測試工具建立的尖峰 (無論是每秒叫用次數和執行時間):

另一個比較可觀測延遲和 RPC 呼叫的工具是 Stackdriver Trace 功能。但在使用這項功能之前,我們需要對其函式進行幾項變更,也就是:

  1. 新增可拯救救命的 node-emoji 套件做為依附元件
  2. 更新函式程式碼以使用 node-emoji 模組並導入一些延遲設定
  3. 新增環境變數,為 Cloud Functions 啟用 Stackdriver Trace

在「函式詳細資料」頁面中,按一下 [編輯] 即可修改函式:

編輯 package.json 檔案,為 node-emoji 套件新增依附元件:

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

index.js 的內容變更為下列內容,即可編輯實際的函式:

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

這個函式會在函式暫停 300 毫秒後,在函式傳回的訊息中加入隨機表情符號。

最後,加入名為 GOOGLE_CLOUD_TRACE_ENABLED 的 Cloud 函式環境變數,並設為 true,如下所示:

別忘了按一下「儲存」!

現在,返回 Cloud Shell 並呼叫指令,以對新部署的函式產生一些負載:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

我們現在已準備好觀察系統產生的追蹤記錄清單,不需要另外設定、在追蹤程式碼中沒有特定的追蹤程式庫!

使用左側選單,前往 Stackdriver Trace 下方的「追蹤」清單:

您應該會看到類似以下的螢幕畫面擷取內容:

這應該要清楚地看出,我們的函式所延遲的延遲時間確實為 300 毫秒。

此圖表中的每個點都代表您可以檢視詳細資訊,例如時間戳記、HTTP 方法和狀態、其標籤、返回對應記錄項目的連結,以及函式後續的所有 RPC 呼叫:

如要放大圖表,只要按住圖表並拖曳即可:在追蹤記錄圖表中選取自訂的時間範圍

如要縮小畫面,請按一下頁面頂端的 [復原縮放] 按鈕。

由於我們部署了單一函式,因此圖表只會顯示 hello-monitor URI 上的 GET 個要求,但您可以依據 HTTP 方法 (GET、POST、DELETE、...)、HTTP 狀態 (2XX、3XX、...) 或使用要求篩選條件來篩選追蹤記錄。

立即前往左側選單的「追蹤記錄」部分:

您可以在這個總覽頁面查看近期追蹤記錄和其他深入分析資訊。

...以及根據 URI 要求篩選器、HTTP 方法、HTTP 狀態和時間範圍的組合建立自訂報表。甚至還可以比較產生的值與時間基準 :

如果您在設定正確的時間範圍和足夠的資料點後,可以產生一份報表,其中顯示初始函式與新函式之間的重大延遲變更:

這類自訂報表可用於找出成效問題的時機,以及追蹤使用者要求延遲時間等服務水準指標 (SLI)。

因此,我們的程式碼研究室說明瞭如何部署新的雲端函式、瀏覽其記錄並觀察其要求追蹤記錄。

儘管 Cloud Functions 和 Stackdriver 工具是無伺服器平台,只要不使用,就不會產生費用,不過身為優秀的雲端公民,可讓我們刪除我們的函式。

您只要在 Cloud Functions 總覽頁面中選取 hello-monitor 函式,然後按一下 [刪除] 即可。

以上就是使用 Cloud Functions 記錄和追蹤記錄的簡易入門程式碼研究室!

以下提供幾個後續追蹤資訊:

/