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

1. 简介

在此 Codelab 中,您将学习如何利用面向所有使用 Cloud Functions 的开发者提供的日志记录和监控工具。在各种受支持的语言中部署的每个 Cloud Functions 函数都附带这些工具,可帮助您更高效地编写和操作无服务器代码。

5815064fec87444b

您将使用 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 及其日志记录和监控功能,但您需要使用 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

输入“hello-monitor”作为新的 Cloud Functions 函数的名称

fa6816c96d6d5b94.png

保留源代码的所有默认值。(不过,您也可以选择其他语言/运行时。)

7aadf164450484e

最后,点击创建

dc74cd21000d6c91.png

您应该会看到您的 Cloud Functions 函数旁边有一个绿色对勾标记,这表示它已可以调用。

5363a34eb001d5ed

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 Functions 函数应该就像在该网址上使用 curl 命令一样简单。

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

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

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

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

$ 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

向您的 Cloud Functions 函数发出的所有请求都应返回 200 状态代码。

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

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

6. 更新函数

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

aaee3159bbe395d3.png 7ed347101da5eca0

另一个用于观察延迟时间和 RPC 调用的详细工具是 Stackdriver Trace,但您需要先对 Cloud Functions 函数进行一些更改,然后才能使用该工具。执行以下操作:

  1. 将救命的 node-emoji 软件包添加为依赖项。
  2. 更新函数代码以使用 node-emoji 模块,并导致一些延迟。
  3. 添加一个环境变量,以便为 Cloud Functions 启用 Stackdriver Trace。

函数详细信息中,点击修改以修改函数。

39b0f8f98b18a6c0

修改 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

点击保存

返回 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 函数

使用左侧菜单导航到 Stackdriver Trace 下的跟踪记录列表

576373f38cad6f8

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

44a36b758b49f88f

由此可以很明显地看出,Cloud Functions 函数中引入的延迟时间确实是 300 毫秒。

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

5815064fec87444b

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

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

由于您部署了单个 Cloud Functions 函数,因此图表仅显示针对 hello-monitor URI 的 GET 请求,但您可以按 HTTP 方法(GET、POST、DELETE)按 HTTP 状态(2XX、3XX)或使用请求过滤条件来过滤跟踪记录。

转到左侧菜单中的概览

e920cfca2a50899e.png

在此概览页面中,您可以找到最近的跟踪记录和其他数据分析。

ef5a45647967d275.png

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

5bd34e9d13b47fb6

如果您能利用足够多的数据点设置正确的时间范围,就可以生成报告,显示初始 Cloud Functions 函数和新 Cloud Functions 函数之间的重要延迟时间变化。

2cc0e9a3212b91bb

2e7b1ebf2f0a2b4f

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

8. 现在该清理资源了

此 Codelab 到此结束!

虽然 Cloud Functions 和 Stackdriver 工具是无服务器平台,在不使用时不会产生费用,但请做一个好的云公民,然后删除您的 Cloud Functions 函数。只需在 Cloud Functions 下的 Overview 中选择 hello-monitor,然后点击 Delete 即可。

aceb633cf70a4a27.png

9. 接下来做什么?

下面是一些后续内容:

/