MaaS:如何使用 PM2 和 InfluxDB 监控 Node.js 应用性能

导航至

您是否对您的 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 部分中,我们将探索一个更复杂的股票交易应用程序,以演示真实世界的用例和高级数据可视化技术。