分析网络服务器错误
错误计数表明出现了问题。结构化上下文(路由、状态代码、发布和请求 ID)可帮助您识别出现问题的内容并将其与部署关联起来。
最有用的错误事件会保留事件期间所需的维度。
在现代 Web 开发中,监控和日志记录是维护健壮且可靠的应用程序的关键方面。 Telemetry 允许开发人员跟踪各种事件和系统指标,这对于调试和改善用户体验至关重要。在这篇文章中,我们将探讨如何使用 Telemetry API 捕获并记录 Express.js Web 服务器中的所有错误。虽然本指南仅涵盖 Express,但这些想法适用于所有 Web 服务器,从 Rails 到 Elixir 等。
设置Telemetry
在记录任何数据之前,我们需要设置 Telemetry。在此示例中,我们将使用 Telemetry JavaScript SDK。
首先,在您的项目中安装 Telemetry SDK:
npm install telemetry-sh
然后,使用 API 密钥在应用程序中初始化 Telemetry 客户端:
import telemetry from "telemetry-sh";
telemetry.init("YOUR_API_KEY");
创建 Express 应用程序
接下来,让我们设置一个基本的 Express 应用程序。如果您尚未安装 Express,可以使用以下命令将其添加到您的项目中:
npm install express
现在,创建一个简单的 Express 服务器:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
添加结构化错误中间件
错误处理程序属于所有路由之后。捕获安全类别和操作上下文,而不是可能包含私有值的原始主体、凭据、堆栈跟踪或异常消息。
const express = require("express");
const telemetry = require("telemetry-sh");
telemetry.init(process.env.TELEMETRY_API_KEY);
const app = express();
app.get("/api/projects/:id", async (req, res) => {
throw Object.assign(new Error("Synthetic failure"), {
code: "PROJECT_LOOKUP_FAILED",
});
});
app.use(async (err, req, res, next) => {
const statusCode = Number(err.statusCode) || 500;
await telemetry.log("api_request_failed", {
route_template: req.route?.path ?? "unmatched_route",
method: req.method,
status_code: statusCode,
status: "error",
error_type: err.constructor?.name ?? "Error",
error_code: err.code ?? "UNCLASSIFIED_ERROR",
request_id: req.get("x-request-id") ?? "missing",
release: process.env.APP_RELEASE ?? "unknown",
});
res.status(statusCode).json({ error: "Request failed" });
});
app.listen(3000);
使用 /api/projects/:id 等路由模板,而不是包含客户标识符的原始路径。当这些失败对工作流程很重要时,请保持处理的 4xx 和 5xx 响应的事件架构相同。
查询并可视化错误
从按路线和版本划分的故障率开始,然后保留最近事件表以供调查:
SELECT
route_template,
release,
status_code,
error_code,
COUNT(*) AS failures,
MAX(timestamp_utc) AS last_seen_at
FROM api_request_failed
WHERE timestamp_utc >= now() - INTERVAL '24 hours'
GROUP BY route_template, release, status_code, error_code
ORDER BY failures DESC, last_seen_at DESC;
为了获得真实的错误率,请使用共享的 status 或 status_code 字段将成功和失败的请求记录到同一个表中。仅故障表可以对错误进行排名,但无法提供分母。
后续步骤
使用 API 路由配方错误率 进行分母安全查询、示例可视化、仪表板布局和告警指导。将其与 API 延迟百分位 配对,以便事件视图涵盖正确性和速度。