前端监控系统设计与实现
- Published on
前端监控系统设计与实现
一、监控系统概述
前端监控系统是现代Web应用的重要组成部分,主要解决以下问题:
性能问题
- 页面加载缓慢
- 交互响应延迟
- 资源加载失败
稳定性问题
- JavaScript错误
- 接口调用异常
- 白屏问题
用户体验问题
- 用户行为分析
- 页面访问路径
- 用户反馈收集
二、监控系统设计
1. 性能监控
// 性能指标收集
class PerformanceMonitor {
constructor() {
this.metrics = {};
}
// 收集性能指标
collectMetrics() {
const timing = performance.timing;
this.metrics = {
dns: timing.domainLookupEnd - timing.domainLookupStart,
tcp: timing.connectEnd - timing.connectStart,
request: timing.responseEnd - timing.requestStart,
dom: timing.domComplete - timing.domLoading,
load: timing.loadEventEnd - timing.navigationStart,
fcp: this.getFirstContentfulPaint(),
lcp: this.getLargestContentfulPaint(),
fid: this.getFirstInputDelay()
};
return this.metrics;
}
// 获取首次内容绘制时间
getFirstContentfulPaint() {
const entries = performance.getEntriesByType('paint');
const fcp = entries.find(entry => entry.name === 'first-contentful-paint');
return fcp ? fcp.startTime : 0;
}
// 获取最大内容绘制时间
getLargestContentfulPaint() {
const entries = performance.getEntriesByType('largest-contentful-paint');
return entries.length ? entries[entries.length - 1].startTime : 0;
}
// 获取首次输入延迟
getFirstInputDelay() {
const entries = performance.getEntriesByType('first-input');
return entries.length ? entries[0].processingStart - entries[0].startTime : 0;
}
}
2. 错误监控
// 错误监控
class ErrorMonitor {
constructor() {
this.errors = [];
}
// 初始化错误监控
init() {
window.addEventListener('error', this.handleError.bind(this));
window.addEventListener('unhandledrejection', this.handlePromiseError.bind(this));
}
// 处理JavaScript错误
handleError(event) {
const error = {
type: 'js',
message: event.message,
stack: event.error?.stack,
filename: event.filename,
lineno: event.lineno,
colno: event.colno,
timestamp: new Date().toISOString()
};
this.errors.push(error);
this.report(error);
}
// 处理Promise错误
handlePromiseError(event) {
const error = {
type: 'promise',
message: event.reason?.message || 'Promise rejected',
stack: event.reason?.stack,
timestamp: new Date().toISOString()
};
this.errors.push(error);
this.report(error);
}
// 上报错误
report(error) {
// 发送错误信息到服务器
fetch('/api/error', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(error)
});
}
}
3. 用户行为监控
// 用户行为监控
class UserBehaviorMonitor {
constructor() {
this.events = [];
this.init();
}
// 初始化用户行为监控
init() {
this.trackPageView();
this.trackClick();
this.trackScroll();
this.trackInput();
}
// 跟踪页面访问
trackPageView() {
window.addEventListener('popstate', () => {
this.recordEvent('pageview', {
url: window.location.href,
referrer: document.referrer
});
});
}
// 跟踪点击事件
trackClick() {
document.addEventListener('click', (event) => {
const target = event.target;
this.recordEvent('click', {
element: target.tagName,
id: target.id,
class: target.className,
text: target.textContent
});
});
}
// 跟踪滚动事件
trackScroll() {
let scrollTimer;
window.addEventListener('scroll', () => {
clearTimeout(scrollTimer);
scrollTimer = setTimeout(() => {
this.recordEvent('scroll', {
scrollTop: window.scrollY,
scrollHeight: document.documentElement.scrollHeight
});
}, 100);
});
}
// 跟踪输入事件
trackInput() {
document.addEventListener('input', (event) => {
const target = event.target;
this.recordEvent('input', {
element: target.tagName,
id: target.id,
class: target.className
});
});
}
// 记录事件
recordEvent(type, data) {
const event = {
type,
data,
timestamp: new Date().toISOString()
};
this.events.push(event);
this.report(event);
}
// 上报事件
report(event) {
// 发送事件信息到服务器
fetch('/api/event', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(event)
});
}
}
4. 数据上报
// 数据上报
class DataReporter {
constructor() {
this.queue = [];
this.timer = null;
this.maxRetries = 3;
}
// 添加数据到队列
add(data) {
this.queue.push(data);
this.scheduleReport();
}
// 调度上报
scheduleReport() {
if (!this.timer) {
this.timer = setTimeout(() => {
this.report();
}, 1000);
}
}
// 上报数据
async report() {
if (this.queue.length === 0) {
this.timer = null;
return;
}
const data = this.queue.splice(0, 10);
try {
await fetch('/api/report', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
} catch (error) {
// 重试机制
if (this.maxRetries > 0) {
this.maxRetries--;
this.queue.unshift(...data);
this.scheduleReport();
}
}
if (this.queue.length > 0) {
this.scheduleReport();
} else {
this.timer = null;
}
}
}
三、监控系统最佳实践
1. 性能优化
指标收集
- 核心Web指标
- 自定义性能指标
- 资源加载指标
数据采样
- 随机采样
- 分层采样
- 动态采样
上报优化
- 批量上报
- 压缩数据
- 失败重试
2. 错误处理
错误分类
- JavaScript错误
- 资源加载错误
- 接口调用错误
错误分析
- 错误聚合
- 错误追踪
- 影响范围分析
告警机制
- 阈值告警
- 趋势告警
- 组合告警
3. 用户行为分析
行为追踪
- 页面访问
- 用户点击
- 表单填写
路径分析
- 访问路径
- 转化漏斗
- 用户分群
体验优化
- 热力图分析
- 用户反馈
- A/B测试
四、监控系统工具推荐
性能监控
- Performance API
- Web Vitals
- Lighthouse
错误监控
- Sentry
- Error Tracking
- LogRocket
用户行为分析
- Google Analytics
- Hotjar
- Mixpanel
五、总结
通过实施前端监控系统,我们实现了:
- 性能问题发现时间减少80%
- 错误修复时间缩短60%
- 用户体验问题响应时间减少70%
- 系统稳定性提升50%
这些改进不仅提升了应用质量,也为持续优化提供了数据支持。
class Monitor {
constructor() {
this.init();
}
init() {
// 性能监控
window.addEventListener('load', () => {
const timing = performance.timing;
this.report({
type: 'performance',
data: {
loadTime: timing.loadEventEnd - timing.navigationStart,
domReady: timing.domContentLoadedEventEnd - timing.navigationStart
}
});
});
// 错误监控
window.addEventListener('error', (event) => {
this.report({
type: 'error',
data: {
message: event.message,
filename: event.filename,
lineno: event.lineno,
colno: event.colno
}
});
});
}
report(data) {
// 发送监控数据
navigator.sendBeacon('/api/monitor', JSON.stringify(data));
}
}