事件指纹识别

了解如何在您的 SDK 中覆盖默认的指纹识别。

所有事件都有一个指纹。具有相同指纹的事件会被归类到同一个问题中。

默认情况下,Sentry 会运行我们内置的分组算法,根据事件中的信息(如 stacktraceexceptionmessage)生成指纹。为了扩展默认的分组行为或完全更改它,您可以使用以下选项的组合:

  1. 在您的 SDK 中使用 SDK 指纹识别,如下文所述
  2. 在您的项目中使用 指纹规则堆栈跟踪规则

在支持的 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;
  },
});