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

导航至

你对你的Web应用程序的性能好奇吗?是否想要实时了解应用程序的健康状况,并通过优化可变工作负载来改善性能、托管相关成本和用户体验?

在这个教程中,我们将指导你如何为基于Express的Node.js Web应用程序构建一个强大的度量服务(MaaS)解决方案。该应用程序使用InfluxDB和PM2来收集、存储和分析关键性能指标,使你能够做出数据驱动的决策并交付卓越的用户体验。我们将从构建最小可行产品版本的基础知识开始。我们将在第二篇博客中进一步介绍数据可视化和一个股票交易应用的现实世界示例。

关键技术

  • Node.js与Express框架:我们的服务器端运行环境具有一个裸机前端,它服务于一个静态HTML文件,我们在其中可以看到应用程序监控指标。

  • PM2:一个流行的开源Node.js应用程序进程管理器,提供所有系统指标。除了进程监控外,此工具还可在生产环境中使Node.js服务器保持活动状态,以实现零停机时间、日志管理等。

  • InfluxDB 3.0 Cloud:我们的时序数据库,用于存储指标并在几乎实时中查询它们,以监控应用性能。我们将使用 InfluxDB 云无服务器环境。如果您还没有账户,您将需要一个账户(它是免费的)

  • 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 https://127.0.0.1:${port}`);
});
1. 使用 PM2 收集 Node.js 服务器指标:CPU、内存、UpTime、重启次数、活跃请求数量
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 云数据探索器中进行查询和可视化

5. 构建 & 运行应用程序

使用 pm2 而不是 node 启动应用程序,以利用其所有优点

pm2 start server.js --name "node-perf-demo"

PM2 相比直接运行 Node.js(node server.js)有多个优势,因为它可以在后台运行您的应用程序,在应用程序崩溃时自动重启它,并提供了内置的监控和日志管理。

总结

您现在已学会使用 PM2 和 InfluxDB 以及一个基本的用户界面,以简单而有效的方式构建 Node.js 应用程序的性能监控系统。这可以作为您可以在GitHub上克隆/基于它构建的起点,用于构建您基于 MaaS 的 Web 应用程序。在第二部分,我们将探索一个更复杂的股票交易应用程序,以展示实际用例和高级数据可视化技术。