3、数据采集与埋点:如何设计兼容性相关的数据埋点?前端错误监控(Sentry、Fundebug)。后端日志采集与分析。
好,咱们进入第三章。这一章我打算聊聊数据采集和埋点。说白了,就是怎么知道你的软件在用户那边到底跑得怎么样。
很多团队做兼容性测试,测完了就完了。上线后用户报错,才手忙脚乱去查。我个人习惯是,把监控前置。上线第一天,我就得知道哪些浏览器在报错,哪些机型在崩溃。这才是数据驱动的兼容性管理。
3.1 兼容性埋点的核心思路
埋点不是乱埋的。你得想清楚,我要收集什么信息,才能定位兼容性问题。
我一般把兼容性埋点分成三类:
- 环境信息:浏览器型号、版本、操作系统、设备型号、屏幕分辨率、网络类型。
- 行为信息:用户操作了什么?点击了哪个按钮?进入了哪个页面?
- 异常信息:JS报错、资源加载失败、API请求超时、白屏。
这三类信息缺一不可。你想想看,光知道用户报错了,不知道他用的是Chrome还是IE,那排查起来就像大海捞针。
核心原则:埋点数据要能回答三个问题——谁(环境)?做了什么(行为)?出了什么问题(异常)?
3.2 前端错误监控:Sentry 与 Fundebug
前端监控工具,我用得最多的是 Sentry。开源、功能强、社区活跃。Fundebug 我也用过,它对小团队很友好,开箱即用。
先说说 Sentry 怎么接入。其实很简单,几行代码的事。
// 安装
// npm install @sentry/browser
import * as Sentry from '@sentry/browser';
Sentry.init({
dsn: 'https://你的DSN密钥@oXXXX.ingest.sentry.io/XXXX',
environment: 'production',
release: 'v1.0.0',
// 重点:采集浏览器信息
beforeSend(event) {
// 这里可以自定义添加环境信息
event.extra = {
...event.extra,
userAgent: navigator.userAgent,
screenWidth: window.screen.width,
screenHeight: window.screen.height,
language: navigator.language,
};
return event;
}
});
嗯,这里要注意。Sentry 默认会采集一些环境信息,但不够全。我习惯在 beforeSend 里手动补充。比如屏幕分辨率,有时候兼容性问题就出在分辨率适配上。
Fundebug 的接入更傻瓜化:
// 在 HTML 头部引入
<script src="https://js.fundebug.cn/fundebug.1.10.0.min.js"></script>
<script>
Fundebug.init({
apikey: "你的API密钥",
// 自动采集用户行为
silentVideo: false, // 录屏功能,调试神器
});
</script>
我的经验:Sentry 适合中大型团队,可以自建服务。Fundebug 适合快速验证,录屏功能对复现兼容性问题特别有用。我在一个移动端项目里,就是靠 Fundebug 的录屏,发现某款国产浏览器在渲染 flex 布局时出现了偏移。
3.3 后端日志采集与分析
前端报错只是冰山一角。很多兼容性问题,根源在后端。比如某个老版本浏览器发送的请求头格式不对,导致后端解析失败。
后端日志采集,我推荐结构化日志。别再用 console.log 了,用 JSON 格式输出,方便后续分析。
// Node.js 示例:使用 winston 输出结构化日志
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.json(),
defaultMeta: { service: 'user-service' },
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
],
});
// 记录兼容性相关错误
logger.error('API 请求解析失败', {
userAgent: req.headers['user-agent'],
requestBody: req.body,
errorCode: 'PARSE_ERROR',
browserVersion: extractBrowserVersion(req.headers['user-agent']),
});
为什么要记录 User-Agent?因为你可以通过它反推浏览器版本。我曾经遇到过一个 case,某个接口在 iOS 14 以下的 Safari 上总是报 400 错误。查了日志才发现,是旧版 Safari 发送的 Content-Type 格式不规范。
3.4 知识体系与核心逻辑
说了这么多,我画了一张图,帮你理清整个数据采集的脉络。
这张图展示了从数据源到采集工具,再到最终分析的完整链路。说白了,就是先搞清楚要采集什么,再选合适的工具,最后把数据汇总起来做分析。
3.5 避坑指南
我曾经踩过的坑:
- 埋点太多影响性能:有一次我在每个页面都埋了十几个点,结果页面加载慢了 300ms。后来我改成异步上报,只在关键路径埋点。
- 忽略隐私合规:采集 User-Agent 没问题,但别采集用户的个人身份信息。GDPR 和《个人信息保护法》可不是闹着玩的。
- 日志没有分级:所有日志都打
error级别,结果真正严重的错误被淹没了。我建议至少分info、warn、error三级。
3.6 小结
数据采集是兼容性管理的眼睛。没有数据,你就是在黑暗中摸索。前端用 Sentry 或 Fundebug 做错误监控,后端用结构化日志做分析。两者结合,才能形成完整的兼容性视图。
记住一句话:埋点不是目的,分析才是。数据采回来了,得有人看,有人分析,有人推动改进。否则,再漂亮的埋点方案也只是摆设。
公众号:蓝海资料掘金营,微信deep3321