本文旨在幫助 laravel 開發者在使用 sentry 進行錯誤監控時,通過客戶端過濾事件,有效控制事件發送量,避免重復事件的堆積,從而節省 Sentry 事件配額。我們將探討如何利用 before_send_transaction 選項,根據請求 URL 過濾不需要的事件,從而實現更精細化的事件管理。
利用 before_send_transaction 過濾事件
Sentry 提供了 before_send 和 before_send_transaction 選項,允許開發者在事件發送到 Sentry 服務器之前對其進行攔截和修改。 我們可以利用 before_send_transaction 選項,根據事件的上下文信息,決定是否發送該事件。
以下是一個示例,展示如何在 config/sentry.php 文件中配置 before_send_transaction,根據請求 URL 過濾事件:
'before_send_transaction' => function ( SentryEvent $transaction ): ?SentryEvent { $ignore = ['_debugbar', 'monitoring', 'pleaseignoreme']; $request = $transaction->getRequest(); $check = array_filter($ignore, function ($url) use ($request) { if (stripos($request['url'], $url) !== false) { return true; } }); if (count($check) > 0) { return NULL; } return $transaction; },
代碼解釋:
-
‘before_send_transaction’ => function (SentryEvent $transaction): ?SentryEvent { … }: 定義一個閉包函數,該函數會在每個事務事件發送之前被調用。它接收一個 $transaction 對象作為參數,該對象包含了事件的所有信息。函數的返回值決定了事件是否會被發送:
- 如果返回 $transaction 對象,則事件會被發送。
- 如果返回 null,則事件會被丟棄。
-
$ignore = [‘_debugbar’, ‘monitoring’, ‘pleaseignoreme’];: 定義一個數組 $ignore,其中包含了需要忽略的 URL 片段。 例如,_debugbar 用于過濾 Laravel Debugbar 相關的請求,monitoring 和 pleaseignoreme 可以根據實際需要添加。
-
$request = $transaction->getRequest();: 從 $transaction 對象中獲取請求信息。
-
$check = array_filter($ignore, function ($url) use ($request) { … });: 使用 array_filter 函數遍歷 $ignore 數組,并對每個 URL 片段執行一個匿名函數。
-
if (stripos($request[‘url’], $url) !== false) { return true; }: 匿名函數使用 stripos 函數檢查請求 URL 中是否包含當前 URL 片段。 如果包含(即 stripos 返回值不為 false),則返回 true,表示該 URL 片段需要被忽略。
-
if (count($check) > 0) { return null; }: 如果 $check 數組的元素個數大于 0,說明請求 URL 中包含需要忽略的 URL 片段,此時返回 null,丟棄該事件。
-
return $transaction;: 如果請求 URL 中不包含需要忽略的 URL 片段,則返回 $transaction 對象,允許發送該事件。
注意事項
-
性能影響: 客戶端過濾事件會增加一定的性能開銷,尤其是在高流量的場景下。 需要仔細評估過濾規則的復雜度和事件量,確保不會對應用性能產生顯著影響。
-
過濾規則的維護: $ignore 數組中的 URL 片段需要根據實際情況進行維護。 建議將這些配置項放在配置文件中,方便修改和管理。
-
測試: 在生產環境部署之前,務必對過濾規則進行充分的測試,確保不會誤過濾重要的事件。
總結
通過使用 before_send_transaction 選項,我們可以靈活地控制 Sentry 事件的發送,避免不必要的事件堆積,從而節省 Sentry 事件配額。 在實際應用中,可以根據具體的需求,定制更復雜的過濾規則,例如根據事件類型、錯誤級別、用戶 ID 等信息進行過濾。 合理地利用客戶端過濾,可以有效地優化 Sentry 的使用,提高錯誤監控的效率。