

使用浏览器的 Reporting API 上报站点错误
source link: https://mp.weixin.qq.com/s?__biz=Mzg2NDAzMjE5NQ%3D%3D&%3Bmid=2247487125&%3Bidx=1&%3Bsn=bba64ef294bfef1b2e518ded27e49af2
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

文末有福利
Reporting API
定义了一个新的 HTTP Header
, Report-To
,它让 Web
开发人员以自定义的方式来将浏览器的警告和错误发送到指定服务器。例如 CSP违规, Feature Policy
违规,使用了废弃API,浏览器崩溃和网络错误等是可以使用 Reporting API
收集的一些信息。
简介
有些错误你可能在开发的时候永远都看不到,但是生产环境中可能出现,因为不同的用户、不同的使用环境、不同的浏览器都有可能出现意想不到的问题。
例如,假设你的新站点依赖 document.write()
来加载关键脚本。来自世界各地的新用户要访问你的站点,但是他们使用的连接可能比你的测试环境要慢得多。你所不知道的是,你的网站开始为他们中断,因为 Chrome
浏览器干涉阻止2G网络上的 document.write()
。如果没有 Reporting API
,就无法知道你宝贵的用户是否发生了这种情况。
Reporting API
可帮助捕获整个站点中潜在的错误。进行设置可让你对你的网站更放心,当真实用户访问你的网站时,没有发生任何可怕的事情。如果当他们确实遇到无法预料的错误时,你会知道的。
Report-To Header
Reporting API
定义了一个新的 HTTP Header
,它的值是一个对象,它描述了浏览器要向以下对象报告错误的信息:
Report-To: { "max_age": 10886400, "endpoints": [{ "url": "https://analytics.provider.com/browser-errors" }] }
注意:如果你的 endpoints URL 与你的站点位于不同的来源,则 endpoints 应支持CORS 请求。(例如Access-Control-Allow-Origin: *; Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS; Access-Control-Allow-Headers: Content-Type, Authorization, Content-Length, X-Requested-With
配置多个端点
单个响应可以通过发送多个 Report-To
标头来一次配置多个端点:
Report-To: { "group": "default", "max_age": 10886400, "endpoints": [{ "url": "https://example.com/browser-reports" }] } Report-To: { "group": "csp-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://example.com/csp-reports" }] }
或将它们组合成一个HTTP标头:
Report-To: { "group": "csp-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://example.com/csp-reports" }] }, { "group": "network-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://example.com/network-errors" }] }, { "max_age": 10886400, "endpoints": [{ "url": "https://example.com/browser-errors" }] }
发送 Report-To
标头后,浏览器将根据端点的 max_age
值缓存端点,并将所有这些讨厌的控制台警告/错误发送到你的URL。
字段说明
-
group:(选填)上报端点名称,如果
group
未指定名称,则为上报端点指定名称default
。 -
max_age:(必填)一个非负整数,以秒为单位定义上报端点的生存期。
-
endpoints:(必填)JSON对象数组,用于指定报告收集器的实际URL。
-
include_subdomains:(选填)指定在报告错误时是否考虑子域。
浏览器如何发送报告
浏览器会定期批处理报告,并将其发送到你配置的报告URL。为了发送报告,浏览器发出一个POST 请求, Content-Type: application/reports+json
并带有一个正文,其中包含捕获的警告/错误数组。
下面是一个CSP报告的示例:
POST /csp-reports HTTP/1.1 Host: example.com Content-Type: application/reports+json [{ "type": "csp", "age": 10, "url": "https://example.com/vulnerable-page/", "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0", "body": { "blocked": "https://evil.com/evil.js", "directive": "script-src", "policy": "script-src 'self'; object-src 'none'", "status": 200, "referrer": "https://evil.com/" } }, } ... }]
Reporting API
旨在与你的Web应用配合使用。浏览器捕获,排队和批处理,然后在最合适的时间自动发送报告。报告是由浏览器在内部发送的,因此使用 Reporting API
时几乎没有性能问题(例如与应用程序发生网络争用)。也没有办法控制浏览器何时发送排队的报告。
上报 CSP
在以前,我们可以给 CSP 增加一个 report-uri
来上报问题:
Content-Security-Policy: ...; report-uri https://example.com/csp-reports Content-Security-Policy-Report-Only: ...; report-uri https://example.com/csp-report
下面是一个使用 Report-To
上报 CSP
问题的例子:
Content-Security-Policy-Report-Only: ...; report-to csp-endpoint Report-To: { ... }, { "group": "csp-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://example.com/csp-reports" }] }
为了向后兼容,请与 report-uri 一起继续使用 report-to。换句话说:Content-Security-Policy: ...; report-uri https://example.com/csp-reports; report-to groupname。支持的浏览器 report-to 将使用它代替report-uri。
上报网络错误
网络错误日志(NEL)规范定义了一种从源头收集客户端网络错误的机制。它使用新的 NEL HTTP
响应头来设置,告诉浏览器收集网络错误,然后与 Reporting API
集成,将错误报告给服务器。
要使用 NEL
,首先使用一个使用命名组的收集器设置报告头:
Report-To: { ... }, { "group": "network-errors", "max_age": 2592000, "endpoints": [{ "url": "https://analytics.provider.com/networkerrors" }] }
接下来,发送NEL响应头以开始收集错误。
GET /index.html HTTP/1.1 NEL: {"report_to": "network-errors", "max_age": 2592000}
ReportingObserver
ReportingObserver
和 Report-To
报头具有类似但略微不同的用途。
ReportingObserver
是一个 JavaScript API
,可以观察到简单的客户端警告,例如弃用和干预。报表不会自动发送到服务器(除非你在回调中触发):
const observer = new ReportingObserver((reports, observer) => { for (const report of reports) { // Send report somewhere. } }, {buffered: true}); observer.observe();
更敏感的错误类型,如CSP违规和网络错误不能被 ReportingObserver
观察到。
Report-To
更加强大,因为它可以捕获更多类型的错误报告(网络,CSP,浏览器崩溃),除了 ReportingObserver
支持的那些。当你想要自动向服务器报告错误或捕获在 JavaScript
中不可能看到的错误(网络错误)时,可以使用它。
总结
Reporting API
无疑是做端监控同学的福音,它省去了我们很多需要在前端监控中需要自己做的工作,未来浏览器还会将更多的上报类型应用到 Reporting API
,未来将会作为诊断网站问题的重点工具。
福利
给大家送一本最近很火的图灵出的《了不起的程序员》日历,老规矩在看抽奖,右下角轻轻点下在看就能参与,我会在后台随机抽一位包邮送出。
Recommend
-
82
京东 - @YvesX - **白条是否确定要上征信了?**> **是的**,目前已经启动征信接入的相关工作,待正式接入后,我们会按照人民银行的相关要求如实上报。( https://jrhelp.jd.com/sho
-
57
iOS App 连续闪退时如何上报 crash 日志
-
56
概述 对于后台开发来说,记录日志是一种非常常见的开发习惯,通常我们会使用try...catch代码块来主动捕获错误、对于每次接口调用,也会记录下每次接口调用的时间消耗,以便我们监控服务器接口性能,进行问题排查。 刚进公司时,在进行Node.js的接口开发时,我
-
59
最近在研究前端异常监控的问题,对查询的资料做了整理汇总,总体如下 一、前端异常监控方式 1. window.onerror 异常处理 window.onerror 无论是异步还是非异步错误,onerror 都能捕获到运行时错误。 window.onerror
-
35
-
20
脚本错误量极致优化-监控上报与Script error #13 joeyguo opened this...
-
6
详解JavaScript错误捕获和上报流程广发证券 技术工程师怎么捕获错误并且处理,是一门语言必备的知识。在JavaScript中也是如此。那怎么捕获错误呢?初看好像很简单,try-cat...
-
10
前端错误监控系统服务端其实线上已经有很多监控系统了,例如fundebug。试用了一下还是挺不错的。可惜都是收费的,免费的只能创建一个项目,收费也不便宜。对于一些小公司来说很难花钱去搞,而且...
-
5
17:12 隐私浏览器Brave研究员:大多数DeFi站点存在隐私安全隐患 隐私浏览器Brave的安全研究员Philipp Winter、Anna Harbluk Lorime、Peter Snyder、Benjamin Livshits发布了关于Web 3.0中的隐私和安全问题的研究。研...
-
7
WordPress致命错误:登录站点后台安装插件主题遇到错误怎么解决? 2021年9月2日最近Dropbox API停止使用长期访问令牌。 为了符合这些新的变化...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK