Webサーバーエラーの分析
エラー数は、何かが壊れたことを示します。構造化されたコンテキスト (ルート、ステータス コード、リリース、リクエスト ID) は、何が壊れたのかを特定し、それをデプロイメントに関連付けるのに役立ちます。
最も便利なエラー イベントは、インシデント発生時に必要なディメンションを保存します。
最新の Web 開発では、監視とロギングは、堅牢で信頼性の高いアプリケーションを維持するための重要な側面です。 Telemetry を使用すると、開発者は、デバッグやユーザー エクスペリエンスの向上に重要なさまざまなイベントやシステム メトリクスを追跡できます。この投稿では、Telemetry API を使用して、Express.js Web サーバー内のすべてのエラーを捕捉してログに記録する方法を説明します。このガイドでは Express のみを取り上げていますが、このアイデアは Rails から Elixir などのすべての Web サーバーに適用できます。
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 遅延パーセンタイル したがって、インシデントビューは正確さと速度の両方をカバーします。