一个轻量级、模块化的前端监控 SDK,用于跟踪错误、性能和用户行为。
- 核心监控框架,采用插件化架构
- 错误监控
- JS 错误捕获
- 资源加载错误
- API 请求错误
- 框架特定错误
- 性能监控
- Web Vitals 指标(FP、FCP、LCP 等)
- 资源加载性能
- 首屏加载时间
- 白屏检测
- 长任务监控
- 用户行为监控
- 页面访问(PV)
- 独立访客(UV)
- 点击行为
- 页面切换
- 用户行为栈记录
- rrweb 页面录屏
- 灵活的数据上报策略,支持多种上报方式和失败重试
- 支持数据采样
- 高度可定制的配置选项
npm install dt-monitor-sdk
或使用 yarn:
yarn add dt-monitor-sdk
import Monitor from 'dt-monitor-sdk'
const monitor = new Monitor({
appId: 'your-app-id',
reportUrl: 'https://your-server.com/report',
plugins: ['jsError', 'resourceError', 'pv', 'rrweb', 'behaviorStack'],
sampling: 1, // 100% 采样率
pluginsConfig: {
// rrweb 插件配置
rrweb: {
recordMode: 'error', // 仅在错误发生时上报录屏
maxRecordingTime: 10000, // 最大录制时长(毫秒)
maskAllInputs: true, // 遮罩所有输入框内容
},
// 行为栈插件配置
behaviorStack: {
maxStackSize: 30, // 行为栈最大长度
reportWithError: true, // 在错误发生时上报行为栈
},
},
})
monitor.init()
// 手动上报错误
try {
// 可能抛出异常的代码
} catch (error) {
monitor.reportError(error, {
context: 'login-flow',
userId: 'user-123',
})
}
// 自定义事件跟踪
monitor.reportEvent('button_click', {
buttonId: 'submit-btn',
page: 'checkout',
})
// 设置用户信息
monitor.setUser('user-123', {
role: 'admin',
plan: 'premium',
})
// main.js
const { Monitor } = require('dt-monitor-sdk')
const monitor = new Monitor({
appId: 'your-app-id',
reportUrl: '/api/report',
})
console.log('使用UMD格式初始化监控')
monitor.init()
<script src="https://cdn.example.com/dt-monitor-sdk.iife.min.js"></script>
<script>
var monitor = new MonitorSDK.Monitor({
appId: 'your-app-id',
reportUrl: 'https://your-server.com/report',
plugins: ['jsError', 'pv', 'rrweb'],
pluginsConfig: {
rrweb: {
recordMode: 'error',
},
},
})
monitor.init()
</script>
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
appId |
string | (必填) | 应用标识符 |
reportUrl |
string | (必填) | 数据上报的 URL |
userId |
string | null | 当前用户标识符 |
sampling |
number | 1 | 采样率 (0-1) |
plugins |
array | [] | 要启用的插件列表 |
maxQueueSize |
number | 10 | 自动发送前的最大队列大小 |
reportInterval |
number | 0 | 定时上报间隔(毫秒),0 表示不定时上报 |
pluginsConfig |
object | {} | 各插件的配置对象 |
pluginsConfig: {
rrweb: {
recordMode: 'error', // 'error'(仅错误时上报) | 'always'(始终上报)
maxRecordingTime: 10000, // 最大录制时长(毫秒)
maxEvents: 100, // 最大事件数量
errorTriggerTypes: ['error'], // 触发录屏上报的错误类型
errorTriggerLevels: ['error'], // 触发录屏上报的错误级别
blockClass: 'rr-block', // 不录制的元素类名
ignoreClass: 'rr-ignore', // 不录制内容的元素类名
maskAllInputs: true, // 是否遮罩所有输入框内容
}
}
pluginsConfig: {
behaviorStack: {
maxStackSize: 30, // 行为栈最大长度
includeTypes: ['click', 'pageChange', 'http', 'error', 'custom'], // 要记录的行为类型
debounceTime: 300, // 防抖时间(毫秒)
reportWithError: true, // 是否在错误发生时上报行为栈
reportInterval: 0, // 定时上报间隔(毫秒),0表示不定时上报
maskSensitiveData: true, // 是否遮罩敏感数据
sensitiveKeys: ['password', 'token', 'credit', 'card'], // 敏感数据关键词
}
}
monitor.init()
- 初始化监控 SDKmonitor.reportError(error, extraInfo)
- 上报错误monitor.reportEvent(eventName, eventData)
- 上报自定义事件monitor.setUser(userId, userInfo)
- 设置用户信息monitor.on(eventType, listener)
- 监听特定类型的事件monitor.off(eventType, listener)
- 移除事件监听器monitor.flushQueue()
- 立即发送队列中的数据monitor.destroy()
- 清理并销毁监控实例
可以使用 monitor.on()
方法监听以下事件类型:
error
- 错误事件performance
- 性能事件behavior
- 用户行为事件custom_event
- 自定义事件
jsError
- JavaScript 错误resourceError
- 资源加载错误httpError
- HTTP 请求错误frameworkError
- 框架特定错误
pageLoad
- 页面加载性能resourceLoad
- 资源加载性能firstPaint
- 首次绘制firstContentfulPaint
- 首次内容绘制largestContentfulPaint
- 最大内容绘制firstScreen
- 首屏加载时间whiteScreen
- 白屏检测longTask
- 长任务监控
click
- 点击行为pageChange
- 页面切换pv
- 页面访问uv
- 独立访客rrweb
- 页面录屏behaviorStack
- 用户行为栈
上报数据的基本格式如下:
{
"projectKey": "string", // 项目标识
"dataType": "error | performance | behavior | pv | recording | behaviorStack", // 数据类型
"payload": {
// 根据 dataType 不同,包含具体的数据结构
}
}
import Monitor from 'dt-monitor-sdk'
// 创建一个新的 Monitor 实例,启用错误监控插件
const monitor = new Monitor({
appId: 'example-app',
reportUrl: 'https://example.com/api/monitor',
plugins: ['jsError', 'resourceError', 'httpError'], // 启用错误监控插件
sampling: 1, // 100% 采样
})
// 初始化监控
monitor.init()
// 示例: 手动触发 JS 错误
function triggerJSError() {
try {
// 故意引发错误
const obj = null
obj.nonExistentMethod()
} catch (error) {
// 错误会被 jsError 插件自动捕获,也可以手动上报
monitor.reportError(error, {
context: '手动触发的错误',
importance: 'high',
})
}
}
import Monitor from 'dt-monitor-sdk'
// 创建一个新的 Monitor 实例,启用性能监控插件
const monitor = new Monitor({
appId: 'example-app',
reportUrl: 'https://example.com/api/monitor',
plugins: [
'pageLoad',
'resourceLoad',
'firstPaint',
'firstContentfulPaint',
'largestContentfulPaint',
'firstScreen',
'longTask',
],
})
// 初始化监控
monitor.init()
// 监听性能事件
monitor.on('performance', data => {
console.log('捕获到性能数据:', data)
})
import Monitor from 'dt-monitor-sdk'
const monitor = new Monitor({
appId: 'example-app',
reportUrl: 'https://example.com/api/monitor',
plugins: ['jsError', 'rrweb', 'behaviorStack'],
})
monitor.init()
// 监听错误事件
monitor.on('error', errorData => {
console.log('捕获到错误:', errorData)
// 可以在这里执行自定义逻辑
})
// 监听行为事件
monitor.on('behavior', behaviorData => {
console.log('捕获到用户行为:', behaviorData)
})
// 监听特定子类型的事件
monitor.on('error:jsError', jsErrorData => {
console.log('捕获到 JS 错误:', jsErrorData)
})
dt-monitor-sdk/
├── src/ # 源代码目录
│ ├── core/ # 核心功能
│ │ ├── monitor.js # Monitor 核心类
│ │ └── index.js # 核心模块导出
│ ├── plugins/ # 插件目录
│ │ ├── error/ # 错误监控插件
│ │ ├── performance/ # 性能监控插件
│ │ ├── behavior/ # 用户行为监控插件
│ │ └── index.js # 插件注册/导出
│ ├── transport/ # 数据传输模块
│ │ ├── reporter.js # 数据上报实现
│ │ └── index.js # 传输模块导出
│ ├── utils/ # 工具函数
│ └── index.js # SDK 入口文件
├── dist/ # 构建输出目录
├── examples/ # 示例代码
├── docs/ # 文档
├── rollup.config.js # Rollup 构建配置
└── package.json # 项目配置
# 安装依赖
npm install
# 构建 SDK
npm run build
构建后的文件将输出到 dist
目录,包含以下格式:
- ESM 格式:
dist/index.esm.js
- UMD 格式:
dist/index.umd.js
- IIFE 格式:
dist/index.iife.js
- 压缩版本:
dist/index.esm.min.js
,dist/index.umd.min.js
和dist/index.iife.min.js
- Gzip 压缩版本:
dist/index.esm.min.js.gz
,dist/index.umd.min.js.gz
和dist/index.iife.min.js.gz
(压缩率约为 88%)
该 SDK 支持所有现代浏览器,包括:
- Chrome 60+
- Firefox 55+
- Safari 11+
- Edge 16+
对于旧版浏览器,可能需要添加相应的 polyfill。
欢迎对本项目进行贡献!以下是参与开发的步骤:
- Fork 本仓库
- 创建你的特性分支 (
git checkout -b feature/amazing-feature
) - 提交你的更改 (
git commit -m 'Add some amazing feature'
) - 推送到分支 (
git push origin feature/amazing-feature
) - 创建一个 Pull Request
- 添加新插件时,请在
src/plugins
目录下创建相应的文件夹和文件 - 所有插件应该实现
init
和destroy
方法 - 添加新插件后,请在
src/plugins/index.js
中注册该插件 - 添加新功能时,请同时更新文档和添加相应的测试
MIT