使用 Google Stackdriver 來除錯, 追蹤, 紀錄 以及部署紀錄點

概述

這個教程將帶你好好走一趟 Google Stackdriver, 你將學到如何在你 Google Cloud Platform 的應用作以下的操作:

  • 為運行在 App Engine, Compute Engine, Container Engine 的應用製作 Debug Snapshot(Debug 快照)
  • 無需部署額外的 app 即可在 **運行中的應用加入 log point (紀錄點)**。 這是一個真正獨特的功能(且希望是有幫助的)。
  • 追蹤 API calls並且獲取回應時間統計以及代碼內的潛在的瓶頸
  • 檢視Application Logs (應用紀錄)

你將會從 0 開始做下面這些事:

  1. 建立一個 Google Cloud Platform 專案 (特別是 App Engine)
  2. 設定 Google Cloud platform 專案源碼倉庫
  3. 利用 Github 上可獲得的標準的 Guestbook Python Application 源碼
  4. 部署代碼
  5. 看如何在運行中的應用上獲得 Debug 快照
  6. 瞧瞧 Logging (紀錄) 以及 Application Call Traces (應用呼叫追蹤)
  7. 在目前運行的應用上加入 logpoints (紀錄點)



前言

本篇主要是利用 Google 的 Qwiklab 平台學習的同時,做的一份學習筆記
為避免翻譯誤解,專業術語在本篇將不會被翻譯,保留原文




設定及要求


在你按下 Start Lab 按鈕之前

詳讀所有的教學。Labs 是有時間限制的,而且你不可以停止時間倒數。倒數計時器在你按下 Start Lab 按鈕後開始倒數,上面顯示的時間為你還能使用 Cloud 資源的時間。

Qwiklabs 的手把手環境,讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程,而不是在一個模擬或是展示的環境。我們透過提供你一個全新的、暫時的帳號密碼,在計時器歸零之前,你可以用來登入並存取 Google Cloud Platform。

你需要什麼?

要完成這個 lab ,你需要:

  • 一個一般的網路瀏覽器(推薦 Chrome)
  • 完成這個 lab 的時間

備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab

現在你已經開始你的 lab, 你將會登入 Google Cloud Shell 主控台,然後開啟命令列工具

如何開始你的 lab ,然後登入 Console?

  1. 按下 Start Lab 按鈕。如果你需要付費,會有一個彈出視窗來讓你選擇付費的方式。在左方你會看到一個面板,上面有暫時的帳號密碼,你必須使用這些帳號密碼在此次 lab

  1. 複製 username , 然後點擊 Open Google Console。 Lab 會開啟另外一個視窗,顯示選擇帳號的頁面

tip: 開啟一個全新的視窗,然後跟原本的頁面並排

  1. 選擇帳號頁面, 點擊 Use Another Account

  1. 登入頁面開啟,貼上之前複製的 username 以及 password ,然後貼上

重要:必須使用之前於 Connection Details 面板 取得的帳號密碼,不要使用你自己的 Qwiklabs 帳號密碼。 如果你有自己的 GCP 帳號,請不要用在這裡(避免產生費用)

  1. 點擊並通過接下來的頁面:
    • 接受terms以及conditions
    • 不要增加recovery optoinstwo factor authentication (因為這只是一個臨時帳號)
    • 不要註冊免費體驗

稍待一些時候, GCP 控制台將會在這個視窗開啟。

注意:按下左上方位於Google Cloud Platform 隔壁的 Navigation menu ,你可以瀏覽選單,裡面有一系列的 GCP 產品以及服務

啟動 Google Cloud Shell

Google Cloud Shell 是載有開發工具的虛擬機器。它提供了5GB的 home 資料夾,並且運行在 Google Cloud 上。 Google Cloud Shell 讓你可以利用 command-line 存取 GCP 資源

  1. GCP 控制台 ,右上的工具列,點擊 Open Cloud Shell 按鈕

  1. 在打開的對話框裡,按下 START CLOUD SHELL:

你可以立即按下 START CLOUD SHELL 當對話視窗打開。

連結並提供環境會需要一點時間。當你連結成功,這代表你已成功獲得授權,且此專案已被設為你的專案ID,例如:

gcloudGoogle Cloud Platform 的 command-line 工具,他已事先被安裝在 Cloud Shell 並且支援自動補齊

使用這個 command ,你可以列出有效帳戶名稱:

gcloud auth list

輸出:

Credentialed accounts:
- <myaccount>@<mydomain>.com (active)

範例輸出:

Credentialed accounts:
- google1623327_student@qwiklabs.net

你可以使用以下 command 來列出專案 ID

gcloud config list project

輸出:

[core]
project = <project_ID>

範例輸出:

[core]
project = qwiklabs-gcp-44776a13dea667a6

gcloud 的完整文件可以參閱 Google Cloud gcloud Overview




建立 Stackdriver workspace (工作區)

Navigation menu, 點擊 Monitoring

當你看到 Stackdriver dashboard (顯示面版),代表你的工作區已經準備好了

測試進度
點擊 Check my progress 來確認目前的進度。




設定並且加載你的私人 Git 倉庫

每一個 Google Cloud Platform 都有提供私人的 Git 服務器,但首先你需要先建立一個預設的倉庫

回到主控台,並且到 Navigation menu > Source Repositories > Add Repository:

選擇 Create new repository, 然後選擇 Continue

將新的 repository 命名為 “DEFAULT”, 然後點擊 Create

測試完成任務

點擊 Check my progress 來確認目前的進度。

在 Cloud Shell, 利用以下的指令建立一個資料夾並且進入到這個資料夾內:

mkdir stackdriver-demo
cd stackdriver-demo/

現在複製 DEFAULT repository

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].

對的,你沒有看錯,你複製了一個空的 repository - 沒錯。 現在花點時間來研究一下這已經設定好的 git remote, 然後你將會更了解背地裡發生了什麼事。

進到 DEFAULT 資料夾:

cd DEFAULT

輸入 git remote -v 指令

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 Repository




從 Github 上 Pull Guestbook 應用

Guestbook 應用是可從官方 Google Cloud Platform 的 Github repository 上獲得的標準 App Engine 應用。 這個應用也是在 App Engine 上部署 Python 應用程式的官方文件一部分。 Github 專案可從此獲得:
https://github.com/GoogleCloudPlatform/appengine-guestbook-python

運行以下指令來 Pull Guestbook 代碼到你的 Cloud Shell 實例

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

輸出應該如下:

remote: Enumerating objects: 493, done.
remote: Total 493 (delta 0), reused 0 (delta 0), pack-reused 493
Receiving objects: 100% (493/493), 437.58 KiB | 0 bytes/s, done.
Resolving deltas: 100% (203/203), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

現在你可以看到很多檔案都從 Github 專案 pull 下來了

利用 Cloud Shell 將目前的代碼 push 到 GCP 專案的 Git Repository

利用 Cloud Shell 來將代碼 push 到 GCP 專案 Git repository, 所以你可以在你的代碼設定斷點。 但是我們並不一定要這麼做,因為我們還有其他的方法來連結源碼,像是直接與 Github 或從本地機器做整合

利用標準 git push 指令來 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 主控台並重整頁面。 在 Source Repository, 點擊 Source Code, 你應該可以在 DEFAULT repository 中看到所有的專案檔案




部署並且使用 Guestbook 應用

你已經完成部署前的工作,輸入 gcloud app deploy 指令來部署 Guestbook App Engine 應用

gcloud app deploy --version 1

當被要求選擇一個 region, 選擇 us-east1

當跳出詢問視窗,選擇 “Y” 繼續

輸出應會如下

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]

注意到我們提供了一個版本參數給 app deploy 的指令。 我們給了數值 "1"

測試進度

點擊 Check my progress 來確認目前的進度。

因為 Guestbook 應用使用 Google Cloud Datastore 來儲存,所以我們必須更新 Datastore 索引。 這個索引被指定在 index.yaml 檔案中

使用 gcloud datastore indexes create 指令:

gcloud datastore indexes create index.yaml

控制台輸出應如下:

Configurations to update:

descriptor: [index.yaml]
type: [datastore indexes]
target project: [qwiklabs-gcp-39b46efbe8fc73bf]
Do you want to continue (Y/n)? Y

詢問視窗中,輸入 Y 繼續

Datatore 的索引會耗費一些時間更新。 若要確認狀態,可到主控台中的 Navigation menu > Datastore ,然後在左側面板點擊 Indexes 。 當索引正在被建立中時,你會看到狀態顯示為 “Indexing”:

測試進度
點擊 Check my progress 來確認目前的進度。

你可以確認你的 App (version 1) 是否有部署成功且可用。 到 Navigation menu > App Engine > Versions:

現在應該一切都看起來 okay。 到 https://PROJECT_ID.appspot.com 看一下你的專案。 將 PROJECT_ID 替換成 Qwiklab 給的 ID

注意: 如果你看到 Internal Server Error, 一分鐘後再試一次,索引可能還在被建立中。

現在從 Guestbook 視窗,使用應用來建立一些數據

棒極了! 現在你已經完成所有進到 Stackdriver 功能之前的準備工作

測試進度

點擊 Check my progress 來確認目前的進度。




Debug Snapshot (Debug 快照)

當你想要 debug 一段特定的 code 時,或者你想要檢查一些變數,但你的應用還處於服務中,這時候快照將非常的有用。
現在,當有任何人對你的首頁發請求,並且取得目前在 Datastore 中的問候清單時,你將要求一個快照。
這段代碼位於 questbook.py 檔案。 並且,我們將開始在服務中檢查代表,當問候清單從 Datastore 被取得時。 這段代碼在 72 行結束,所以我們在 74 行設一個斷點,這樣我們能確定 72 行將會被執行。
我們可以在主控台中使用 App Engine 檢視並且點擊 Tools 下拉選單,然後點擊 Debug

或者在 Stackdriver 瀏覽視窗,在左方面板點擊 Debug
在左側面板點擊 guestbook.py, 然後點擊 74 行如下所示

訊息顯示,目前正在等待一個快照被觸發

現在,回到 Guestbook 視窗然後新增一筆數據。 回到 Debug 頁面,快照已被啟動,且 Variables 以及 Call Stack 區塊都被載入了。

你可以展開變數確認各自的值。 比方說,如果你展開 greetings 變數,你將會看到有一些記錄,且這些紀錄與我們之前建立 guestbook 數據的號碼相對應著。

有一個非常方便的功能,那就是我們可以隨時重新做一個快照。
點擊照相機的圖示:

快照將會等待被觸發

你也可以使用 Expressions 欄位來追蹤特定的變數。 比方說,當快照被觸發時,我們要檢查一個變數在那一刻的值,我們可以在 Expressions 欄位內輸入變數的名稱

在 Expressions 欄位新增 “greetings”, 然後回到 Guestbook 視窗增加一個新的數據。 當快照被觸發時, greeting 的值將會被載入

如果你想要快照只在滿足特定條件時才被觸發的話,可以使用 Condition 欄位。 下方有個範例,意思是說當 greeting 的數量大於 1 時,快照才會被觸發。 你可以試試看!

備註: 完整的 Stackdriver Debugger 文件在這:
https://cloud.google.com/debugger/docs/




Logpoints (紀錄點)

這肯定是一個會讓你興奮到不行的功能。 身為一個開發者,通常我們會盡其所能地在我們的代碼中安置回傳訊息, 像是 php 的 echo 或是 node.js 的 console.log,並希望這些訊息能傳達給我們一切我們想知道的。 但我們都知道,當我們在 debug 的時候,這些訊息永遠都不夠,我們總是需要再安插多一點的回傳訊息。 一般做法,我們需要重新修改我們的代碼,安置額外的回傳訊息,最後重新部署以及監控。

如果說,你可以在運行中的應用增加這些回傳訊息 (稱為紀錄點 logpoints) 呢? 你不再需要停止應用,修改代碼,重新部署這些步驟了! 你可以使用 logpoints support,從應用外來管理一系列的紀錄點。

在 Cloud Shell 中,執行以下的指令來檢視目前已經設置好的紀錄點清單

cloud
gcloud debug logpoints list

輸出應該是 0

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

要增加紀錄點,你需要做以下這些事

  • 確認你想要增加紀錄點的檔案以及確切位置的行數
  • 確認紀錄點的訊息。 這個紀錄點訊息可以是寫死的,也可以是一個表達式。

在本教程中,增加一個紀錄點到檔案 guestbook.py 的第 74 行,使用 logpoints create 指令:

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

你可以看到 檔案名稱:行號, 以及紀錄點訊息。 紀錄點訊息也包含了表達式,它會印出從 Datastore 取回的 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

現在,如果你執行 logpoints list 指令:

cloud
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 。 這將會觸發代碼,並且觸發紀錄點。

記住,紀錄點訊息會被記錄在預設的 Application Logs。 到 Stackdriver 視窗,並點擊 Logging:

點擊一個特定的請求,瞧! 在 details 中,你將會看到紀錄點被觸發以及紀錄點訊息被顯示出來。




Traces (追蹤)

總是確保你的網頁應用的表現有達到你設定的需求,這件事是很重要的。 Stackdriver Traces 是一個關鍵的工具,它可以讓你了解你應用的延遲。

Traces 在 App Engine 預設就是打開的,它提供了觸手可及的應用表現的細節,包含了所有端點以及不同請求的整體資料。

你已經試過了拜訪首頁 (“/“) 以及檢視 / 增加 guestbook 數據。 這些已經足夠 Traces 提供更多有關延遲的資訊。

在主控台頁面,到 Navigation menu > Trace 來檢視最近的 Stackdriver 追蹤紀錄以及延遲。

點擊任何一筆追蹤來檢視追蹤細節:

你獲得了延遲的資訊,以及哪些要求耗費了更多的時間。 你可以從圖形化介面看到資料庫的請求正在耗費著時間。 或許其中一個可以列入考慮的選項可以是快取資料來降低瓶頸點。 這些資料都來自於你的應用,且如果要找出哪些地方可能需要一些重構的話,這些資訊應該是十分地用幫助。

備註: 完整的 Stackdriver Debugger 文件在這:
https://cloud.google.com/debugger/docs/




搜尋紀錄

在你遇到服務中斷之前,花時間學習如何使用你的紀錄將會拯救你免於很多的壓力,且會幫你更快的準確找出問題。 在你自己的專案中,你應該是要固定的使用這些功能,所以當你需要它的時候,你將會知道如何使用它。

讓我們來一起走過一些 Stackdriver Logs 的進階功能。 到 Navigation menu > > Logging __ 。 點擊篩選框右手邊的三角形圖案,然後選取 “Convert to advanced filter”

現在你可以使用一個特別的語法 來明確你想要檢視的特定紀錄

例如說, 這個語法限制了你將只能看到 GAE 的紀錄訊息

cloud
resource.type="gae_app"

若要增加更多的語句到篩選器,你可以加更多行

你也可以使用運算子像是 AND, OR, NOT, >, <, 等等。 這是一個只顯示 ERROR 以及 CRITICAL 訊息的篩選表達語句

cloud
severity=("ERROR" OR "CRITICAL")

Stackdriver 將 Severity 與數字香連續,所以你也可以使用數字比較,像是:

cloud
resource.type = gae_app AND
severity >= ERROR

使用者介面將會自動補齊,包含欄位名稱以及可能的欄位的值


已存在的紀錄篩選

有一個簡單的方法可以找到一個正確的,我們想要填入進階篩選器中的數值。 試試看: 檢視你的紀錄直到你找到你想要鎖定的訊息類型。 然後點擊欄位,然後點擊 “Show Matching Entries”。 這將會自動地將正確的數值載入篩選器中。

你也可以使用 “Hide Matching Entries” 來移除會干擾你的訊息


儲存及分享

一旦你已經花時間找出正確的篩選器數值,你應該會想要將它們儲存並且分享給你的隊友們。

點擊篩選器右方的三角形圖案,你將可以獲得這個你剛剛建立的篩選器的連結。 你可以跟你的隊友們分享這個連結,或是將它存在你的文件當中。

備註: 完整的 Stackdriver Debugger 文件在這:
https://cloud.google.com/debugger/docs/




測試你的理解

下面有多重選擇的問題來鞏固你對本教程概念的理解,盡你所能的回答吧:




恭喜

你已經完成本教程

NGINX 學習筆記 InfluxDB 學習筆記

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×