我们有一个 Javascript (Angular/TypeScript) 应用程序,它使用 Sentry.io 进行错误报告。
如果发生抛出异常,全局错误处理程序会负责处理并向用户显示自定义模式,并带有文本区域,以便用户可以在那里留言。当他们单击提交按钮时,应将此消息发送给 Sentry(通过 Sentry.captureMessage(…))。
最近我们发现,如果 Sentry 无法访问,我们就不会收到这些消息,因为它是例如被广告拦截器浏览器插件拦截。
我们想做以下解决方案之一:
我们检查了
Sentry.captureMessage(…)
是否提供了任何帮助,因为它是发送 POST 请求的。但无论请求成功与否,它都会返回一个eventId。将 Sentry.captureMessage(…)
包装到 try/catch 中并没有帮助,因为当请求不成功时它不会抛出。
在
Sentry.captureMessage(…)
之后还有一个 Sentry.flush(…)
,但是返回 Promise<boolean>
,如果所有事件都已发送,则无论成功与否,都是 true
。
我们现在所做的是深入挖掘Sentry的内部结构,这并不意味着可以从外部使用。这里我们实现了一个方法,如果 Sentry 被阻止,则返回
true
,如果没有被阻止,则返回 false
。
public sentryIsBlocked() : boolean | null {
const client = Sentry.getCurrentHub().getClient();
// If there is no client, we can not check if sentry is reachable
if (!client) return null;
// This would be a TS error, because what we ask for is not public information.
// So we cast to any to work around that.
const numberOfNetworkSessionErrors = (client as any)['_outcomes']['network_error:session'];
return !!numberOfNetworkSessionErrors && numberOfNetworkSessionErrors > 0;
}
到目前为止它有效,但是......
是否有任何方法可以跟踪从
Sentry.captureMessage(…)
或 Sentry.captureException(…)
发送的 POST 请求是否返回错误?
Sentry 提供了一个通过您自己的后端传输数据的选项。以下是有关此内容的文档:https://docs.sentry.io/platforms/javascript/troubleshooting/#using-the-tunnel-option
通过这种方式,SDK 将数据发送到后端的端点。这是可行的,因为广告拦截器通常会列出哨兵的摄取端点。
以下是 NuGet Trends 应用程序上的隧道示例。使用端点 /t
在后端,如果您使用 Sentry for ASP.NET Core,您可以用 1 行添加它: https://github.com/dotnet/nuget-trends/blob/main/src/NuGetTrends.Web/Startup.cs#L120
app.UseSentryTunneling("/t");
以及客户端的配置:
tunnel: “/t”