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