本文介紹如何在 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 服務端限流功能的場景。 請記住,仔細測試您的配置以避免意外過濾掉重要信息。