Cloud Functions 日志记录和跟踪 Codelab

此 Codelab 旨在帮助您了解如何利用面向所有 Cloud Functions 开发者提供的日志记录和监控工具。这些工具附带了所有受支持的语言中每个部署的 Cloud Functions 函数,可提高您在编写和运行无服务器代码时的效率。

在本示例中,我们使用由 HTTP 触发的函数,但其涵盖的所有内容也适用于其他语言和其他事件触发的函数(如存储分区、Pub/Sub 等)。

自定进度的环境设置

如果您还没有 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

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

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

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

activateCloudShell.png

点击“启动 Cloud Shell”按钮:

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>

默认情况下,Cloud Shell 还会设置一些环境变量,这对您日后运行命令可能会很有用。

echo $GOOGLE_CLOUD_PROJECT

命令输出

<PROJECT_ID>

如果出于某种原因未设置项目,只需发出以下命令即可:

gcloud config set project <PROJECT_ID>

正在查找您的 PROJECT_ID?请查看您在设置步骤中使用的 ID,或在控制台信息中心内查找:

Project_ID.png

重要提示:最后,设置默认可用区和项目配置:

gcloud config set compute/zone us-central1-f

您可以选择各种不同的可用区。如需了解详情,请参阅“区域和可用区”文档

为了进行监控,让我们创建一个 Hello World Cloud Functions 函数。在控制台的左侧菜单中,点击“Cloud Functions”,然后点击“Create function”:

为新函数命名“hello-monitor”:

... 并保留源代码的所有默认值(不过,如果您愿意,可以选择其他语言/运行时):

最后,使用“Create”按钮创建函数:

片刻之后,您应该会看到您的函数列为已可调用(如绿色对勾标记所示):

现在,Cloud Functions 函数已成功部署,我们将从命令行对其进行测试。

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

$ gcloud functions describe hello-monitor

这应该会返回函数的说明,包括 httpsTrigger(即用来调用函数的 HTTP(S) 端点)的网址。其格式应为:https://<region>-<project-id>.cloudfunctions.net/hello-monitor

现在触发函数应该就像 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 函数(每秒 5 个请求并持续几分钟的时间),请使用以下命令:

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

在函数详情视图中,点击右侧的“查看日志”菜单:

这应该会将您转到项目的 Stackdriver Logging 部分,仅显示您的 Cloud Functions 函数日志:

希望对函数的所有请求都返回 200 状态代码。

使用此日志查看器,您可以:

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

另请注意,在左上角选择器中,您可以按函数过滤日志。您还可以在窗口顶部的搜索栏中搜索标签或全文搜索。在我们的示例中,标签为 hello-monitor(函数的名称)以及每个请求的执行标识符。

您也可以复制过滤条件以共享(请查看搜索框中的下拉菜单):

使用控制台导航到“函数详情”并查看并观察我们使用负载测试工具创建的峰值,包括每秒调用次数和执行时间:

另一种用于观察延迟时间和 RPC 调用的更详尽的工具是 Stackdriver Trace 功能,但在使用此功能之前,我们需要对函数做一些更改,即:

  1. 将保存 node-emoji 的软件包添加为依赖项
  2. 更新函数代码以使用 node-emoji 模块并引入一些延迟时间
  3. 添加环境变量,以启用适用于 Cloud Functions 的 Stackdriver Trace

在“函数详情”页面中,点击 修改 以修改函数:

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

这将在函数暂停 300 毫秒后向该函数返回的消息添加一个随机表情符号。

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

不要忘记点击“保存”!

现在,返回到 Cloud Shell 并调用命令,为新部署的函数生成一些负载:

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

现在,我们可以观察生成的跟踪记录列表了,无需其他设置要求,也无需在您的代码中指定特定的跟踪库!

使用左侧菜单中导航到“跟踪记录”列表(在 Stackdriver Trace 下):

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

这应该非常明显,我们的函数引入的延迟时间在 300 毫秒。

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

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

要缩小显示,请点击页面顶部的“撤消缩放”按钮。

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

立即转到左侧菜单中的“跟踪记录”\“概览”部分:

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

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

如果您成功设置了正确的时间范围,并拥有足够的数据点,就可以生成报告,并看到初始函数与新函数之间的延迟时间波动情况:

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

此 Codelab 已结束,本单元将介绍如何部署新的 Cloud Functions 函数、浏览其日志并观察其请求跟踪记录。

虽然 Cloud Functions 和 Stackdriver 工具都是无服务器平台,但是在不使用时不会产生任何费用,但作为一个良好的云公民,我们删除一下函数吧。

只需在 Cloud Functions 概览页面中选择 hello-monitor 函数,然后点击“删除”。

此简单的 Codelab 入门及 Cloud Functions 日志记录和跟踪记录到此结束!

下面提供了一些后续跟进内容:

/