Node/Express 应用程序的检测

导航至

这篇文章将逐步介绍如何检测一个示例 nodeJS/Express 应用程序,使用 Telegraf 收集我们的指标,并使用 InfluxDB 存储它们。后续文章将介绍如何探索我们的数据以及使用 Chronograf 构建仪表板。

为什么要进行检测

在进入应用程序开发领域时,我很快学到的一件事是,开发环境中的应用程序似乎总是很好,但是生产环境中的应用程序总是容易出现问题。当您的应用程序面向全世界开放时,您可以肯定有时会出现问题。检测您的应用程序可以为您提供应用程序健康状况的具体证据,使您能够为应用程序的长期发展做出更明智的决策,并以更有效的方式处理出现的各种问题。

流程

那么,让我们学习如何检测我们的应用程序并开始收集一些指标。我们首先需要一个示例应用程序来监控。我慷慨地提供了一个看起来相当破旧的示例应用程序供我们试用,这是我在学生时代构建的,但您可以随意替换成您自己的 nodeJS 应用程序。让我向您介绍 AmazonBay,一个只销售一种商品——冲浪板的电子商务应用程序。

AmazonBay 应用程序图像<figcaption> 是的,我知道冲浪板的描述都是同样的胡言乱语。</figcaption>

我们将破坏它,修复它,然后再破坏它几次,以便进行充分的测试。但是,我保证到本文结束时它会正常工作(我希望如此)。如果您想跟随操作,可以从 这里 克隆存储库。您还需要安装 InfluxDBTelegraf——这些链接将带您到安装指南,其中可以引导您完成所有有趣的内容。

市面上有许多指标库,它们各有优缺点,但为了节省时间和简化操作,我们将坚持使用 IBM 的 Node Application Metrics,它在 GitHub 上提供,主要是因为我觉得他们的文档很详尽且易于理解。无论您是否将其他库或框架(例如 ExpressJS)拉入其中,此指标库都适用于您的 Node 应用程序。还有其他一些库,例如 Coda Hale 指标库的 NodeJS 版本,或者这个 express-node-metrics 库,它被浓缩成一个简洁的 npm 包,我强烈建议您测试几个不同的库,以找到最适合的库。

首先,我们需要安装这个指标库

$ npm install appmetrics --save

导航到服务器文件(方便地命名为 server.js),让我们在服务器文件的前两行中引入 appmetrics 库

const appmetrics = require('appmetrics');
const monitoring = appmetrics.monitor();

正如指标库的文档所述,您必须首先引入 appmetrics 模块,然后再引入您想要监控的任何 npm 模块的其他 require 语句。必须首先初始化 Appmetrics,以便它可以开始检测模块以进行监控,因为这些模块是在加载时被检测的。第二行 appmetrics.monitor() 启动数据收集代理,从而使数据可用于收集并发送到 InfluxDB。

让我们在服务器文件中添加以下示例代码,以检查是否有任何内容正在工作

monitoring.on('cpu', (cpu) => {
    console.log('[' + new Date(cpu.time) + '] CPU Process Percentage: ' + cpu.process + 'CPU System Percentage: ' + cpu.system);
});

一旦触发 cpu 事件,此函数将记录时间戳和 cpu 进程百分比(应用程序使用的 cpu 百分比)以及 cpu 系统百分比。使用以下命令启动服务器

$ node server.js

您应该很快在终端中看到一些输出。

CPU 使用率的终端输出图像<figcaption> 这么多数字!</figcaption>

现在,虽然看到应用程序确实正在被监控,并且我们已经获得了一些数据可以深入挖掘,这令人满意,但对于我们来说,更明智的做法是将所有数据收集并存储在一个地方。输入 Telegraf,我们的开源数据收集代理。我们将通过 HTTP 监听器服务输入插件将一些数据发送到 InfluxDB(我们用于存储时间序列数据的数据库),您可以在 这里 阅读有关它的所有信息。

在 Telegraf 配置文件中,在 HTTP 监听器服务输入插件下,我对其进行了编辑,以便一旦 Telegraf 运行,它将监听端口 8186 以接收 HTTP Post 请求。重要的是要记住,通过发送的数据必须采用 Influx Line Protocol 格式;此特定插件不接受任何其他格式。幸运的是,亲爱的读者,我们有大量的 Telegraf 插件 可用(您也可以始终编写自己的插件!),这些插件接受其他数据格式,因此总有一款插件适合所有人。不过,为了我们的目的,我们将保持简单,并练习使用 Line Protocol。

这是我的配置文件

# # Influx HTTP write listener
  [[inputs.http_listener]]
#   ## Address and port to host HTTP listener on
    service_address = ":8186"
#
#   ## maximum duration before timing out read of the request
    read_timeout = "10s"
#   ## maximum duration before timing out write of the response
    write_timeout = "10s"
#
#   ## Maximum allowed http request body size in bytes.
#   ## 0 means to use the default of 536,870,912 bytes (500 mebibytes)
    max_body_size = 0
#
#   ## Maximum line size allowed to be sent in bytes.
#   ## 0 means to use the default of 65536 bytes (64 kibibytes)
    max_line_size = 0

您可以进行进一步的编辑,例如,如果您想通过指定服务 TLS 证书和密钥的文件名来启用 TLS,或者通过包含授权客户端连接列表来启用相互身份验证的 TLS,但我们将把这些内容留到以后讨论。

使用以下命令启动 Telegraf

$ telegraf -config /usr/local/etc/telegraf.conf

您应该看到它正在运行的证据

终端输出图像<figcaption> 事情正在发生。</figcaption>

现在我们已经成功配置并运行了 Telegraf,是时候将一些指标发送到 InfluxDB 了。回到我们的服务器文件,我们将设置一个 HTTP Post 请求到我们的本地 Telegraf 实例正在监听的端口,看看会发生什么。

monitoring.on('cpu', (cpu) => {
  const postData = `cpu_percentage,host=AmazonBay process=${cpu.process},system=${cpu.system} ${cpu.time}`;

  const options = {
    port: 8186,
    path: '/write?precision=ms',
    method: 'POST',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
  };

  const req = http.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
      console.log('No more data in response.');
    });
  });

  req.on('error', (e) => {
    console.error(`problem with request: ${e.message}`);
  });

  req.write(postData);
  req.end();
});

这里有很多内容,所以让我详细说明一下。当触发 cpu 事件时,我们正在调用一个将执行 HTTP Post 请求的函数。我们的变量 postData 保存了我们的 cpu 进程、系统和时间戳值。在我们的 options 对象中,我们使用附加的查询参数精度设置为毫秒指定了我们的 portpath,因为 InfluxDB 的时间戳默认为纳秒。主机默认为 localhost,这符合我们当前的目的。其余代码处理我们的请求/响应功能和错误路径。

让我们开始运行它!

显示日志的终端输出图像<figcaption> 日志 日志 日志</figcaption>

如果我们查询数据库,我们应该会看到一些数据存储在那里。您可能需要调整查询的时间范围,以免终端结果过载。

显示查询 InfluxDB 以获取 cpu 百分比数据的结果的终端输出<figcaption> 只是一些数据…</figcaption>

后续步骤

正如您所见,我们的数据现在已成功存储在 InfluxDB 中。通过此库,您可以添加并存储到 InfluxDB 的其他指标还有很多。我已经提前添加了一些,并将完成的应用程序推送到了 GitHub:Instrumented-AmazonBay。在下一篇文章中,我们将开始探索正在收集的数据,并在 Chronograf 中构建仪表板。感谢您的阅读,如有任何问题和/或意见,请随时通过 [email protected] 与我联系,或在 Twitter 上 @mschae16 与我联系。