事件指纹识别
了解如何在您的 SDK 中覆盖默认的指纹识别。
所有事件都有一个指纹。具有相同指纹的事件会被归类到同一个问题中。
默认情况下,Sentry 会运行我们内置的分组算法,根据事件中的信息(如 stacktrace
、exception
和 message
)生成指纹。为了扩展默认的分组行为或完全更改它,您可以使用以下选项的组合:
在支持的 SDK 中,您可以通过传递指纹属性作为字符串数组来覆盖 Sentry 的默认分组行为。指纹数组的长度没有限制。这与 指纹规则功能 类似,该功能始终可用,并且可以实现类似的结果。
在最简单的情况下,值可以直接传递:
Copied
function makeRequest(method, path, options) {
return fetch(method, path, options).catch(function (err) {
Sentry.withScope(function (scope) {
// group errors together based on their request and response
scope.setFingerprint([method, path, String(err.statusCode)]);
Sentry.captureException(err);
});
});
}
您可以使用变量替换将动态值填充到通常由服务器计算的指纹中。例如,添加 {{ default }}
可以将整个正常生成的分组哈希添加到指纹中。这些变量与服务器端指纹识别中的变量相同。更多信息请参阅 变量。
在某些情况下,您希望更细粒度地分组错误。
例如,如果您的应用程序查询远程过程调用模型(RPC)接口或外部应用程序编程接口(API)服务,即使传出请求非常不同,堆栈跟踪通常是相同的。
以下示例将在 Sentry 默认创建的分组(由 {{ default }}
表示)基础上进一步细分,考虑错误对象的一些属性:
Copied
class MyRPCError extends Error {
constructor(message, functionName, errorCode) {
super(message);
// The name of the RPC function that was called (e.g. "getAllBlogArticles")
this.functionName = functionName;
// For example a HTTP status code returned by the server.
this.errorCode = errorCode;
}
}
Sentry.init({
// ...
beforeSend: function (event, hint) {
const exception = hint.originalException;
if (exception instanceof MyRPCError) {
event.fingerprint = [
"{{ default }}",
String(exception.functionName),
String(exception.errorCode),
];
}
return event;
},
});
您也可以完全覆盖 Sentry 的分组行为。
例如,对于通用错误(如数据库连接错误),如果有许多不同的堆栈跟踪且从不将它们分组在一起,可以通过从数组中省略 {{ default }}
来覆盖 Sentry 的分组行为:
Copied
class DatabaseConnectionError extends Error {}
Sentry.init({
// ...
beforeSend: function (event, hint) {
const exception = hint.originalException;
if (exception instanceof DatabaseConnectionError) {
event.fingerprint = ["database-connection-error"];
}
return event;
},
});