本文介绍如何在 laravel 项目中使用 sentry 时,通过客户端过滤的方式,减少重复事件的发送,从而有效控制 Sentry 的事件配额。我们将通过配置 before_send_transaction 选项,实现对特定 URL 的事务事件的过滤,避免不必要的事件上报。
在 Laravel 项目中使用 Sentry 能够帮助我们追踪和监控应用程序的错误和性能问题。然而,有时我们可能会遇到重复事件大量涌现的情况,导致 Sentry 的事件配额迅速耗尽。虽然 Sentry 提供了服务端限流功能,但并非所有订阅计划都支持。因此,在客户端进行事件过滤成为一种有效的解决方案。
Sentry 提供了 before_send 和 before_send_transaction 配置项,允许我们在事件发送到 Sentry 服务器之前对其进行修改或丢弃。before_send 用于过滤所有类型的事件,而 before_send_transaction 专门用于过滤事务事件。
以下是如何在 Laravel 项目中配置 before_send_transaction 来过滤特定 URL 的事务事件的步骤:
-
打开 config/sentry.php 文件。
该文件包含了 Sentry 的配置信息。如果你的项目中没有该文件,请确保已经正确安装并配置了 Sentry Laravel SDK。
-
配置 before_send_transaction 选项。
在 config/sentry.php 文件中,找到 before_send_transaction 选项。如果该选项不存在,则添加它。该选项接受一个闭包函数,该函数接收一个 SentryEvent 对象作为参数,并返回一个 SentryEvent 对象或 NULL。如果返回 null,则该事件将被丢弃,不会发送到 Sentry 服务器。
'before_send_transaction' => function ( SentryEvent $transaction ): ?SentryEvent { // 在这里添加你的过滤逻辑 return $transaction; },
-
添加过滤逻辑。
在 before_send_transaction 闭包函数中,添加你的过滤逻辑。以下是一个示例,该示例过滤了包含 _debugbar、monitoring 或 pleaseignoreme 的 URL 的事务事件:
'before_send_transaction' => function ( SentryEvent $transaction ): ?SentryEvent { $ignore = ['_debugbar', 'monitoring', 'pleaseignoreme']; $request = $transaction->getRequest(); if (isset($request['url'])) { $check = array_filter($ignore, function ($url) use ($request) { if (stripos($request['url'], $url) !== false) { return true; } }); if (count($check) > 0) { return null; } } return $transaction; },
代码解释:
- $ignore 数组包含了需要忽略的 URL 片段。
- $transaction->getRequest() 获取事务事件的请求信息。
- stripos($request[‘url’], $url) 检查请求 URL 是否包含 $ignore 数组中的任何一个字符串。stripos 函数是不区分大小写的。注意需要判断$request[‘url’]是否存在,否则会报错。
- 如果 URL 包含需要忽略的字符串,则 array_filter 返回一个非空数组,count($check) > 0 为真,函数返回 null,丢弃该事件。
- 否则,函数返回 $transaction,允许该事件发送到 Sentry 服务器。
-
测试你的配置。
确保你的过滤逻辑正常工作。你可以通过访问包含被过滤 URL 片段的页面,并检查 Sentry 控制台来验证事件是否被成功过滤。
注意事项:
- before_send 和 before_send_transaction 会影响所有事件的发送,因此请谨慎使用,确保不会意外地过滤掉重要的错误信息。
- 在生产环境中部署之前,务必充分测试你的过滤逻辑。
- 根据你的具体需求,调整 $ignore 数组中的 URL 片段。
- 除了 URL 过滤,你还可以使用 before_send 和 before_send_transaction 来过滤其他类型的事件,例如特定类型的异常或特定用户触发的事件。
总结:
通过配置 before_send_transaction 选项,我们可以在客户端过滤 Sentry Laravel 事件,从而有效控制事件配额,避免不必要的事件上报。这种方法特别适用于无法使用 Sentry 服务端限流功能的场景。 请记住,仔细测试您的配置以避免意外过滤掉重要信息。