检测 Sentry.captureMessage(…) 或 Sentry.captureException(…) 是否在 JavaScript 应用程序中被阻止(例如,被广告拦截器阻止)

问题描述 投票:0回答:1

设置

我们有一个 Javascript (Angular/TypeScript) 应用程序,它使用 Sentry.io 进行错误报告。

如果发生抛出异常,全局错误处理程序会负责处理并向用户显示自定义模式,并带有文本区域,以便用户可以在那里留言。当他们单击提交按钮时,应将此消息发送给 Sentry(通过 Sentry.captureMessage(…))。

问题

最近我们发现,如果 Sentry 无法访问,我们就不会收到这些消息,因为它是例如被广告拦截器浏览器插件拦截。

目标

我们想做以下解决方案之一:

  • 如果 Sentry 有任何问题,只需指示用户如何获得支持,而不是提供通过 Sentry 向我们发送消息的可能性。
  • 提供通过 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 更新都可能会破坏它,因为我们使用的对象不属于 Sentry 公共 API。
  • 我们在这里说的是,如果过去对 Sentry 的任何请求有问题,但这并不一定意味着当前请求不会通过。

问题

是否有任何方法可以跟踪从

Sentry.captureMessage(…)
Sentry.captureException(…)
发送的 POST 请求是否返回错误?

typescript xmlhttprequest sentry http-error adblock
1个回答
0
投票

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”

https://github.com/dotnet/nuget-trends/blob/main/src/NuGetTrends.Web/Portal/src/app/app.module.ts#L22

© www.soinside.com 2019 - 2024. All rights reserved.