エラーメッセージに一意のID(ユーザーID、UUID、メールアドレスなど)が含まれていると、Datadogのログアラートでグループ化した際に別々のエラーとして扱われてしまう。これを解決するため、エラーメッセージ内の動的な値をプレースホルダーに置換して正規化する。
正規化の実装例(TypeScript):
private normalizeErrorMessage(message: string): string {
return (
message
// UUID
.replace(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi, '{uuid}')
// account_123, user_456 などのID
.replace(/\b(account|user|tenant|contact|deal|activity|file)_[a-zA-Z0-9]+\b/gi, '{$1_id}')
// id: 123 などのパターン
.replace(/\bid[:\s]+\d+\b/gi, 'id: {id}')
.replace(/\bwith id\s+[a-zA-Z0-9_-]+/gi, 'with id {id}')
.replace(/\brecordId[:\s]+[a-zA-Z0-9_-]+/gi, 'recordId: {id}')
// メールアドレス
.replace(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi, '{email}')
// 日付
.replace(/\b\d{4}-\d{2}-\d{2}\b/g, '{date}')
);
}
ログ出力時は正規化されたメッセージと元のメッセージの両方を保存:
const logContext = {
error: {
message: normalizedMessage, // アラートのグループ化に使用
message_original: exception.message, // デバッグ用
},
};
Datadogのログアラートクエリでは、正規化された @error.message でグループ化:
logs("service:crm-api @http.status_code:[500 TO 599]")
.by("@http.url_details.path,@req.method,@http.status_code,@error.kind,@error.message")