node-postgres pool and query telemetry でイベントを送信して確認する
制御されたアプリケーション境界で node-postgres pool and query telemetry を使用し、イベント コントラクトを小さく保ち、集約ビューを構築する前に既知の結果を検証します。
- 1
結果を選択してください
Postgres 接続プールの監視
- 2
契約を定義する
query_fingerprint、サービス、database_name、ステータス、および duration_ms
- 3
結果で発行する
生の SQL から取得するのではなく、呼び出しサイトから境界付きフィンガープリントを渡します。
- 4
証拠を検証する
Exercise a known fixture, then inspect database_query_completed for one correctly typed terminal row.
始める前に
始める前に
- 共有プールを含む pg パッケージ
- アプリケーションが所有する操作のフィンガープリント
- サーバー側 TELEMETRY_API_KEY
- fetch と AbortSignal.timeout を備えたサーバー実行環境
配信設定
サーバー側のインストールと初期化
このサーバー側の例では、サーバー側のキーと時間制限付き fetch リクエストで Log API にイベントを送信します。Telemetry SDK の初期化は不要です。 ブラウザ バンドル、クライアントに表示される環境変数、ソース管理、ログ、および例外メッセージに取り込み資格情報が含まれないようにします。
npmのインストール
npm install pg- 1制限されたネットワーク動作を持つ再利用可能なサーバー側配信クライアントを 1 つ準備します。
- 2成功、失敗、再試行、またはタイムアウトの境界に結果イベントを追加します。
- 3アラートを有効にする前に、制御されたフィクスチャを送信し、保存されている行を検査します。
スニペット
1 つの構造化されたイベントから始める
ワークフローが完了、失敗、または再試行される場所にこの図形を追加します。次に、実際のフィールドからダッシュボードを構築します。
node-postgres pool and query telemetryイベント
import { Pool } from "pg";
async function emitDatabaseOutcome(data) {
try {
const delivery = await fetch("https://api.telemetry.sh/log", {
method: "POST",
headers: {
Authorization: process.env.TELEMETRY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ table: "database_query_completed", data }),
signal: AbortSignal.timeout(1000),
});
if (!delivery.ok) throw new Error("telemetry_delivery_unconfirmed");
} catch {
try { console.warn("Telemetry delivery unconfirmed"); } catch {}
}
}
const pool = new Pool({ max: 10 });
const SAFE_DATABASE_ERROR_CODES = new Set(["40001", "40P01", "55P03", "57014"]);
function classifyDatabaseError(error) {
return error && typeof error === "object" &&
"code" in error &&
SAFE_DATABASE_ERROR_CODES.has(String(error.code))
? String(error.code)
: "database_error";
}
async function runDatabaseOperation({
queryFingerprint,
text,
values,
}) {
const acquireStartedAt = performance.now();
let client;
let acquisitionWaitMs;
let queryStartedAt;
let outcome;
try {
client = await pool.connect();
acquisitionWaitMs = performance.now() - acquireStartedAt;
queryStartedAt = performance.now();
const result = await client.query(text, values);
outcome = {
query_fingerprint: queryFingerprint,
service: "checkout-api",
database_name: "app_production",
status: "success",
phase: "query",
operation_duration_ms: Math.round(performance.now() - acquireStartedAt),
duration_ms: Math.round(performance.now() - queryStartedAt),
acquisition_wait_ms: Math.round(acquisitionWaitMs),
rows_returned: result.rowCount ?? result.rows.length,
active_connections: pool.totalCount - pool.idleCount,
idle_connections: pool.idleCount,
max_connections: pool.options.max ?? 10,
waiting_count: pool.waitingCount,
release: process.env.APP_RELEASE,
environment: process.env.NODE_ENV,
};
return result;
} catch (error) {
outcome = {
query_fingerprint: queryFingerprint,
service: "checkout-api",
database_name: "app_production",
status: "failed",
phase: queryStartedAt === undefined ? "acquire" : "query",
duration_ms: queryStartedAt === undefined ? undefined : Math.round(performance.now() - queryStartedAt),
acquisition_wait_ms: Math.round(acquisitionWaitMs ?? (performance.now() - acquireStartedAt)),
operation_duration_ms: Math.round(performance.now() - acquireStartedAt),
error_type: classifyDatabaseError(error),
active_connections: pool.totalCount - pool.idleCount,
idle_connections: pool.idleCount,
max_connections: pool.options.max ?? 10,
waiting_count: pool.waitingCount,
release: process.env.APP_RELEASE,
environment: process.env.NODE_ENV,
};
throw error;
} finally {
client?.release();
if (outcome) await emitDatabaseOutcome(outcome);
}
}イベントスキーマ
query_fingerprint、サービス、database_name、ステータス、および duration_ms
active_connections、idle_connections、max_connections、および waiting_count
acquisition_wait_ms, operation_duration_ms, phase, rows_returned, error_type, release, and environment
設定を確認する
チェックポイント 1
生の SQL から取得するのではなく、呼び出しサイトから境界付きフィンガープリントを渡します。
チェックポイント 2
接続の取得をクエリの実行とは別に測定して、プールの競合がデータベースの作業と誤解されないようにします。
チェックポイント 3
ホワイトリストを通じてドライバーのエラー コードを記録し、接続文字列、クエリ パラメーター、または生のデータベース メッセージを決して転送しないでください。
チェックポイント 4
結果を送信する前に取得したデータベースクライアントを解放してください。Log API の 1 秒の協調的タイムアウトと保護した診断出力により、送信失敗でデータベースの結果やエラーが置き換わるのを防ぎます。
チェックポイント 5
acquisition_wait_ms とクエリ実行の duration_ms は別々に記録します。接続取得に失敗した場合はクエリ時間を省略し、operation_duration_ms は両フェーズを含めます。プールの値はクライアント解放前に取得します。
チェックポイント 6
この例はトランザクション、永続的な送信、再試行、終了時の送信待ち処理を実装していません。アプリで接続とクエリの制限、およびプールのバックグラウンドエラー処理を設定してください。
検証
イベントが到着したことを証明する
既知の成功例と失敗例を実行した後、これを実行します。最終的なイベント コントラクトがスニペットと異なる場合は、フォールバック テーブル名を置き換えます。
node-postgres pool and query telemetry 検証クエリ
SELECT *
FROM database_query_completed
ORDER BY timestamp_utc DESC
LIMIT 20;実装の参考資料
新しい運用パスを有効にする前に、イベント契約、データ安全性に関するガイダンス、上流の主要ドキュメントを確認してください。
イベントを記録する場所
結果イベントを小さく、回復可能なものに保つ
このパターンが提供するのは、
- 上流のワークフローの横にある、制限付きの SQL 対応の結果。
- ダッシュボード、アラート、およびイベント間の相関関係の安定したフィールド。
- 成功、失敗、再試行、タイムアウトの動作を検証するためのフィクスチャ駆動のパス。
このパターンでは提供されません
- OTLP エクスポーター、自動収集パイプライン、または詳細なトレースと診断ログの代替。
- ペイロードにイベント ID が含まれているという理由だけで、1 回だけ配信されます。
- 生のプロバイダー ペイロード、ユーザー コンテンツ、資格情報、または規制されたデータを収集する許可。
イベントスキーマの例
このワークフローのイベントスキーマ
クエリまたはスニペットを運用環境に適用する前に、行粒度、出力境界、必要なタイプ、プライバシー クラス、サンプル ペイロード、および検証チェックリストを確認してください。
関連製品の機能
このワークフローを続行します SQL クエリ API
構造化イベント テーブルに対して読み取り専用 DataFusion SQL を実行し、結果を再利用します。
関連する SQL レシピ
その他のSQL例
このワークフローの構造化フィールドに対してクエリを実行し、結果の例を検査して、有用な回答をダッシュボードまたはアラートに変換します。
遅いデータベース クエリをフィンガープリントで検出する
調査するには十分なほど常に遅いデータベース操作はどれですか?
レシピを開くデータベースクエリを合計時間の影響でランク付けする
どのデータベース操作が最も累積リクエスト時間を消費しますか?
レシピを開くデータベース接続プールの飽和状態を測定する
どのアプリケーション プールが呼び出し元にデータベース接続を待たせていますか?
レシピを開くデータベース接続のタイムアウトとチャーンを測定する
どのサービスとリージョンが異常なデータベース接続のチャーンを示していますか?
レシピを開くデータベーストランザクションのロールバック率の計算
異常な割合のデータベース トランザクションをロールバックするサービスはどれですか?
レシピを開く長時間実行されるデータベース トランザクションの測定
どのアプリケーション トランザクション クラスが最も長く開いたままになりますか?
レシピを開くデータベースのロック待機とデッドロックの検索
最も深刻なロック競合を引き起こすデータベース操作はどれですか?
レシピを開くSQLSTATEとリリースによるデータベースエラーの分析
アプリケーションのリリース後に増加したデータベース エラー クラスはどれですか?
レシピを開くデータベースのレプリケーションと CDC ラグを測定する
どのレプリカまたは CDC コンシューマーがソース データベースに遅れをとっていますか?
レシピを開くリージョンごとにデータベース レプリカの古さを測定する
どのレプリカ リージョンが古い読み取りまたは失敗した読み取りを処理していますか?
レシピを開くデータベース移行の失敗をリリースごとに追跡する
失敗したデータベース移行またはロールバックされたデータベース移行はどのリリースに含まれていますか?
レシピを開く実装ファミリーごとに参照する
関連する統合パターンを比較する
この統合と組み合わせるテンプレート
さらなる統合
プリズマ ORM データベース Telemetry
生のクエリパラメータを収集せずに、Prisma 操作のフィンガープリント、モデルとメソッドのレイテンシー、失敗、結果数、リリース、データベース依存のワークフローを測定します。
オープンガイドMySQL クエリとプール Telemetry
生の SQL やパラメータを保存せずに、正規化された MySQL 操作、プール待機、トランザクション結果、制御されたエラー カテゴリを追跡し、リグレッションをリリースします。
オープンガイドMongoDB 操作 Telemetry
ドキュメントやクエリ値を収集せずに、名前付き MongoDB 操作、レイテンシ、結果数、再試行、トランザクション結果、リリース回帰を追跡します。
オープンガイド