提醒:Pub/Sub 主题出现基于日志的错误

1. 简介

上次更新时间:2023 年 6 月 21 日

针对可用性问题设置基于日志的错误提醒

基于日志的提醒可用于通过监控日志中的特定事件或模式来确定应用的可用性。通过接收有关服务中断或其他面向用户的问题的提醒,您可以采取措施来尽量减少对用户和客户的影响。

虽然拨测可以大致了解可用性,但使用从日志中派生的出错提示作为更具体类型的不可用性指标可能更准确,并且可以了解遇到问题的用户所占的比例。

错误可能由多种原因引起,包括用户失误、系统维护、升级,甚至系统外部因素(例如恶劣天气)。设置提醒的关键在于,不要试图预测所有可能的原因,而是选择一些关键症状作为问题排查的起点。

将 Pub/Sub 主题用作提醒通知渠道

Pub/Sub 主题可用作 Google Cloud Monitoring 通知渠道,以向 Pub/Sub 订阅发送提醒。这样一来,您就可以将 Cloud Monitoring 提醒与其他系统(包括第三方通知服务)集成。

如需将 Pub/Sub 主题用作通知渠道,您需要先创建 Pub/Sub 主题和 Pub/Sub 订阅。然后,您需要创建一个以 Pub/Sub 主题为目的地的 Cloud Monitoring 通知渠道。

触发提醒后,Cloud Monitoring 会向 Pub/Sub 主题发送消息。Pub/Sub 订阅的订阅者随后可以处理消息并采取适当的措施。

构建内容

在此 Codelab 中,您将部署一个应用,创建一个 Pub/Sub 主题,并创建一个基于日志的提醒,该提醒会检查应用的特定部分是否存在错误,并使用 Pub/Sub 主题作为通知渠道。

学习内容

  • 如何创建 Pub/Sub 主题
  • 如何创建基于日志的提醒

此 Codelab 重点介绍如何创建错误提醒。对于不相关的概念和应用代码,我们仅会略作介绍,但是会提供相应代码供您复制和粘贴。

所需条件

  • 具有以下权限的 Google Cloud 账号:
  • 部署 Cloud Run 应用
  • 创建 Pub/Sub 主题
  • 创建提醒

2. 准备工作

选择或创建 Google Cloud 项目

如需选择现有项目,请使用下拉菜单:

b35bf95b8bf3d5d8.png

如需在 Google Cloud 中创建新项目,您可以按以下步骤操作:

  1. 前往 Google Cloud Platform 控制台
  2. 点击创建项目按钮。
  3. 为您的项目输入名称。
  4. 为您的项目选择结算账号。
  5. 点击创建按钮。

系统会创建您的项目,然后您会进入项目信息中心。然后,您就可以开始使用 Google Cloud 服务了。

以下是有关各个步骤的一些其他详细信息:

  • 名称:项目名称在组织内必须是唯一的。
  • 结算账号:您可以使用现有的结算账号,也可以创建一个新账号。
  • 创建:输入所有必需信息后,点击创建按钮即可创建项目。

如需了解详情,请参阅 Google Cloud 文档:创建项目

3. 部署 API 应用

示例应用或 API 的用途是什么?

我们的应用是一个简单的 Inventory API 应用,它公开了一个 REST API 端点,其中包含几个用于列出商品目录项和获取特定商品目录项数量的操作。

部署 API 后,假设该 API 托管在 https://<somehost>,我们可以按如下方式访问 API 端点:

https://<somehost>/inventory

系统会列出所有商品以及现有库存水平。

https://<somehost>/inventory/{productid}

这样会生成一条记录,其中包含相应商品的商品 ID 和现有库存水平。

返回的响应数据采用 JSON 格式。

注意:此 API 应用仅用于演示目的,并不代表安全可靠的 API 实现。目的是让我们快速获得可用的应用,以探索本实验的主要目的,即 Google Cloud Operations。

示例数据和 API 请求/响应

为简单起见,该应用在后端不使用数据库。它包含 3 个示例商品 ID 及其现有库存水平。

产品 ID

现有库存量

I-1

10

I-2

20

I-3

30

以下是 API 请求和响应的示例:

API 请求

API 响应

https://<somehost>/inventory

[ { "I-1": 10, "I-2": 20, "I-3": 30 }]

https://<somehost>/inventory/I-1

{ "productid": "I-1", "qty": 10}

https://<somehost>/inventory/I-2

{ "productid": "I-2", "qty": 20}

https://<somehost>/inventory/I-200

{ "productid": I-200, "qty": -1}

克隆代码库

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

bce75f34b2c53987.png

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

f6ef2b5f13479f3a.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需使用一个浏览器,即可完成本实验中的所有工作。

设置 gcloud

在 Cloud Shell 中,设置您的项目 ID 并将其保存为 PROJECT_ID 变量。

PROJECT_ID=[YOUR-PROJECT-ID]

gcloud config set project $PROJECT_ID

现在,执行以下命令:

$ git clone https://github.com/rominirani/cloud-code-sample-repository.git

这将在该文件夹中创建一个名为 cloud-code-sample-repository 的文件夹。

(可选)在 Cloud Shell 上运行应用

您可以按照以下步骤在本地运行应用:

  1. 在终端中,通过以下命令导航到 API 的 Python 版本:

$ cd cloud-code-sample-repository

$ cd python-flask-api

  1. 在终端中,提供以下命令(撰写本文时,Cloud Shell 随附 Python 3.9.x,我们将使用默认版本。如果您打算在笔记本电脑上本地运行,可以选择 Python 3.8 及更高版本:

$ python app.py

  1. 您可以运行以下命令在本地启动 Python 服务器。

1f798fbddfdc2c8e.png 46edf454cc70c5a6.png

点击“在端口 8080 上预览”。5. 系统随即会打开一个浏览器窗口。您会看到 404 错误,这没关系。修改网址,使其在主机名后仅包含 /inventory。

例如,在我的机器上,它看起来像这样:

https://8080-cs-557561579860-default.cs-asia-southeast1-yelo.cloudshell.dev/inventory

系统会显示商品目录商品列表,如前所述:

709d57ee2f0137e4.png

  1. 您现在可以前往终端并按 Ctrl-C 停止服务器

部署应用

现在,我们将此 API 应用部署到 Cloud Run。该流程涉及使用 gcloud 命令行客户端运行命令,以将代码部署到 Cloud Run

在终端中,运行以下 gcloud 命令:

$ gcloud run deploy --source .

系统会询问您多个问题,下面列出了一些要点:

  1. 服务名称 (python-flask-api):您可以采用此默认名称,也可以选择其他名称,例如 my-inventory-api
  2. 项目 [613162942481] 未启用 API [run.googleapis.com]。Would you like to enable and retry (this will take a few minutes)? (y/N)? 是
  3. 请指定区域:选择 31 (us-west-1)
  4. 项目 [613162942481] 未启用 API [artifactregistry.googleapis.com]。Would you like to enable and retry (this will take a few minutes)? (y/N)? 是
  5. 从源代码进行部署需要 Artifact Registry Docker 代码库来存储构建的容器。系统将创建位于 [us-west1] 区域中名为 [cloud-run-source-deploy] 的代码库。
  6. Do you want to continue (Y/n)? 是
  7. 是否允许未经身份验证的调用 [my-inventory-api] (y/N)?是

最终,系统会启动相应流程,将您的源代码容器化,将其推送到 Artifact Registry,然后部署 Cloud Run 服务和修订版本。在此过程中,您应耐心等待(可能需要 3-4 分钟),并应看到该过程已完成,且系统会向您显示服务网址。

运行示例如下所示:

87ba8dbf88e8cfa4.png

测试应用

现在,我们已将应用部署到 Cloud Run,您可以按如下方式访问 API 应用:

  1. 记下上一步中的服务网址。例如,在我的设置中,它显示为 https://my-inventory-api-bt2r5243dq-uw.a.run.app。我们将其称为 <SERVICE_URL>
  2. 打开浏览器并访问以下 3 个 API 端点网址:
  3. <SERVICE_URL>/inventory
  4. <SERVICE_URL>/inventory/I-1
  5. <SERVICE_URL>/inventory/I-100

它应符合我们在之前部分中提供的规范,其中包含示例 API 请求和响应。

从 Cloud Run 获取服务详情

我们将 API 服务部署到了 Cloud Run(一种无服务器计算环境)。我们可以随时通过 Google Cloud 控制台访问 Cloud Run 服务。

在主菜单中,前往 Cloud Run。系统随即会显示您在 Cloud Run 中运行的服务列表。您应该会看到刚刚部署的服务。根据您选择的名称,您应该会看到类似以下内容:

2633965c4bc957cc.png

点击服务名称可查看详情。示例详细信息如下所示:

33042ae64322ce07.png

请注意该网址,它只是一个服务网址,您可以在浏览器中输入该网址,然后访问我们刚刚部署的 Inventory API。查看指标和其他详细信息。

我们现在开始介绍 Google Cloud Operations Suite。

4. 创建 Pub/Sub 主题以接收提醒通知

如需创建 Pub/Sub 主题,您可以在 Google Cloud 控制台中按以下步骤操作:

  1. 在搜索框中搜索 Pub/Sub,然后前往 Pub/Sub。935028bd8f6328ef.png
  2. 点击主题标签页(如果您尚未进入此页面)。7fd8bf91386a88fd.png
  3. 点击创建主题按钮。cd9d197f9023c41b.png
  4. 为主题输入一个易于识别的名称。

173f313b4a3c4934.png

  1. 点击创建按钮。ca9a02477da21a44.png
  2. 使用复制图标按钮复制主题名称。您将在下一部分中用到此 ID。

20848252ee83df93.png

5. 为错误创建提醒政策

探索错误日志

如需查看应用的错误日志,请执行以下操作:

点击日志记录标签页。

系统会显示一个日志界面,您可以在其中专门选择/取消选择各种资源(项目、Google Cloud 资源、服务名称等)以及日志级别,以便根据需要过滤日志消息。

6605b68395185b89.png

通过提供不是 I-1、I-2 和 I-3 的商品 ID,模拟对商品目录服务发出的一些无效请求。例如,以下请求是错误的:

https://<SERVICE_URL>/inventory/I-999

现在,当查询中提供不正确的产品 ID 时,我们将搜索 API 生成的所有警告。

为错误创建自定义的基于日志的提醒政策

假设我们想要留意应用中某个部分是否出现非常具体的错误消息。例如,如果我们发现查找商品 ID 时出现大量错误,此问题是许多可能问题的症状(链接无效、数据库不一致或有漫游器在枚举我们的网站)。虽然我们很难或不可能想象出每种潜在原因,但发送此消息的应用即使只发送一次,也是我们需要注意的高级问题。如需针对此情况设置提醒,我们需要根据错误日志中的数据创建政策。

  1. 在查询框中,插入以下查询参数:

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: Received inventory request for incorrect productid"

输出应如下所示:

f672154cfebf0051.png

  1. 点击“运行查询”。然后,系统会向您显示收到的所有请求以及哪些请求存在此问题。

77c190e3a2fab6bf.png

  1. 如需将上述内容转换为提醒,请点击 Logs Explorer 中查询字段正下方右侧显示的创建提醒按钮:

4cd3fcf142189376.png

  1. 系统随即会显示用于创建基于日志的提醒政策的表单。

b82446854bad87fc.png

  1. 使用初始查询来确定要包含在提醒中的日志:

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: Received inventory request for incorrect productid"

764227db73ec3de6.png

  1. 设置通知频率和突发事件时长。为了便于举例说明,您可以为每个值使用最小值:

bb3d96448ec998a1.png

  1. 最后,对于“应收到通知的用户”,请选择您之前创建的 Pub/Sub 通知渠道:

3593c48c29d4b76c.png

  1. 点击保存。如需查看和管理提醒政策,请访问提醒页面,然后在“政策”下查看:ca08ea380fb37c91.png

6. 恭喜

恭喜!您已成功配置拨测,使其能够向 Pub/Sub 发送提醒!