使用 Google Stackdriver Debug、Trace、Logging 與記錄點

本教學課程將帶您瞭解 Google Stackdriver,讓您對 Google Cloud Platform 應用程式執行下列操作:

  • 在 App Engine、Compute Engine 和 Container Engine 上執行的應用程式中,擷取偵錯快照
  • 查看應用程式記錄
  • 設定指標、監控指標並接收快訊
  • 追蹤 API 呼叫,並取得回應時間的詳細資料,以及程式碼中可能出現的瓶頸。
  • 在執行中的應用程式中新增記錄點,不必部署應用程式。這項功能非常獨特 (希望對您有幫助)。

在本教學課程中,我們將從頭開始執行下列操作:

  1. 建立 Google Cloud Platform 專案 (特別是 App Engine)
  2. 設定 Google Cloud Platform 專案來源存放區
  3. 使用 GitHub 提供的標準留言板 Python 應用程式來源
  4. 部署程式碼
  5. 瞭解如何取得執行中應用程式的偵錯快照
  6. 查看記錄和應用程式呼叫追蹤記錄
  7. 將記錄點新增至目前執行的應用程式。這項功能最初是在這篇網誌文章中介紹:Add Application Logs to an application with no restarts

讓我們開始吧!

這項內容最初由 Romin Irani 製作並發布於此處

自行設定環境

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

Screenshot from 2016-02-10 12:45:26.png

請記住專案 ID,這是所有 Google Cloud 專案中不重複的名稱 (上述名稱已遭占用,因此不適用於您,抱歉!)。本程式碼研究室稍後會將其稱為 PROJECT_ID

接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。

完成本程式碼研究室的費用不應超過數美元,但如果您決定使用更多資源,或是將資源繼續執行 (請參閱本文件結尾的「清除」一節),則可能會增加費用。

Google Cloud Platform 新使用者享有價值 $300 美元的免費試用期

Google Cloud Shell

在本程式碼研究室中,我們將使用 Google Cloud Shell,這是 Cloud 中執行的指令列環境。

這種以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,可大幅提升網路效能和驗證。也就是說,您只需要瀏覽器 (Chromebook 也可以) 就能完成本程式碼研究室。

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

activateCloudShell.png

然後接受服務條款,並按一下「Start Cloud Shell」連結:

x.png

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,或在控制台資訊主頁中查詢:

Project_ID.png

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

gcloud config set compute/zone us-central1-f

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

查看已啟用的 StackDriver API

讓我們看看專案已啟用的 API。使用搜尋列尋找 API 資訊主頁,如下所示。

查看專案已啟用的特定 API:

每個 Google Cloud Platform 專案都提供私人 Git 託管服務,但我們首先需要建立預設存放區,才能開始作業。使用控制台搜尋框前往 Source Repositories:

按一下「CREATE REPOSITORY」(建立存放區),建立名為「default」的新程式碼存放區:

現在,我們要使用 Cloud Shell 將這個目錄複製到 Google Cloud Shell 執行個體。為此,請先在 Google Cloud Shell 執行個體中建立目錄,然後前往該目錄,如下所示 (範例輸出):

mkdir stackdriver-demo
cd stackdriver-demo/

現在,我們可以透過 gcloud 指令複製預設存放區,如下所示:

gcloud source repos clone default

您應該會看到下列控制台輸出內容:

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

太好了!現在來深入瞭解已設定的 Git 遠端。這並非必要,只是為了讓您更瞭解幕後發生的情況。

前往建立的預設目錄,然後如以下所示觸發 git remote -v 指令

cd default
git remote -v

這是您應該會看到的類似控制台輸出內容:

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

您可以看到,這會正確指向與 GCP 專案相關聯的 Git 存放區。

從 GitHub 提取 Guestbook 應用程式

我們將使用的應用程式是名為 Guestbook 的標準 App Engine 應用程式,位於 Google Cloud Platform 的官方 GitHub 存放區。這個應用程式也包含在官方入門說明文件中。GitHub 專案網址:https://github.com/GoogleCloudPlatform/appengine-guestbook-python

現在我們要將這段程式碼拉進 Cloud Shell 執行個體。指令及其輸出內容如下所示:

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

您應該會看到下列控制台輸出內容:

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

現在,所有程式碼都位於 Google Cloud Shell 執行個體本機。您會看到從 GitHub 專案提取的各種檔案。

使用 Cloud Shell 將目前的程式碼推送至專案 Git 存放區

現在請將這段程式碼推送至 GCP 專案 Git 存放區,以便為程式碼設定中斷點、記錄點等。請注意,這並非必要步驟,因為您可以直接與 GitHub、本機電腦及其他連結原始碼的方式整合。

但就我們的目的而言,我們會將這段程式碼推送至 GCP 專案 Git 存放區。如要執行這項操作,請使用標準的 git push 指令,如下所示:

git push origin master

您應該會看到下列控制台輸出內容:

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

現在請返回 GCP Cloud Console,並前往「開發」部分。按一下「原始碼」,您應該就能在預設存放區中看到所有專案檔案。輸出範例如下所示:

現在我們已準備好部署留言板 App Engine 應用程式。如要部署應用程式,請確認您位於 Google Cloud Shell,且位於預設目錄 (我們一直以來都是這樣)。使用 gcloud app deploy 指令,如下所示:

gcloud app deploy --version 1

系統要求選擇區域時,請選取「[1] us-east1」

您應該會看到下列控制台輸出內容:

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

請注意,我們已為應用程式部署指令提供版本參數。我們將這個值設為 "1"

由於 Guestbook 應用程式使用 Google Cloud Datastore 進行持久性作業,因此我們需要更新 Datastore 索引。索引是在 index.yaml 檔案中指定,我們只需使用 gcloud datastore create-indexes 指令,如下所示:

gcloud datastore create-indexes index.yaml

您應該會看到下列控制台輸出內容:

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

Datastore 索引可能需要一段時間才會更新。如要查看狀態,請搜尋「Datastore indexes」,然後按一下「Indexes」。建立索引時,您會看到「狀態」的值為「正在建立索引」,如下所示:

前往「Compute」→「App Engine」,然後按一下「Versions」(版本),即可檢查應用程式是否已部署並提供第 1 版,如下所示:

現在一切應該都沒問題了,您可以前往 https://<PROJECT_ID>.appspot.com 查看專案。同樣地,資料儲存區索引可能需要幾分鐘才能準備就緒,因此如果應用程式發生錯誤 (例如:內部伺服器錯誤),請稍後再試。

現在登入應用程式,並建立幾個留言板項目,如下所示:

太好了!現在一切就緒,可以深入瞭解 Stackdriver 功能了。

首先,我們來看看如何為執行中的應用程式建立快照。如要偵錯特定程式碼、檢查變數等,快照就非常實用。在執行上述作業的過程中,應用程式仍會繼續放送。如果您收到應用程式問題的相關回報,並想嘗試偵錯及查看應用程式的狀況、檢查大量變數、有條件地擷取快照等,這項功能就非常實用。

現在就為留言板應用程式執行這項操作。如果有人要求首頁,我們會要求提供快照,特別是擷取 Datastore 中目前問候語清單的快照。

相關程式碼位於 guestbook.py 檔案中。具體來說,我們想在從資料儲存庫擷取問候語清單後,開始檢查執行階段的程式碼。這項操作是在第 72 行完成。因此我們只要在第 74 行設定中斷點,就能知道第 72 行是否已執行。

如要執行這項操作,請按一下 App Engine 版本檢視畫面中的「Debug」,或前往 Stackdriver →「Debug」。系統隨即顯示下圖所示畫面。您需要選取左側的檔案 (guestbook.py),然後按一下行號,如下所示。

這時會顯示上方紅框中醒目的訊息,表示系統正在等待觸發快照。現在,我們只需要在以下網址點擊網頁:

https://<PROJECT_ID>.appspot.com

完成後,快照就會啟動,您會看到「變數」和「呼叫堆疊」部分填入資料,如下所示。查看變數的顯示方式,並展開變數以檢查值。這非常實用。

舉例來說,如果展開問候語變數,您會看到與所建立留言簿項目數量相應的記錄。

這項功能非常實用,因為你隨時可以重新拍攝快照。只要隨時按一下攝影機圖示,系統就會再次等待快照,如下所示:

如下所示,您可以使用「運算式」欄位追蹤特定變數。舉例來說,假設我們有一個 greetings 變數,並想在系統擷取快照時檢查該變數的值,我們可以放入問候語變數,如下方螢幕截圖所示。當系統觸發快照時,會填入如圖所示的值。

如果希望快照只在特定條件下啟動,可以使用「條件」欄位,如下所示。這裡的意思是,只有在問候語數量大於 1 時,才應建立快照。您可以視需要嘗試這項功能。

請務必確保網頁應用程式效能符合您設定的要求。Stackdriver Trace 是瞭解應用程式延遲情況的重要工具。

所有 App Engine 應用程式預設都會啟用這項功能,讓我們輕鬆取得所有端點的成效詳細資料,以及各種呼叫的細目。

在本例中,我們點選了首頁 (「/」),並查看 / 新增留言簿項目。這樣就足以讓 Trace 進一步瞭解延遲情形。只要前往 Stackdriver Traces 總覽,就會看到如下所示的螢幕截圖。請注意近期的追蹤記錄及其延遲時間。

如果我們點選任一追蹤記錄 (即點選 URI 連結),系統會顯示詳細追蹤記錄,如下所示:

請注意,這項工具可讓我們瞭解延遲時間,以及哪些呼叫佔用最多時間。從上方的視覺化資料可以看出,資料儲存區查詢需要時間。或許可以考慮快取資料,減少這個瓶頸。同樣地,這一切都取決於您的應用程式,這應該有助於判斷呼叫追蹤中的哪些區域可能需要重構。

您可以隨時前往 Stackdriver Logging (如下所示),查看應用程式記錄。您可以從各種 GCP 服務 → 記錄類型 → 記錄層級 → 日期等項目開始,使用多種篩選器。

下方的螢幕截圖顯示 App Engine 應用程式的記錄,以及預設版本 1。

logging.png

最後,我們來看看一項功能,相信您會對它提供的可能性感到興奮。通常開發人員會盡力在程式碼中加入記錄陳述式、部署程式碼,然後希望記錄能提供所有想知道的資訊。

但我們知道這樣還不夠,只有在偵錯時,才會意識到或許應該在各處多放幾條記錄陳述式。一般工作流程是修改程式碼、加入額外的記錄陳述式、重新部署及監控。

這樣做沒問題,但如果可以將這些記錄陳述式 (現在稱為「記錄點」) 新增至正在執行的應用程式,會怎麼樣呢?也就是說,我們不需要停止應用程式、變更程式碼及重新部署。不過,我們可以使用記錄點支援,從應用程式外部管理記錄點清單。

我們還是要從 Cloud Shell 檢查目前設定的記錄點清單 (應該是 0)。方法是透過 gcloud 指令,如下所示:

gcloud debug logpoints list

您應該會看到下列控制台輸出內容:

Debug target not specified. Using default target: default-1
Listed 0 items.

現在,我們要在執行中的應用程式中新增記錄點。如要新增記錄點,我們需要執行下列操作:

  • 找出要新增記錄點的原始碼檔案和行號。
  • 找出記錄訊息。這則記錄訊息可以是硬式編碼,甚至是運算式。

在本例中,我們將透過 logpoints create 指令,在 guestbook.py 檔案的第 74 行新增記錄點,如下所示:

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

您應該會看到下列控制台輸出內容:

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

我們已提供 filename:linenumber 和上述記錄訊息。請注意,我們的記錄訊息也包含一個運算式,會列印從資料存放區擷取的問候語數量。

指令會傳回記錄點已新增的訊息。以下是 Cloud Shell 的螢幕截圖:

現在,如果您執行記錄點清單指令,會看到下列輸出內容:

gcloud debug logpoints list

您應該會看到下列控制台輸出內容:

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

如要查看實際效果,請再次前往 https://<PROJECT_ID>.appspot.com 的首頁。這會叫用程式碼,進而叫用我們的記錄點。請注意,這項資訊預設會記錄在應用程式記錄中。因此,我們只需要再次前往 Stackdriver Logging,如下所示:

按一下特定要求,在詳細資料中,您會看到觸發的記錄點和顯示的記錄訊息。

希望您喜歡這部教學影片。本文僅介紹 Stackdriver 平台的部分功能。還有更多內容等你探索。如需更多 Google Cloud Platform 教學課程,請前往 https://rominirani.com/ 查看 Romin Irani 的網誌 (本程式碼研究室的原始作者)。

您也可以參考「使用 Stackdriver 的監控和記錄功能,提升對應用程式健康狀態的洞悉能力」這項程式碼研究室。

如有任何意見回饋或想回報本程式碼研究室的問題,請使用本頁左下方的「Please find a bug」連結。