阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 性能监控工具的初步设置

性能监控工具的初步设置

作者:陈川 阅读数:8539人阅读 分类: Node.js

性能监控工具的初步设置

Koa2应用中集成性能监控工具能帮助开发者快速定位性能瓶颈。常见的工具包括koa-respond-timekoa-better-http-proxy等,下面通过具体配置示例说明如何实现基础监控功能。

响应时间监控

使用koa-response-time中间件可以自动在响应头中添加X-Response-Time字段:

const Koa = require('koa');
const responseTime = require('koa-response-time');

const app = new Koa();
app.use(responseTime());

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);

测试请求时会看到类似响应头:

X-Response-Time: 12.345ms

内存泄漏检测

通过heapdump模块创建内存快照:

const heapdump = require('heapdump');
const fs = require('fs');

setInterval(() => {
  const filename = `${Date.now()}.heapsnapshot`;
  heapdump.writeSnapshot(filename, err => {
    if (err) console.error(err);
    else console.log(`Dumped ${filename}`);
  });
}, 60 * 1000);

请求耗时分析

自定义中间件记录慢请求:

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  
  if (ms > 500) {
    console.warn(`Slow request: ${ctx.method} ${ctx.url} - ${ms}ms`);
  }
  
  ctx.set('X-Response-Time', `${ms}ms`);
});

错误追踪集成

结合Sentry进行异常监控:

const Sentry = require('@sentry/node');
const Koa = require('koa');

Sentry.init({ dsn: 'YOUR_DSN_HERE' });

const app = new Koa();

app.on('error', (err, ctx) => {
  Sentry.withScope(scope => {
    scope.addEventProcessor(event => 
      Sentry.Handlers.parseRequest(event, ctx.request)
    );
    Sentry.captureException(err);
  });
});

数据库查询监控

TypeORM中监听查询事件:

import { createConnection, Connection } from "typeorm";

createConnection().then(connection => {
  connection.subscribe(event => {
    if (event.query) {
      console.log(`Query: ${event.query}`);
      console.log(`Parameters: ${event.parameters}`);
      console.log(`Duration: ${event.duration}ms`);
    }
  });
});

进程指标收集

使用prom-client暴露Prometheus格式指标:

const client = require('prom-client');
const collectDefaultMetrics = client.collectDefaultMetrics;

collectDefaultMetrics({ timeout: 5000 });

app.use(async (ctx, next) => {
  if (ctx.path === '/metrics') {
    ctx.set('Content-Type', client.register.contentType);
    ctx.body = client.register.metrics();
    return;
  }
  await next();
});

分布式追踪配置

Jaeger客户端初始化示例:

const jaeger = require('jaeger-client');

const tracer = jaeger.initTracer({
  serviceName: 'koa-app',
  sampler: {
    type: 'const',
    param: 1,
  },
  reporter: {
    logSpans: true,
    agentHost: 'localhost',
  },
});

app.use(async (ctx, next) => {
  const span = tracer.startSpan(ctx.path);
  await next();
  span.finish();
});

日志结构化处理

使用winston创建分级日志:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'debug',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

app.use(async (ctx, next) => {
  logger.info(`${ctx.method} ${ctx.url}`);
  await next();
});

实时性能面板

安装koa-webpack配合Webpack Dashboard:

const Dashboard = require('webpack-dashboard');
const DashboardPlugin = require('webpack-dashboard/plugin');

const dashboard = new Dashboard();
compiler.apply(new DashboardPlugin(dashboard.setData));

app.use(require('koa-webpack')({
  compiler,
  devMiddleware: {
    publicPath: '/',
    stats: 'minimal'
  }
}));

自定义性能指标

记录业务特定指标示例:

const userTiming = new Map();

app.use(async (ctx, next) => {
  const start = process.hrtime();
  await next();
  const diff = process.hrtime(start);
  const ms = diff[0] * 1e3 + diff[1] * 1e-6;
  
  userTiming.set(ctx.path, (userTiming.get(ctx.path) || 0) + ms);
});

告警规则配置

Prometheus Alertmanager示例规则:

groups:
- name: koa-rules
  rules:
  - alert: HighLatency
    expr: http_request_duration_seconds{quantile="0.95"} > 1
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High latency on {{ $labels.instance }}"
      description: "95th percentile latency is {{ $value }}s"

浏览器性能关联

前端注入Trace ID:

app.use(async (ctx, next) => {
  ctx.state.traceId = generateTraceId();
  await next();
  ctx.set('X-Trace-Id', ctx.state.traceId);
});

// 前端代码
fetch('/api/data', {
  headers: {
    'X-Trace-Id': window.performance.now().toString(36)
  }
})

压力测试集成

Artillery测试脚本示例:

config:
  target: "http://localhost:3000"
  phases:
    - duration: 60
      arrivalRate: 10
scenarios:
  - flow:
      - get:
          url: "/api"
      - think: 1

容器环境适配

Docker健康检查配置:

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:3000/health || exit 1

对应Koa路由实现:

router.get('/health', ctx => {
  ctx.body = { 
    status: 'UP',
    db: checkDatabase(),
    memory: process.memoryUsage()
  };
});

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌