获取更多动态,关注公众号:黑客下午茶

Filtering and Sampling Events

将 Sentry 添加到你的应用中能够为你提供大量关于错误和性能的非常有价值的信息。大量的信息是有益的——只要这些信息是正确的,数量合理。

Sentry SDK 提供了多个配置选项来帮助您控制这一点,使您既可以过滤掉不需要的事件,又可以从中获取代表性的样本。

Note:: Sentry UI 还提供了使用 Inbound Filters 筛选事件的方法。 不过,我们建议您在客户端级别进行过滤,因为这样可以消除发送您实际上不需要的事件的开销。

Filtering Error Events

使用 beforeSend 回调方法并配置,启用或禁用 integrations,将您的 SDK 配置为过滤错误事件。

Using beforeSend

所有 Sentry SDK 都支持 beforeSend 回调方法。在事件发送到服务器之前立即调用 beforeSend,因此这是您可以编辑其数据的最终位置。它接收事件对象作为参数,因此您可以根据自定义逻辑和事件上可用的数据,使用它来修改事件的数据或完全删除(通过返回 null)。

Copied
Sentry.init({
  // ...

  beforeSend(event, hint) {
    const error = hint.originalException;
    if (
      error &&
      error.message &&
      error.message.match(/database unavailable/i)
    ) {
      event.fingerprint = ["database-unavailable"];
    }
    return event;
  },
});

有关可用提示的信息,请参见 hints in JavaScript

还要注意,面包屑(breadcrumbs)可以过滤,如 our Breadcrumbs documentation 所述。

Event Hints

before-send 回调函数同时传递了 event 和第二个参数 hint,它包含一个或多个提示。

通常,hint 保存原始异常,以便提取额外数据或影响分组。在本例中,如果捕获了某种类型的异常,则强制将指纹(fingerprint)转换为普通值:

Copied
Sentry.init({
  // ...

  beforeSend(event, hint) {
    const error = hint.originalException;
    if (
      error &&
      error.message &&
      error.message.match(/database unavailable/i)
    ) {
      event.fingerprint = ["database-unavailable"];
    }
    return event;
  },
});

有关可用提示的信息,请参见 hints in JavaScript

当 SDK 为传输创建一个事件或面包屑(breadcrumb)时,该传输通常是从某种源对象创建的。例如,错误事件通常是从日志记录或异常实例创建的。为了更好地定制,SDK 将这些对象发送给特定的回调( beforeSendbeforeBreadcrumb 或 SDK 中的事件处理器系统)。

Using Hints

Hints 在两个地方可用:

  1. beforeSend / beforeBreadcrumb
  2. eventProcessors

Event 和 breadcrumb 的 hints 是包含用于将事件或面包屑组合在一起的各种信息的对象。通常,hints 保留原始异常,以便可以提取其他数据或影响分组。

对于事件,例如 event_idoriginalExceptionsyntheticException(在内部用于生成更清晰的堆栈跟踪),以及您附加的任何其他任意的 data

对于面包屑,hints 的使用取决于实现。对于 XHR 请求,hint 包含 xhr 对象本身。对于用户交互,hint 包含 DOM 元素和事件名称等。

在此示例中,如果捕获到某种类型的异常,则将指纹(fingerprint)强制为一个公共值:

Copied
Sentry.init({
  // ...

  beforeSend(event, hint) {
    const error = hint.originalException;
    if (
      error &&
      error.message &&
      error.message.match(/database unavailable/i)
    ) {
      event.fingerprint = ["database-unavailable"];
    }
    return event;
  },
});

Hints for Events

originalException
导致 Sentry SDK 创建事件的原始异常。这对于更改 Sentry SDK 对事件进行分组或提取额外信息的方式非常有用。

syntheticException
当引发字符串或非错误(non-error)对象时,Sentry 将创建综合异常,以便您可以获得基本的堆栈跟踪。此异常存储在此处以进一步提取数据。

Hints for Breadcrumbs

event
对于通过浏览器事件创建的面包屑,Sentry SDK 通常将事件作为 hint 提供给面包屑。 例如,这可用于将目标 DOM 元素中的数据提取到面包屑中。

level / input
对于从控制台日志截取创建的面包屑。这将保留原始控制台日志级别和日志功能的原始输入数据。

response / input
用于从 HTTP 请求创建的面包屑。这保存了响应对象(来自 fetch API)和 fetch 函数的输入参数。

request / response / event
用于从 HTTP 请求创建的面包屑。它保存了请求和响应对象(来自节点 HTTP API)以及节点事件(responseerror)。

xhr
对于通过旧版 XMLHttpRequest API 通过 HTTP 请求创建的面包屑。这将保留原始的 xhr 对象。

Decluttering Sentry

您可以构造允许的域列表,这可能会引发可接受的异常。例如,如果您的脚本是从 cdn.example.com 加载的,而您的站点是 example.com,则可以将 allowUrls 设置为:

如果您想永远阻止特定的 URL,也可以使用 denyUrls

此外,我们的社区已为日常工作(例如 Facebook,Chrome 扩展程序等)编制了常见的忽略规则列表。建议您检查一下这些内容,看看它们是否适用于您,这很有用。Here is the original gist。这不是我们 SDK 的默认值;这只是一个广泛示例的亮点。

Copied
Sentry.init({
  ignoreErrors: [
    // Random plugins/extensions
    "top.GLOBALS",
    // See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error.html
    "originalCreateNotification",
    "canvas.contentDocument",
    "MyApp_RemoveAllHighlights",
    "http://tt.epicplay.com",
    "Can't find variable: ZiteReader",
    "jigsaw is not defined",
    "ComboSearch is not defined",
    "http://loading.retry.widdit.com/",
    "atomicFindClose",
    // Facebook borked
    "fb_xd_fragment",
    // ISP "optimizing" proxy - `Cache-Control: no-transform` seems to
    // reduce this. (thanks @acdha)
    // See http://stackoverflow.com/questions/4113268
    "bmi_SafeAddOnload",
    "EBCallBackMessageReceived",
    // See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx
    "conduitPage",
  ],
  denyUrls: [
    // Facebook flakiness
    /graph\.facebook\.com/i,
    // Facebook blocked
    /connect\.facebook\.net\/en_US\/all\.js/i,
    // Woopra flakiness
    /eatdifferent\.com\.woopra-ns\.com/i,
    /static\.woopra\.com\/js\/woopra\.js/i,
    // Chrome extensions
    /extensions\//i,
    /^chrome:\/\//i,
    // Other plugins
    /127\.0\.0\.1:4001\/isrunning/i, // Cacaoweb
    /webappstoolbarba\.texthelp\.com\//i,
    /metrics\.itunes\.apple\.com\.edgesuite\.net\//i,
  ],
});

Sampling Error Events

要将错误的代表性样本发送到 Sentry,请在 SDK 配置中将 sampleRate 选项设置为介于 0(已发送错误的0%)和 1(已发送错误的100%)之间的数字。这是一个静态比率,将同样适用于所有错误。例如,要抽样25%的错误:

Copied
Sentry.init({ sampleRate: 0.25 });

Note: 误差采样率不是动态的。更改它需要重新部署。此外,设置 SDK 采样率会限制事件源的可见性。为项目设置速率限制(仅在高 volume 时才丢弃事件)可能更适合您的需求。

Filtering Transaction Events

为了防止某些事务被报告给 Sentry,可以使用 tracesSampler 配置选项,该选项允许您提供一个函数来评估当前事务,并在它不是您想要的事务时删除它。(它还允许您以不同的速率对不同的事务进行采样。)

Note: tracesSamplertracesSampleRate 配置选项是互斥的。如果您定义了一个 tracesSampler 来过滤掉某些事务,那么您还必须通过返回您希望它们被采样的速率来处理未过滤的事务。

最简单的形式(仅用于过滤)如下所示:

Copied
Sentry.init({
  // ...

  tracesSampler: samplingContext => {
    if ("...") {
      // Drop this transaction, by setting its sample rate to 0%
      return 0;
    } else {
      // Default sample rate for all others (replaces tracesSampleRate)
      return 0.1;
    }
  };
});

要了解有关 tracesSampler 选项的更多信息,请参阅SDK的 performance docs

Sampling Transaction Events

对于 Sentry 的性能监控,我们建议抽样您的数据,有两个原因。首先,尽管捕获单个跟踪涉及的开销最小,但捕获每个页面加载或每个 API 请求的跟踪都有可能向系统添加不希望的负载。其次,启用抽样允许您更好地管理发送到 Sentry 的事件数量,这样您就可以根据组织的需要调整您的数量。

在选择采样率时,目标不是收集太多数据,而是收集足够的数据,以便得出有意义的结论。如果您不确定选择什么速率,那么从一个较低的值开始,随着您对流量模式和 volume 了解的更多,逐渐增加它,直到您找到了一个平衡性能和流量与数据准确性的速率。

要对事务进行取样,可以将 tracesSampleRate 配置选项设置为 0(发送的事务的 0%)到 1(发送的事务的100%)之间的一个数字,或者将 tracesSampler 选项设置为一个函数,该函数将返回这个数字,该数字随事务的不同而变化。

例如,将 tracesSampleRate 选项设置为 0.2 将导致 SDK 只发送 20% 的可能事务事件:

Copied
Sentry.init({
  // ...

  tracesSampleRate: 0.2,
});

或者,你可以提供一个 tracesSampler 函数,以不同的速率采样不同的事务:

Copied
Sentry.init({
  // ...

  tracesSampler: samplingContext => {
    // Examine provided context data (including parent decision, if any) along
    // with anything in the global namespace to compute the sample rate or
    // sampling decision for this transaction

    if ("...") {
      // These are important - take a big sample
      return 0.5;
    } else if ("...") {
      // These are less important or happen much more frequently - only take 1%
      return 0.01;
    } else if ("...") {
      // These aren't something worth tracking - drop all transactions like this
      return 0;
    } else {
      // Default sample rate
      return 0.1;
    }
  };
});

要了解更多关于 tracesSampler 选项的信息,请查看SDK的 performance docs

You can edit this page on GitHub.