使用 Google Stackdriver 调试、跟踪、日志记录和日志点

本教程将带您浏览 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. 向当前正在运行的应用添加日志点。我们最初在博文(应用不重启)中添加应用日志中介绍了此功能。

让我们开始吧。

此内容最初是由 Romin Irani 创作的,并在此处发布。

自定进度的环境设置

如果您还没有 Google 帐号(Gmail 或 Google Apps),则必须创建一个。登录 Google Cloud Platform Console (console.cloud.google.com) 并创建一个新项目:

2016-02-10 12:45:26 的屏幕截图.png

请记住项目 ID,它在所有 Google Cloud 项目中都是唯一名称(很抱歉,上述名称已被占用,您无法使用!)。它稍后将在此 Codelab 中被称为 PROJECT_ID

接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Google Cloud 资源。

在此 Codelab 中运行仅花费几美元,但是如果您决定使用更多资源或继续让它们运行,费用可能更高(请参阅本文档末尾的“清理”部分)。

Google Cloud Platform 的新用户有资格获享 $300 免费试用

Google Cloud Shell

在此 Codelab 中,我们将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

基于 Debian 的这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并在 Google Cloud 上运行,大大增强了网络性能和身份验证。这意味着在本 Codelab 中,您只需要一个浏览器(没错,它适用于 Chromebook)。

要激活 Google Cloud Shell,只需在开发者控制台中点击右上方的按钮(配置和连接到环境应该只需要片刻时间):

activateCloudShell.png

然后接受服务条款并点击“启动 Cloud Shell”链接:

.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 托管服务,但我们首先需要创建一个默认代码库。使用控制台搜索框导航到源代码库:

点击“创建代码库”,创建名为 "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 项目,请访问:https://github.com/GoogleCloudPlatform/appengine-guest-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 将当前代码推送到 Project Git 代码库

现在,我们将此代码推送到 GCP Project Git 代码库中,这样我们就可以为代码设置断点、日志点等。请注意,这并非强制性步骤,因为您可以直接与 GitHub、本地机器以及链接源代码的其他方式集成。

但出于此处的目的,我们会将此代码推送到 GCP 项目 Git 代码库中。这是通过标准 Git 推送命令完成的,如下所示:

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]

请注意,我们为 app deploy 命令提供了一个版本参数。其值为 "1"

由于留言板应用使用 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 索引”,然后点击“索引”。索引构建完成后,您会看到状态值为“Indexing”的“Status”,如下所示:

我们可以转到“计算”→“App Engine”,然后点击“版本”,如下所示,我们是否部署了版本 1 的应用并且可以使用:

现在,一切都正常了,您可以转到 https://<PROJECT_ID>.appspot.com 查看自己的项目。同样,数据存储区索引可能需要几分钟时间才能准备就绪,因此,如果应用报错(例如:内部服务器错误),请过几分钟再试。

现在,让我们通过登录并创建一些留言板条目来使用应用,如下所示:

太好了!现在,我们就可以深入了解 Stackdriver 功能了。

我们首先来看看如何截取正在运行的应用的快照。如果您想调试特定的代码、检查变量等,那么使用快照会非常有用。所有这些都在您的应用仍在提供期间发生。如果您要获取应用问题的报告,并且想要尝试调试应用并查看应用的情况、检查大量变量、有条件地截取快照以及执行其他操作,此功能会非常有用。

现在我们针对留言板应用执行此操作。如果有人索要首页,我们想请求快照,那么我们希望它在快照中检索当前存放在数据存储区中的问候列表。

相关代码位于 guestbook.py 文件中。具体而言,我们希望在从数据存储区检索到问候语列表后开始检查代码。此操作在第 72 行完成。因此,我们可以在第 74 行添加一个断点,以便让我们知道 #72 将会执行。

为此,请从 App Engine 版本视图中点击“调试”,或转到 Stackdriver“调试”。此时,系统会显示如下所示的屏幕。您只需在左侧选择文件 (guestbook.py),然后点击所示的行号即可。

这会显示一个消息,在上面的红色框中突出显示,它正在等待触发快照。现在,我们只需要访问

https://<PROJECT_ID>.appspot.com

完成上述操作后,快照将激活,您将看到其中填充了“Variables”和“Call stack”部分,如下所示。查看变量的显示方式,然后您可以展开它们以查看相关值。这非常有用。

例如,如果展开问候变量,则会看到它包含与您创建的留言板条目数量相对应的记录。

有一个非常实用的功能,就是随时重新截取快照。只需随时点击摄像头图标,它就会再次等待快照触发,如下所示:

如下所示,您可以使用“表达式”字段来跟踪特定变量。例如,我们知道有一条可变的问候语,我们希望在快照出现时立即检查它的值。我们可以插入问候变量,如以下屏幕截图所示。快照被命中时,系统会填充如下所示的值。

如果您希望快照仅在特定条件下激活,则可以使用“条件”字段,如下所示。这里我们说,仅当问候语数量大于 1 时,才应执行快照。如果您愿意,可以尝试一下。

因此,请确保您的 Web 应用性能符合您设置的要求,这一点非常重要。Stackdriver Trace 是帮助您了解应用延迟时间的关键工具。

默认情况下,它会为所有 App Engine 应用启用,并为所有端点提供非常方便的性能详情,并提供各种调用的拆分数据。

在本例中,我们点击首页 ("/") 并查看 / 添加留言板条目。这足以让 Trace 告诉我们有关延迟的更多信息。您只需转到 Stackdriver Trace 概览,即可看到如下所示的屏幕截图。请注意最近的跟踪记录及其延迟时间。

如果我们点击任一跟踪记录,即点击 URI 链接,将显示详细的跟踪记录,如下所示:

请注意,它如何分解延迟,以及哪些调用花费了最多时间。从上面的可视化图表可以看出,数据存储区查询需要一些时间。或许,您可以缓存数据,以减少这一瓶颈。同样,这取决于您的应用,这对于确定调用跟踪记录中的哪些区域可能需要进行一些重构非常有用。

您可以随时转到 Stackdriver Logging,查看应用日志(如下所示)。有多种过滤条件可供选择,包括各种 GCP 服务 → 日志类型 → 日志级别 → 日期等。

下面的屏幕截图显示了 App Engine 应用和默认版本 1 的日志。

日志记录

最后,我们来了解一下一项功能,它应该会让您感到它带来的各种可能性。通常,作为开发者,我们会尽最大努力在代码中放入日志语句,部署代码,然后希望日志能够告知我们所有想要知道的信息。

但是我们知道这样做是不够的,只有在调试时我们才会意识到,我们可能应该在此处增加一些日志语句。其常规工作流就是修改代码,放入额外的日志语句,重新部署和监控。

这没关系,但是如果您可以将这些日志语句(现在称为日志点)添加到正在运行的应用中,那会怎样呢?这意味着我们无需执行停止应用、更改代码和重新部署的过程。我们可以借助日志点支持从应用外部管理日志点列表。

还是在 Cloud Shell 中,我们检查一下我们配置的当前日志点列表(显然应为 0)。这是通过 gcloud 命令完成的,如下所示:

gcloud debug logpoints list

以下是您应看到的控制台输出:

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

现在,我们将向正在运行的应用添加日志点。如需添加日志点,我们需要执行以下操作:

  • 确定我们想要添加日志点的源代码文件和行号。
  • 识别日志消息。此日志消息可以是硬编码,甚至可以是表达式。

在本例中,我们将通过 logpoints create 命令向第 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 的屏幕截图如下所示:

现在,如果您触发 logpoints list 命令,您将看到以下输出:

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 平台为表引入的一些功能。还有许多功能等您探索访问 https://rominirani.com/ 参阅 Romin Irani' 的博客(此 Codelab 的原始作者),了解更多 Google Cloud Platform 教程。

您还可以查看另一个名为“使用 Stackdriver 的监控和日志记录”的 Codelab,更好地了解您的应用运行状况。

如果您有任何反馈或想要报告此 Codelab 的问题,请使用本页左下角的“请查找错误”链接。