本文介紹如何在 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; },
代碼解釋:
- $ignore 數組包含了需要忽略的 URL 片段。
- $transaction->getRequest() 獲取事務的請求信息。
- array_filter 函數遍歷 $ignore 數組,并使用 stripos 函數檢查請求 URL 是否包含任何需要忽略的片段。
- 如果找到任何需要忽略的片段,則返回 null,丟棄該事務。
- 否則,返回原始的 $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 數據。記住,在實施任何過濾策略之前,請仔細評估其對錯誤追蹤和性能監控的影響。