TypeScript中的Prometheus指标:完全指南
Prometheus是一个用于实时监控和告警的开源系统,它从您的应用中收集指标。在本文中,我们将探讨如何使用prom-client库将Prometheus指标集成到TypeScript应用中。您将学习如何创建、注册和导出指标,以及如何配置数据收集端点。
什么是Prometheus指标?
Prometheus基于拉取模型工作:它定期轮询(scrape)您应用的端点以获取指标。指标主要分为以下几种类型:
- Counter(计数器) — 只能增加(例如,请求数量)。
- Gauge(仪表盘) — 可以增加和减少(例如,当前活跃用户数)。
- Histogram(直方图) — 测量值的分布(例如,响应时间)。
- Summary(摘要) — 类似于直方图,但在客户端计算分位数。
在TypeScript中安装prom-client
为了在TypeScript中使用Prometheus,我们将使用官方库prom-client。通过npm安装它:
npm install prom-client同时安装TypeScript的类型定义:
npm install @types/prom-client --save-dev创建和注册指标
让我们看一个创建指标的基本示例。创建一个文件metrics.ts:
import client from 'prom-client';
// 创建指标注册表(默认使用全局注册表)const register = new client.Registry();
// 添加默认指标(例如,内存、CPU)client.collectDefaultMetrics({ register });
// 创建用于统计请求数的Counterconst httpRequestsTotal = new client.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'status', 'path'], registers: [register],});
// 创建用于活跃连接的Gaugeconst activeConnections = new client.Gauge({ name: 'active_connections', help: 'Number of active connections', registers: [register],});
// 创建用于响应时间的Histogramconst httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'path'], buckets: [0.01, 0.05, 0.1, 0.5, 1, 5], registers: [register],});
export { register, httpRequestsTotal, activeConnections, httpRequestDuration };在Express应用中使用指标
现在,让我们创建一个使用这些指标的简单TypeScript Express应用:
import express from 'express';import { register, httpRequestsTotal, activeConnections, httpRequestDuration } from './metrics';
const app = express();const port = 3000;
// 用于统计请求时间的中间件app.use((req, res, next) => { const end = httpRequestDuration.startTimer({ method: req.method, path: req.path }); activeConnections.inc();
res.on('finish', () => { httpRequestsTotal.inc({ method: req.method, status: res.statusCode.toString(), path: req.path }); activeConnections.dec(); end(); });
next();});
// Prometheus端点app.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.end(await register.metrics());});
// 示例端点app.get('/', (req, res) => { res.send('Hello, Prometheus!');});
app.listen(port, () => { console.log(`Server running at http://localhost:${port}`);});启动和验证
启动应用:
npx ts-node app.ts在浏览器中打开