使用适用于 Cloud Functions 的 Stackdriver Logging 和 Stackdriver Trace

1. 简介

在此 Codelab 中,您将学习如何利用可供所有 Cloud Functions 开发者使用的日志记录和监控工具。这些工具随您部署的每个 Cloud Function 提供,支持所有语言,可帮助您在编写和运行无服务器代码时提高效率。

5815064fec87444b.png

您将使用 HTTP 触发的 Cloud Functions 函数,但您介绍的所有内容也适用于其他语言以及由其他事件触发的 Cloud Functions 函数。

2. 设置和要求

自定进度的环境设置

  1. 登录 Cloud 控制台,然后创建一个新项目或重复使用现有项目。 (如果您还没有 Gmail 或 G Suite 账号,则必须创建一个。)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

  1. 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。

运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分中的所有说明操作,该部分介绍了如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

Cloud Shell

虽然您可以从笔记本电脑远程使用 Cloud Functions 及其日志记录和监控功能,但在此 Codelab 中,您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境。

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

  1. 如需从 Cloud Console 激活 Cloud Shell,只需点击激活 Cloud ShellfEbHefbRynwXpq1vj2wJw6Dr17O0np8l-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 Console 信息中心查找该 ID:

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 Functions 函数

为了有可供监控的对象,请创建一个“Hello, World”Cloud Functions 函数。在 Google Cloud 控制台的左侧菜单中,点击 Cloud Functions,然后点击创建函数

3c13aa20af602aa7.png

输入“hello-monitor”作为新 Cloud Function 的名称。

fa6816c96d6d5b94.png

保留源代码的所有默认设置。(不过,您可以根据需要选择其他语言/运行时。)

7aadf164450484e.png

最后,点击创建

dc74cd21000d6c91.png

您应该会看到您的 Cloud Functions 函数列在其中,旁边有一个绿色对勾标记,这意味着该函数已准备好被调用。

5363a34eb001d5ed.png

4. 使用负载生成器测试 Cloud Functions 函数并发送流量

现在,Cloud Functions 函数已成功部署,请通过命令行对其进行测试。

首先,使用 Cloud Shell 发出以下命令:

$ gcloud functions describe hello-monitor

该命令应返回 Cloud Functions 函数的说明,包括 httpsTrigger 的网址,这是用于调用 Cloud Functions 函数的 HTTP(S) 端点。它应如下所示:https://<region>-<project-id>.cloudfunctions.net/hello-monitor。

现在,触发 Cloud Function 应该非常简单,只需对该网址使用 curl 命令即可。

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

现在,使用简单的 HTTP 负载测试工具 Vegeta。如需安装,只需在 Cloud Shell 中输入以下命令:

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

如需向 Cloud Functions 函数发送一些流量(每秒 5 个请求,持续几分钟),请使用以下命令:

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

5. 浏览日志

在 Cloud Functions 详情视图中,点击查看日志

b24157fd3376e6a8.png

这样一来,您应该会进入项目的 Stackdriver Logging 部分,其中仅显示 Cloud Functions 日志。

5a36fa75d2fb0165.png

对 Cloud Functions 函数的所有请求都应返回 200 状态代码。

查看日志时,您可以执行以下操作:

  • 按日志级别过滤(在本例中,所有日志均为 debug 级别)。
  • 选择特定时段(相对或绝对)。
  • 启用日志流式传输(屏幕顶部显示 Play 图标 751a4600016f34a7.png)。
  • 复制指向日志条目的链接(以便与团队成员分享)。
  • 在资源上下文中显示日志条目。
  • 固定日志条目(作为视觉提示)。
  • 将日志导出到 BigQuery、Cloud Storage 或 Pub/Sub(或只是以 JSON 或 CSV 文件形式下载)。

6. 更新函数

使用 Cloud 控制台,前往函数详细信息视图,并观察您使用负载测试工具创建的每秒调用次数和执行时间峰值。

aaee3159bbe395d3.png 7ed347101da5eca0.png

Stackdriver Trace 是另一种更详细的工具,可用于观察延迟时间和 RPC 调用,但在使用该工具之前,您需要对 Cloud Functions 进行一些更改。执行以下操作:

  1. 添加可挽救生命的 node-emoji 软件包作为依赖项。
  2. 更新函数代码以使用 node-emoji 模块并引入一些延迟。
  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
  
};

这会在 Cloud Functions 函数暂停 300 毫秒后,向其返回的消息添加一个随机表情符号。

最后,添加一个名为 GOOGLE_CLOUD_TRACE_ENABLED 的 Cloud Functions 环境变量,并将其设置为 true,如下所示:

9205bd277b76aa21.png

点击保存

返回 Cloud Shell,并回想一下用于在新部署的 Cloud Functions 函数上生成一些负载的命令:

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

现在,您无需进行其他设置,也无需在代码中使用特定的跟踪库,即可观察生成的轨迹列表!

7. 跟踪更新后的 Cloud Functions 函数

使用左侧菜单,导航到 Trace 列表(位于 Stackdriver Trace 下)。

576373f38cad6f8.png

您应该会看到类似以下屏幕截图的内容:

44a36b758b49f88f.png

这样一来,您应该可以很明显地看到,Cloud Functions 函数中引入的延迟确实为 300 毫秒。

图表上的每个点都代表一个请求,您可以查看该请求的详细信息,例如时间戳、HTTP 方法和状态、标签、指向相应日志条目的链接,以及 Cloud Functions 发出的任何后续 RPC 调用。

5815064fec87444b.png

如果您想放大图表,只需在图表上点击并拖动即可。在跟踪图表中选择自定义时间范围

如需缩小,请点击页面顶部的撤消缩放

由于您只部署了一个 Cloud Functions 函数,因此该图表仅显示 hello-monitor URI 上的 GET 请求,但您可以使用 HTTP 方法(GET、POST、DELETE)、HTTP 状态(2XX、3XX)或请求过滤器来过滤轨迹。

在左侧菜单中,前往概览

e920cfca2a50899e.png

在此概览页面中,您可以找到最近的轨迹和其他数据洞见。

ef5a45647967d275.png

您还可以根据 URI 请求过滤条件、HTTP 方法、HTTP 状态和时间范围的组合来创建自定义报告。您甚至可以将生成的值与时间基准进行比较。

5bd34e9d13b47fb6.png

如果您能够设置正确的时间范围并获得足够的数据点,则可以生成一份报告,其中显示初始 Cloud Functions 函数与新函数之间重要的延迟变化。

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

此类自定义报告可用于查找性能问题是在何时引入的,以及跟踪服务等级指标 (SLI),例如最终用户请求延迟时间。

8. 是时候清理资源了

本 Codelab 到此结束!

虽然 Cloud Functions 和 Stackdriver 工具是无服务器平台,在不使用时不会产生费用,但为了成为优秀的云公民,请删除您的 Cloud Functions 函数。只需在 Cloud Functions 下的概览中选择 hello-monitor,然后点击删除即可。

aceb633cf70a4a27.png

9. 接下来做什么?

以下是一些后续读物:

/