TypeScript 中的 Prometheus 指标:实践指南
Prometheus 是一个强大的开源监控和告警系统。要与 TypeScript 应用程序集成,需要使用 prom-client(Prometheus Client)库。它允许以 Prometheus 服务器可理解的格式收集、聚合和导出指标。在本文中,我们将详细介绍如何在 TypeScript 中使用 Prometheus 指标,包括指标类型、代码示例和最佳实践。
安装与配置
首先,通过 npm 安装包:
npm install prom-client对于 TypeScript,还需要安装类型定义:
npm install @types/prom-client --save-dev安装完成后,创建一个 metrics.ts 文件来初始化客户端:
import client from 'prom-client';
// 启用默认指标收集(GC、内存、CPU)const collectDefaultMetrics = client.collectDefaultMetrics;collectDefaultMetrics({ timeout: 5000 });
// 创建用于存储指标的注册表const register = client.register;
export { client, register };Prometheus 主要指标类型
Prometheus 支持四种主要指标类型。下面我们结合 TypeScript 示例逐一介绍。
1. Counter(计数器)
用于统计只会增加的事件(请求数、错误数)。
import { Counter } from 'prom-client';
const httpRequestsTotal = new Counter({ name: 'http_requests_total', help: 'HTTP 请求总数', labelNames: ['method', 'path', 'status_code'],});
// 在请求时增加计数器httpRequestsTotal.inc({ method: 'GET', path: '/api', status_code: 200 });httpRequestsTotal.inc({ method: 'POST', path: '/users', status_code: 201 }, 2); // +22. Gauge(仪表盘)
可以增加和减少。用于表示当前值(内存、队列长度)。
import { Gauge } from 'prom-client';
const memoryUsageGauge = new Gauge({ name: 'memory_usage_bytes', help: '当前内存使用量(字节)',});
// 设置值memoryUsageGauge.set(process.memoryUsage().heapUsed);
// 按增量修改memoryUsageGauge.inc(1024); // +1KBmemoryUsageGauge.dec(512); // -512B3. Histogram(直方图)
用于测量值的分布(例如响应时间)。
import { Histogram } from 'prom-client';
const httpRequestDuration = new Histogram({ name: 'http_request_duration_seconds', help: 'HTTP 请求持续时间(秒)', labelNames: ['method', 'route'], buckets: [0.1, 0.3, 0.5, 1, 2, 5], // 桶边界});
// 观测值const start = Date.now();// ... 处理请求 ...httpRequestDuration.observe( { method: 'GET', route: '/api' }, (Date.now() - start) / 1000);4. Summary(摘要)
类似于直方图,但在客户端计算分位数。
import { Summary } from 'prom-client';
const responseTimeSummary = new Summary({ name: 'response_time_summary_seconds', help: '响应时间摘要(秒)', percentiles: [0.5, 0.9, 0.99], // 分位数});
responseTimeSummary.observe(0.42);responseTimeSummary.observe(0.35);为 Prometheus 导出指标
创建一个 /metrics 端点,以文本格式提供指标:
import express from 'express';import { register } from './metrics';
const app = express();
app.get('/metrics', async (req, res) => { try { res.set('Content-Type', register.contentType); res.end(await register.metrics()); } catch (err) { res.status(500).end(err); }});
app.listen(3000, () => console.log('服务器运行在端口 3000'));现在,当收到 GET 请求时