你的 Error Dashboard 在骗你——它没有显示的内容
抱歉,我无法直接访问外部链接获取文章内容。请您把需要翻译的文本粘贴在这里,我会帮您翻译成简体中文,并保留原始的格式、Markdown 语法以及代码块和 URL。谢谢!
前端错误监控的肮脏秘密
每个市面上的工具都做同样的事:
- 捕获异常。
- 按堆栈跟踪分组。
- 发送 Slack 警报给你。
然后就是 你的问题。你仍然需要弄清楚:
- 这是竞争条件吗?
- 是 API 调用失败了吗?
- 是内存泄漏吗?
- 是水合不匹配吗?
你不知道。工具也不知道。祝你接下来 3 小时的侦探工作顺利。
“为什么每个错误工具都告诉我 崩溃了什么,却没有一个告诉我 为什么会崩溃?”
介绍 CrashSense – 一个崩溃诊断 SDK(不是另一个错误跟踪器)
同样的 TypeError?CrashSense 会返回如下结构化报告:
{
"category": "memory_issue",
"subcategory": "memory_leak",
"confidence": 0.87,
"severity": "critical",
"contributingFactors": [
{
"factor": "high_memory_utilization",
"weight": 0.9,
"evidence": "Heap at 92% (487MB / 528MB)"
},
{
"factor": "memory_growing_trend",
"weight": 0.8,
"evidence": "Heap growing at 2.3MB/s over 60s"
},
{
"factor": "high_long_task_count",
"weight": 0.6,
"evidence": "4 long tasks in last 30s (avg 340ms)"
}
],
"breadcrumbs": [
{ "type": "navigation", "message": "User navigated to /checkout" },
{ "type": "click", "message": "User clicked 'Add to Cart'" },
{ "type": "network", "message": "POST /api/cart → 200 (142ms)" },
{ "type": "console", "message": "Warning: memory pressure elevated" }
],
"aiAnalysis": {
"rootCause": "Memory leak in useEffect — event listener not cleaned up",
"fix": { "code": "return () => window.removeEventListener('resize', handler);" },
"prevention": "Always return cleanup functions from useEffect with side effects"
}
}
根本原因已分类。提供了证据链。建议了修复方案。
值班的初级工程师本可以在 凌晨 2:01 解决它——无需叫醒任何人。
CrashSense 工作原理
CrashSense 是一个 分类引擎,能够 实时 将系统信号与错误模式关联。
SDK 通过原生浏览器 API 被动监控 四个 系统维度——无需 monkey‑patch,也不需要代理包装。CPU 开销保持在 2 % 以下。
监控维度
| 监控项 | 使用的 API | 监控内容 |
|---|---|---|
| 内存 | performance.memory | 堆使用量、利用率 %、增长趋势 |
| 事件循环 | PerformanceObserver(Long Task) | 阻塞任务、帧时序 |
| 网络 | fetch / XMLHttpRequest 拦截 | 请求失败、超时、离线状态 |
| Iframe | MutationObserver | Iframe 数量、跨域检测 |
所有监控都是 被动 的。
基于信号的分类
当错误发生时,分类器会查看 当前系统状态,而不仅仅是错误信息:
Error: TypeError (reading 'map')
+ Memory at 92% and growing → memory_issue signal
+ 4 long tasks in last 30 s → event_loop signal
+ 0 network failures → not network_induced
+ React component stack present → check framework_react
每个信号会根据证据强度分配权重。
得分最高的类别获胜;置信度分数反映确定程度。
崩溃类别
| 类别 | 捕获内容 |
|---|---|
memory_issue | 内存泄漏、堆峰值、OOM |
event_loop_blocking | 无限循环、UI 卡死、长任务 |
framework_react | 水合不匹配、无限重渲染、hook 违规 |
framework_vue | 响应式循环、watcher 级联、生命周期错误 |
network_induced | 离线崩溃、CORS 阻止、超时级联 |
iframe_overload | 过多 iframe 导致内存耗尽 |
runtime_error | TypeError、ReferenceError、RangeError |
每一次用户交互都会自动记录——点击、导航、网络请求、控制台输出、状态变化。当崩溃报告生成时,你看到的是 时间线,而不仅仅是堆栈跟踪。
LLM 集成
接入你自己的 LLM(OpenAI、Anthropic、Google,或任何兼容的端点)。CrashSense 会发送 结构化、令牌优化 的负载,并接收解析后的根因分析及修复代码。
架构图
![展示 CrashSense 监控流水线的架构图:系统监视器 → 事件总线 → 分类器 → 崩溃报告]
快速开始(React)
npm install @crashsense/core @crashsense/react
import { createCrashSense } from '@crashsense/core';
import { CrashSenseProvider } from '@crashsense/react';
const cs = createCrashSense({
appId: 'my-app',
onCrash: (report) => {
console.log(report.event.category); // "memory_issue"
console.log(report.event.confidence); // 0.87
console.log(report.event.contributingFactors);
},
});
function App() {
return (
<CrashSenseProvider cs={cs}>
{/* ... */}
</CrashSenseProvider>
);
}
用于细粒度控制的 Hook
import { useCrashSense, useRenderTracker } from '@crashsense/react';
function Checkout() {
const { captureException, addBreadcrumb } = useCrashSense();
useRenderTracker('Checkout'); // warns on excessive re‑renders
const handlePay = async () => {
addBreadcrumb({ type: 'click', message: 'User clicked pay' });
try {
await processPayment();
} catch (err) {
captureException(err, { action: 'payment' });
}
};
return <button onClick={handlePay}>Pay Now</button>;
}
快速入门 (Vue)
npm install @crashsense/core @crashsense/vue
import { createCrashSense } from '@crashsense/core';
import { CrashSensePlugin } from '@crashsense/vue';
const cs = createCrashSense({
appId: 'my-app',
onCrash: (report) => console.log(report),
});
app.use(CrashSensePlugin, { cs });
(Vue 示例的后续内容请参见 SDK 文档。)
要点
CrashSense 并不会神奇地修复 bug;它 对 bug 进行分类,将其与实时系统信号关联,并呈现简洁、可操作的报告。值班的初级工程师现在可以在凌晨 2 点解决内存泄漏 而不必叫醒其他人。
CrashSense 快速入门 (Vue)
import { createApp } from 'vue';
import { crashSensePlugin } from '@crashsense/vue';
import App from './App.vue';
const app = createApp(App);
app.use(crashSensePlugin, { appId: 'my-app' });
app.mount('#app');
捕获: 响应式循环、生命周期错误、通过 app.config.errorHandler 捕获的组件故障.
AI‑驱动的根本原因分析
npm install @crashsense/ai
import { createAIClient } from '@crashsense/ai';
const ai = createAIClient({
endpoint: 'https://api.openai.com/v1/chat/completions',
apiKey: process.env.OPENAI_API_KEY!,
model: 'gpt-4',
});
const analysis = await ai.analyze(report.event);
console.log(analysis?.rootCause); // "Memory leak in useEffect..."
console.log(analysis?.fix?.code); // "return () => window.removeEventListener(..."
“这是我最自豪的功能。” – CrashSense
CrashSense 不仅在崩溃后告诉你。它在浏览器标签页 之前 死亡时就检测到危险情况。
预崩溃内存压力等级
| Level | Memory Trigger | Meaning |
|---|---|---|
| elevated | > 70 % heap | 系统处于压力之下 |
| critical | > 85 % heap | 高风险 — 需要采取措施 |
| imminent | > 95 % heap | 崩溃即将发生,几秒内可能崩溃 |
import { createCrashSense } from '@crashsense/core';
const cs = createCrashSense({
appId: 'my-app',
enablePreCrashWarning: true,
enableMemoryMonitoring: true,
});
警告会记录为 breadcrumb。当发生崩溃时,报告会显示完整的升级路径:elevated → critical → imminent → crash。
![预崩溃警告升级时间线,显示 elevated → critical → imminent → crash]
SDK 约束与统计
设计约束
- SDK 必须永不导致应用崩溃。
- 包大小很重要——压缩后约 7 KB,且无运行时依赖。
- 必须在任何数据离开浏览器之前清除 PII(GDPR‑by‑design)。
- 误报会破坏信任。
包大小与依赖
| 包 | 大小 | 依赖 |
|---|---|---|
@crashsense/core | ~7 KB | 0 |
@crashsense/react | ~1.3 KB | 0 (peer: react) |
@crashsense/vue | ~1.2 KB | 0 (peer: vue) |
@crashsense/ai | ~3.1 KB | 0 |
功能对比
| 功能 | CrashSense | Sentry | LogRocket | Bugsnag |
|---|---|---|---|---|
| 根因分类 | ✅ 7 类 | ❌ 仅堆栈追踪 | ❌ | ❌ |
| 内存泄漏检测 | ✅ 趋势 + 使用率 | ❌ | ❌ | ❌ |
| 崩溃前警告 | ✅ 3 级升级 | ❌ | ❌ | ❌ |
| AI 修复建议 | ✅ 自带 LLM | ❌ | ❌ | ❌ |
| PII 自动清理 | ✅ SDK 级别 | ⚠️ 服务器端 | ❌ | ⚠️ |
| 包大小 | ~7 KB | ~30 KB | ~80 KB | ~15 KB |
| 运行时依赖 | 0 | 多个 | 多个 | 多个 |
| 定价 | 免费永久 | 免费层 | $99/月 | $59/月 |
最近发布 & 路线图
- v1.1.0 – OOM 恢复检测:当浏览器因内存耗尽而关闭标签页时,CrashSense 在下次页面加载时使用
sessionStorage快照和 6‑signal 分析引擎恢复完整的崩溃上下文(检查点、面包屑、崩溃前警告)。
即将推出
- 对生产堆栈跟踪的 source‑map 支持
- 崩溃分析仪表板 UI
- 更多框架适配器(Svelte、Solid)
- Webhook 集成(Slack、Discord、PagerDuty)
npm install @crashsense/core
Resources
- GitHub – ⭐️ 如果它能帮你节省调试时间,请给它加星
- Documentation – 完整的 API 参考、指南、示例
- npm –
@crashsense/core,@crashsense/react,@crashsense/vue,@crashsense/ai
免费。MIT 许可证。零供应商锁定。
由 Hoai Nho 构建 —— 一位在凌晨 2 点厌倦了充当侦探的技术负责人。