Node/Express 应用程序的检测
作者:Margo Schaedel / 产品, 用例, 开发者
2018 年 3 月 7 日
导航至
这篇文章将逐步介绍如何检测一个示例 nodeJS/Express 应用程序,使用 Telegraf 收集我们的指标,并使用 InfluxDB 存储它们。后续文章将介绍如何探索我们的数据以及使用 Chronograf 构建仪表板。
为什么要进行检测
在进入应用程序开发领域时,我很快学到的一件事是,开发环境中的应用程序似乎总是很好,但是生产环境中的应用程序总是容易出现问题。当您的应用程序面向全世界开放时,您可以肯定有时会出现问题。检测您的应用程序可以为您提供应用程序健康状况的具体证据,使您能够为应用程序的长期发展做出更明智的决策,并以更有效的方式处理出现的各种问题。
流程
那么,让我们学习如何检测我们的应用程序并开始收集一些指标。我们首先需要一个示例应用程序来监控。我慷慨地提供了一个看起来相当破旧的示例应用程序供我们试用,这是我在学生时代构建的,但您可以随意替换成您自己的 nodeJS 应用程序。让我向您介绍 AmazonBay,一个只销售一种商品——冲浪板的电子商务应用程序。
<figcaption> 是的,我知道冲浪板的描述都是同样的胡言乱语。</figcaption>
我们将破坏它,修复它,然后再破坏它几次,以便进行充分的测试。但是,我保证到本文结束时它会正常工作(我希望如此)。如果您想跟随操作,可以从 这里 克隆存储库。您还需要安装 InfluxDB 和 Telegraf——这些链接将带您到安装指南,其中可以引导您完成所有有趣的内容。
市面上有许多指标库,它们各有优缺点,但为了节省时间和简化操作,我们将坚持使用 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
您应该很快在终端中看到一些输出。
<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
对象中,我们使用附加的查询参数精度设置为毫秒指定了我们的 port
和 path
,因为 InfluxDB 的时间戳默认为纳秒。主机默认为 localhost
,这符合我们当前的目的。其余代码处理我们的请求/响应功能和错误路径。
让我们开始运行它!
<figcaption> 日志 日志 日志</figcaption>
如果我们查询数据库,我们应该会看到一些数据存储在那里。您可能需要调整查询的时间范围,以免终端结果过载。
<figcaption> 只是一些数据…</figcaption>
后续步骤
正如您所见,我们的数据现在已成功存储在 InfluxDB 中。通过此库,您可以添加并存储到 InfluxDB 的其他指标还有很多。我已经提前添加了一些,并将完成的应用程序推送到了 GitHub:Instrumented-AmazonBay。在下一篇文章中,我们将开始探索正在收集的数据,并在 Chronograf 中构建仪表板。感谢您的阅读,如有任何问题和/或意见,请随时通过 [email protected] 与我联系,或在 Twitter 上 @mschae16 与我联系。