使用 before_send 過濾 Laravel Sentry 事件

使用 before_send 過濾 Laravel Sentry 事件

本文介紹如何在 laravel 項目中使用 sentry 的 before_send 選項,通過客戶端過濾事件,從而減少重復事件的發送,有效控制事件配額。通過示例代碼,詳細講解如何在 config/sentry.php 中配置 before_send_transaction 函數,實現根據 URL 過濾 Sentry 事務。

Sentry 是一個強大的錯誤追蹤和性能監控平臺,但在高流量的應用中,可能會產生大量的事件,從而快速消耗事件配額。如果你的 Sentry 計劃不支持服務端限流,客戶端過濾事件就成為一個重要的優化手段。before_send 選項允許你在事件發送到 Sentry 之前對其進行檢查和修改,甚至完全丟棄。

配置 before_send_transaction

before_send_transaction 是一個配置選項,允許你在事務發送到 Sentry 之前對其進行攔截和處理。它接收一個 SentryEvent 對象作為參數,并返回一個 SentryEvent 對象或 NULL。如果返回 null,則該事件將被丟棄,不會發送到 Sentry。

要配置 before_send_transaction,你需要修改 config/sentry.php 文件。在該文件中,找到 ‘before_send_transaction’ 選項,并將其設置為一個閉包函數。

'before_send_transaction' => function (     SentryEvent $transaction ): ?SentryEvent {     // 在這里編寫你的過濾邏輯     return $transaction; // 或者 return null; },

示例:根據 URL 過濾事務

以下示例展示了如何根據 URL 過濾 Sentry 事務。假設你希望忽略所有包含 _debugbar、monitoring 或 pleaseignoreme 的 URL 的事務。

'before_send_transaction' => function (     SentryEvent $transaction ): ?SentryEvent {     $ignore = ['_debugbar', 'monitoring', 'pleaseignoreme'];     $request = $transaction->getRequest();      // 確保 $request 不為空,否則訪問 ['url'] 會報錯     if (!empty($request) && 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; },

代碼解釋:

  1. $ignore 數組包含了需要忽略的 URL 片段。
  2. $transaction->getRequest() 獲取事務的請求信息。
  3. array_filter 函數遍歷 $ignore 數組,并使用 stripos 函數檢查請求 URL 是否包含任何需要忽略的片段。
  4. 如果找到任何需要忽略的片段,則返回 null,丟棄該事務。
  5. 否則,返回原始的 $transaction 對象,允許該事務發送到 Sentry。

注意事項:

  • 在檢查 $request[‘url’] 之前,務必確保 $request 不為空,并使用 isset() 檢查 ‘url’ 鍵是否存在,避免出現 undefined index: url 錯誤。
  • stripos 函數執行不區分大小寫的搜索。如果你需要區分大小寫,可以使用 strpos 函數。

其他過濾策略

除了根據 URL 過濾事務,你還可以使用 before_send 選項實現其他各種過濾策略,例如:

  • 根據用戶 ID 過濾: 忽略特定用戶的事件。
  • 根據錯誤類型過濾: 忽略特定類型的錯誤,例如 404 錯誤。
  • 根據環境過濾: 只在生產環境中發送特定類型的事件。
  • 根據事件重復率過濾: 記錄一段時間內同一事件的出現次數,超過閾值則丟棄。 (需要結合緩存或數據庫實現)

總結

before_send 選項提供了一種強大的方式來控制發送到 Sentry 的事件,從而減少重復事件的發送,有效控制事件配額。通過合理配置 before_send_transaction 函數,你可以根據 URL、用戶 ID、錯誤類型等多種條件過濾事件,從而更好地管理你的 Sentry 數據。記住,在實施任何過濾策略之前,請仔細評估其對錯誤追蹤和性能監控的影響。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享