針對 Cloud Functions 使用 Stackdriver Logging 和 Stackdriver Trace

1. 簡介

在本程式碼研究室中,您將學習如何運用記錄與監控工具,所有使用 Cloud Functions 的開發人員均能使用這些工具。這些工具隨附您部署於所有支援語言的所有 Cloud 函式,能讓您在編寫及操作無伺服器程式碼時提高工作效率。

5815064fec87444b.png

您將使用由 HTTP 觸發的 Cloud 函式,但您涵蓋的所有內容亦適用於其他語言,以及透過其他事件觸發的 Cloud Functions。

2. 設定和需求

自修環境設定

  1. 登入 Cloud 控制台建立新專案,或是重複使用現有專案。(如果您還沒有 Gmail 或 G Suite 帳戶,請先建立帳戶)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID

  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。

執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

Cloud Shell

雖然 Cloud Functions 及其記錄和監控功能可從筆記型電腦遠端使用,但您將使用 Cloud Shell,這是在 Google Cloud 中運作的指令列環境。

這種以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。換言之,本程式碼研究室只需要在 Chromebook 上運作即可。

  1. 如要透過 Cloud 控制台啟用 Cloud Shell,只要點選「啟用 Cloud Shell」 圖示 fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q 即可 (整個佈建作業只需幾分鐘的時間,操作完畢即可)。

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 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>

如因故未設定專案,請直接發出以下指令:

gcloud config set project <PROJECT_ID>

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

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

根據預設,Cloud Shell 也會設定一些環境變數,方便您之後執行指令。

echo $GOOGLE_CLOUD_PROJECT

指令輸出

<PROJECT_ID>
  1. 最後,進行預設可用區和專案設定。
gcloud config set compute/zone us-central1-f

您可以選擇各種不同的可用區。詳情請參閱「區域與可用區

3. 部署簡易的 Cloud 函式

如要監控項目,請建立「Hello, World」Cloud 函式。在 Google Cloud 控制台的左側選單中,依序點選「Cloud Functions」和「建立函式」

3c13aa20af602aa7.png

輸入「hello-monitor」做為新 Cloud 函式的名稱。

fa6816c96d6d5b94.png

保留原始碼的所有預設值。(但您也可以選擇其他語言/執行階段)。

(7aadf164450484e.png)

最後點選「建立」

dc74cd21000d6c91.png

您應該會看到 Cloud 函式旁邊有綠色勾號,表示已準備好叫用。

5363a34eb001d5ed.png

4. 測試 Cloud 函式,並使用負載產生器傳送流量

現在,Cloud 函式已成功部署,請從指令列進行測試。

首先,透過 Cloud Shell 執行下列指令:

$ gcloud functions describe hello-monitor

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

觸發 Cloud 函式現在應和在該網址上使用 curl 指令一樣簡單。

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

現在使用簡易的 HTTP 負載測試工具 Vegeta。如要從 Cloud Shell 安裝這個指令碼,只要輸入以下指令即可:

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

如要將一些流量傳送至 Cloud 函式 (幾分鐘內每秒五項要求),請使用下列指令:

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

5. 瀏覽記錄檔

在 Cloud 函式詳細資料檢視畫面中,按一下「查看記錄檔」

b24157fd3376e6a8.png

這樣會引導您前往專案的 Stackdriver Logging 部分,只顯示 Cloud 函式記錄檔。

5a36fa75d2fb0165.png

傳送至 Cloud 函式的所有要求都應該傳回 200 狀態碼。

查看記錄時,您可以執行以下操作:

  • 按照記錄層級篩選 (在這個範例中,所有記錄都是 debug 層級)。
  • 選取特定時間範圍 (相對或絕對)。
  • 啟用記錄串流 (位於畫面上方的「播放」圖示 751a4600016f34a7.png)。
  • 複製記錄項目連結 (供團隊成員共用)。
  • 在資源內容中顯示記錄項目。
  • 釘選記錄項目 (以視覺提示表示)。
  • 將記錄檔匯出至 BigQuery、Cloud Storage 或 Pub/Sub (或直接將記錄檔下載為 JSON 或 CSV 檔案)。

6. 更新函式

使用 Cloud 控制台前往「Function details」(函式詳細資料) 檢視畫面,然後觀察您建立的每秒叫用次數和執行時間,然後觀察您使用負載測試者建立的高峰。

aaee3159bbe395d3.png 7ed347101da5eca0.png

這是一項更詳細的工具,可以觀察延遲情況和遠端程序呼叫 (RPC) 呼叫,不過您必須先對 Cloud Functions 進行幾項變更,才能使用這項工具。請完成下列步驟:

  1. 將省電的 node-emoji 套件新增為依附元件。
  2. 更新函式程式碼以使用節點表情符號模組,並造成延遲。
  3. 新增環境變數,為 Cloud Functions 啟用 Stackdriver Trace。

在「函式詳細資料」中,按一下 [編輯] 修改函式。

39b0f8f98b18a6c0.png

編輯 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 毫秒後,將隨機表情符號加入 Cloud 函式傳回的訊息。

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

9205bd277b76aa21.png

按一下 [儲存]

返回 Cloud Shell 並回想這個指令,藉此對新部署的 Cloud 函式產生一些負載:

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

現在可以開始觀察在沒有其他設定要求,也沒有特定追蹤程式庫的情況下產生的追蹤記錄清單了!

7. 追蹤更新後的 Cloud 函式

使用左側選單,前往「Trace list」(追蹤記錄清單) (位於「Stackdriver Trace」下方)。

576373f38cad6f8.png

畫面應類似以下螢幕截圖:

44a36b758b49f88f.png

如此一來,就顯而易見的是,Cloud 函式導入的延遲時間確實是 300 毫秒。

圖表上的每個圓點都是一個要求,您可以查看詳細資訊,例如時間戳記、HTTP 方法和狀態、其標籤、對應記錄項目的連結,以及 Cloud 函式發出的任何後續遠端程序呼叫 (RPC)。

5815064fec87444b.png

若要放大,只要在圖表上按一下並拖曳即可。在追蹤記錄圖表中選取自訂的時間範圍

如要縮小,請按一下頁面頂端的「復原縮放」

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

前往左側選單中的「總覽」

e920cfca2a50899e.png

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

ef5a45647967d275.png

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

5bd34e9d13b47fb6.png

如果您具備足夠的資料點來設定正確的時間範圍,就能產生報表,瞭解初始 Cloud 函式與新函式之間出現的重要延遲轉變。

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

這類自訂報表可用來找出發生效能問題的時間,並追蹤服務水準指標 (SLI),例如使用者要求延遲。

8. 使用時間清理資源

本程式碼研究室到此結束!

Cloud Functions 和 Stackdriver 工具是無伺服器的平台,在不使用的情況下不會產生費用,但成為良好的雲端公民並刪除 Cloud 函式。只要在「Cloud Functions」下方的「Overview」(總覽) 中選取 hello-monitor,然後按一下「Delete」(刪除) 即可。

aceb633cf70a4a27.png

9. 接下來要做什麼?

以下是後續追蹤:

/