monitoring-expert

monitoring-expert

热门

配置监控系统,实现结构化日志管道,创建Prometheus/Grafana仪表板,定义告警规则,并实施分布式追踪。部署Prometheus/Grafana栈,进行负载测试,执行应用性能分析,规划基础设施容量。适用于设置应用监控、为服务添加可观测性、通过日志/指标/追踪调试生产问题、使用k6或Artillery运行负载测试、分析CPU/内存瓶颈,或预测容量需求。

1.1万Star
967Fork
更新于 2026/5/20
SKILL.md
readonly只读
name
monitoring-expert
description

配置监控系统,实现结构化日志管道,创建Prometheus/Grafana仪表板,定义告警规则,并实施分布式追踪。部署Prometheus/Grafana栈,进行负载测试,执行应用性能分析,规划基础设施容量。适用于设置应用监控、为服务添加可观测性、通过日志/指标/追踪调试生产问题、使用k6或Artillery运行负载测试、分析CPU/内存瓶颈,或预测容量需求。

监控专家

可观测性和性能专家,实现全面的监控、告警、追踪和性能测试系统。

核心工作流程

  1. 评估 — 确定需要监控的内容(SLI、关键路径、业务指标)
  2. 仪表化 — 为应用添加日志、指标和追踪(参见下方示例)
  3. 收集 — 配置聚合和存储(Prometheus抓取、日志收集器、OTLP端点);在继续之前验证数据是否到达
  4. 可视化 — 使用RED(速率/错误/持续时间)或USE(利用率/饱和度/错误)方法构建仪表板
  5. 告警 — 在关键路径上定义阈值和异常告警;在发布前验证没有误报洪流

快速入门示例

结构化日志(Node.js / Pino)

import pino from 'pino';

const logger = pino({ level: 'info' });

// 好 — 结构化字段,包含关联ID
logger.info({ requestId: req.id, userId: req.user.id, durationMs: elapsed }, 'order.created');

// 坏 — 字符串插值,无关联
console.log(`Order created for user ${userId}`);

Prometheus指标(Node.js)

import { Counter, Histogram, register } from 'prom-client';

const httpRequests = new Counter({
  name: 'http_requests_total',
  help: 'HTTP请求总数',
  labelNames: ['method', 'route', 'status'],
});

const httpDuration = new Histogram({
  name: 'http_request_duration_seconds',
  help: 'HTTP请求延迟',
  labelNames: ['method', 'route'],
  buckets: [0.05, 0.1, 0.3, 0.5, 1, 2, 5],
});

// 仪表化路由
app.use((req, res, next) => {
  const end = httpDuration.startTimer({ method: req.method, route: req.path });
  res.on('finish', () => {
    httpRequests.inc({ method: req.method, route: req.path, status: res.statusCode });
    end();
  });
  next();
});

// 暴露抓取端点
app.get('/metrics', async (req, res) => {
  res.set('Content-Type', register.contentType);
  res.end(await register.metrics());
});

OpenTelemetry追踪(Node.js)

import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { trace } from '@opentelemetry/api';

const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({ url: 'http://jaeger:4318/v1/traces' }),
});
sdk.start();

// 手动创建关键操作的span
const tracer = trace.getTracer('order-service');
async function processOrder(orderId) {
  const span = tracer.startSpan('order.process');
  span.setAttribute('order.id', orderId);
  try {
    const result = await db.saveOrder(orderId);
    span.setStatus({ code: SpanStatusCode.OK });
    return result;
  } catch (err) {
    span.recordException(err);
    span.setStatus({ code: SpanStatusCode.ERROR });
    throw err;
  } finally {
    span.end();
  }
}

Prometheus告警规则

groups:
  - name: api.rules
    rules:
      - alert: HighErrorRate
        expr: |
          rate(http_requests_total{status=~"5.."}[5m])
          / rate(http_requests_total[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.route }} 的错误率超过5%"

k6负载测试

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '1m', target: 50 },   // 逐步增加
    { duration: '5m', target: 50 },   // 持续负载
    { duration: '1m', target: 0 },    // 逐步减少
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'],  // 95分位数 < 500 ms
    http_req_failed:   ['rate<0.01'],  // 错误率 < 1%
  },
};

export default function () {
  const res = http.get('https://api.example.com/orders');
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(1);
}

参考指南

根据上下文加载详细指导:

主题 参考 加载时机
日志 references/structured-logging.md Pino, JSON日志
指标 references/prometheus-metrics.md Counter, Histogram, Gauge
追踪 references/opentelemetry.md OpenTelemetry, spans
告警 references/alerting-rules.md Prometheus告警
仪表板 references/dashboards.md RED/USE方法, Grafana
性能测试 references/performance-testing.md 负载测试, k6, Artillery, 基准测试
性能分析 references/application-profiling.md CPU/内存分析, 瓶颈
容量规划 references/capacity-planning.md 扩展, 预测, 预算

约束

必须做

  • 使用结构化日志(JSON)
  • 包含请求ID用于关联
  • 为关键路径设置告警
  • 监控业务指标,而不仅仅是技术指标
  • 使用适当的指标类型(counter/gauge/histogram)
  • 实现健康检查端点

禁止做

  • 记录敏感数据(密码、令牌、PII)
  • 对每个错误都告警(告警疲劳)
  • 在日志中使用字符串插值(使用结构化字段)
  • 在分布式系统中跳过关联ID

文档