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

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 时才丢弃事件)可能更适合您的需求。

You can edit this page on GitHub.