MaaS:如何使用 PM2 和 InfluxDB 监控 Node.js 应用性能
作者:Suyash Joshi / 开发者
2024 年 10 月 23 日
导航至
您是否对您的 Web 应用程序的性能感到好奇?是否曾经希望实时了解您的应用程序的健康状况,并针对可变工作负载优化其性能,以提高性能、降低托管相关成本并改善用户体验?
在本教程中,我们将引导您完成为您的 Node.js 构建强大的指标即服务 (MaaS) 解决方案的过程,该方案基于 Express Web 应用程序。该应用程序使用 InfluxDB 和 PM2 来收集、存储和分析关键性能指标,使您能够做出数据驱动的决策并提供卓越的用户体验。让我们首先介绍构建 MVP 版本的基础知识。我们将在第二篇博客中扩展这一点,其中将介绍数据可视化和股票交易应用程序的真实示例。
关键技术
-
带有 Express 框架的 Node.js:我们的服务器端运行时环境,带有一个最基本的前端,用于提供静态 HTML 文件,我们在其中查看应用程序监控指标。
-
PM2:一个流行的 Node.js 应用程序开源进程管理器,提供所有系统指标。除了进程监控外,此工具还可以使 Node.js 服务器在生产环境中保持活动状态以实现零停机时间、日志管理等。
-
InfluxDB 3.0 Cloud:我们的时间序列数据库,用于存储指标并在近乎实时的环境中查询它们,以进行应用程序性能监控。我们将使用 InfluxDB Cloud Serverless 环境。如果您还没有帐户,您将需要一个(它是免费的)。
-
InfluxDB Node.js v3 客户端库:通过 JavaScript API 从我们的 Node.js 应用程序与 InfluxDB 交互。
-
其他 NPM 依赖项:dotenv 使我们的 InfluxDB 凭据保持私密。
-
从 GitHub 下载/克隆应用程序以进行构建,或者通过设置 Node.js 服务器和 InfluxDB 连接从头开始构建。
import express from 'express';
import { InfluxDBClient } from '@influxdata/influxdb3-client';
import dotenv from 'dotenv'; // influxDB credentials in .env file
dotenv.config();
const app = express();
const port = 3000;
const client = new InfluxDBClient({
host: process.env.INFLUXDB_URL,
token: process.env.INFLUXDB_TOKEN,
org: process.env.INFLUXDB_ORG
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
1. 使用 PM2 收集 Node.js 服务器指标:CPU、内存、正常运行时间、重启次数、活动请求数
import pm2 from 'pm2';
function getPM2Metrics() {
return new Promise((resolve, reject) => {
pm2.describe('node-perf-demo', (err, processDescription) => {
if (err) {
reject(err);
return;
}
const metrics = processDescription[0].monit;
resolve({
cpu: metrics.cpu,
memory: metrics.memory,
uptime: processDescription[0].pm2_env.pm_uptime,
restarts: processDescription[0].pm2_env.restart_time,
activeRequests: processDescription[0].pm2_env.axm_monitor['Active requests']?.value || 0
});
});
});
}
2. 每 5 秒将指标写入 InfluxDB 存储桶
async function writeMetrics(metrics) {
const point = Point.measurement('node_metrics')
.setFloatField('cpu', metrics.cpu)
.setFloatField('memory', metrics.memory)
.setIntField('restarts', Number(metrics.restarts))
.setIntField('uptime', Number(metrics.uptime))
.setIntField('requestsPerFiveSeconds', metrics.requestsPerFiveSeconds)
.setIntField('activeRequests', metrics.activeRequests)
.setTimestamp(new Date());
await client.write(point, process.env.INFLUXDB_DATABASE);
}
setInterval(async () => {
const pm2Metrics = await getPM2Metrics();
await writeMetrics(pm2Metrics);
}, 5000);
3. 每 5 秒从 InfluxDB 查询指标(使用 SQL)以用于我们的 Web 应用程序 (/api/metrics)
async function queryMetrics() {
const query = `
SELECT *
FROM "node_metrics"
WHERE time >= now() - interval '5 seconds'
ORDER BY time DESC
LIMIT 1
`;
const results = [];
const queryResult = client.query(query, process.env.INFLUXDB_DATABASE, { type: 'sql' });
for await (const row of queryResult) {
results.push(row);
}
return results;
}
app.get('/api/metrics', async (req, res) => {
try {
const metrics = await queryMetrics();
res.json(metrics);
} catch (error) {
res.status(500).json({ error: 'Internal server error' });
}
});
4. 指标也可以在 InfluxDB Cloud Data Explorer 中查询和可视化
5. 构建并运行应用程序
使用 pm2 而不是 node 启动应用程序,以获得其所有优势
pm2 start server.js --name "node-perf-demo"
与直接运行 Node.js (node server.js) 相比,PM2 具有多项优势,因为它使您的应用程序在后台运行,在崩溃时自动重启,并提供内置的监控和日志管理。
总结
您现在已经学习了一种简单的方法,可以使用 PM2 和 InfluxDB 以及基本的前端,为 Node.js 应用程序构建一个简单而有效的应用程序性能监控系统。这可以作为您在 GitHub 上克隆/构建 MaaS 驱动的 Web 应用程序的起点。在第 2 部分中,我们将探索一个更复杂的股票交易应用程序,以演示真实世界的用例和高级数据可视化技术。