TypeScript 应用监控:工具与库完全指南
监控是现代 TypeScript Web 应用开发中不可或缺的一部分。没有监控,您将盲目工作:错误未被发现,性能下降,用户流失。在本文中,我们将介绍用于监控 TypeScript 应用的关键库和工具,包括 Sentry、OpenTelemetry、Prometheus 以及内置日志记录。您将了解如何实时配置错误收集、指标和追踪。
1. Sentry:实时错误跟踪
Sentry 是最流行的错误监控平台。它开箱即用地支持 TypeScript,允许捕获异常、记录执行上下文并接收崩溃通知。
安装与基本配置
npm install @sentry/node @sentry/tracing在 Node.js 上的 TypeScript 应用中初始化 Sentry 的示例:
import * as Sentry from "@sentry/node";import { ProfilingIntegration } from "@sentry/profiling-node";
Sentry.init({ dsn: "https://examplePublicKey@o0.ingest.sentry.io/0", integrations: [ new ProfilingIntegration(), ], tracesSampleRate: 1.0, profilesSampleRate: 1.0,});
// 强制发送错误app.get("/debug-sentry", function mainHandler(req, res) { throw new Error("Sentry 测试错误!");});上下文日志记录
Sentry 允许添加自定义标签和上下文:
Sentry.setUser({ email: "user@example.com" });Sentry.setTag("environment", "production");Sentry.captureException(new Error("处理订单时出错"));2. OpenTelemetry:追踪和指标的标准
OpenTelemetry 是用于收集遥测数据(追踪、指标和日志)的开放标准。它支持 TypeScript,并易于与任何后端(Jaeger、Zipkin、Prometheus)集成。
安装包
npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/instrumentation-http @opentelemetry/instrumentation-express追踪配置示例
import { NodeSDK } from "@opentelemetry/sdk-node";import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";import { ConsoleSpanExporter } from "@opentelemetry/sdk-trace-node";
const sdk = new NodeSDK({ traceExporter: new ConsoleSpanExporter(), instrumentations: [getNodeAutoInstrumentations()],});
sdk.start();现在,每个 HTTP 请求将自动包装在带有元数据的跨度(span)中。您可以添加自定义跨度:
import { trace } from "@opentelemetry/api";
const tracer = trace.getTracer("my-service");
app.get("/api/data", async (req, res) => { const span = tracer.startSpan("processData"); try { const data = await fetchData(); span.setAttribute("data.size", data.length); res.json(data); } finally { span.end(); }});3. Prometheus + express-prom-bundle:Node.js 指标
要收集性能指标(RPS、响应时间、错误数量),请使用 Prometheus 结合 express-prom-bundle 库。它会自动从 Express 应用收集指标。
安装
npm install prom-client express-prom-bundle配置示例
import express from "express";import promBundle from "express-prom-bundle";
const app = express();
const metricsMiddleware = promBundle({ includeMethod: true, includePath: true, includeStatusCode: true, customLabels: { project: "my-app" }, metricsPath: "/metrics",});
app.use(metricsMi