前端异常监控,性能监控,埋点,怎么做的


你想做的是一个 前端监控系统(Frontend Monitoring / RUM, Real User Monitoring),主要包括:

  • 异常监控(JS 报错、资源加载错误、Promise 未捕获异常)

  • 性能监控(白屏时间、首屏时间、页面加载时间、TTFB、FCP、LCP、CLS 等指标)

  • 行为监控(PV/UV、路由变化、用户操作)

  • 上报机制(采集到的数据怎么上报到监控服务)

  • 可视化与报警(监控后台分析、日志存储、异常告警)

下面我给你出一份 详细方案(从埋点到数据上报再到后端处理):


一、整体架构

  1. 前端 SDK(埋点脚本)

    • 集成到业务项目中(JS/TS SDK)。

    • 负责采集:

      • JS 错误(window.onerror, window.addEventListener('error'), unhandledrejection

      • 性能指标(Performance APIPerformanceObserver

      • 用户行为(click, hashchange, popstate 等事件)

    • 负责数据上报(sendBeacon/fetch/img.src)。

  2. 数据上报服务(Node.js/Go/Python)

    • 接收 SDK 上报的日志。

    • 存储到数据库(如 Elasticsearch、ClickHouse、MongoDB)。

    • 提供查询/分析 API。

  3. 可视化与报警

    • Web 管理后台(React/Vue/Antd)展示监控指标。

    • Grafana/ELK/Prometheus 也可以做日志与指标可视化。

    • 结合钉钉/企业微信/Slack 做告警。


二、前端 SDK 设计与实现

1. JS 错误监控

// 监听同步运行时错误
window.onerror = function (msg, url, line, col, error) {report({type: 'js_error',msg,url,line,col,stack: error?.stack});
};// 监听资源加载错误 (img, script, css)
window.addEventListener('error', function (e) {if (e.target && (e.target.src || e.target.href)) {report({type: 'resource_error',tagName: e.target.tagName,src: e.target.src || e.target.href});}
}, true);// 监听 Promise 未捕获异常
// 对 👍,window.addEventListener('unhandledrejection') 就是专门用来捕获 未被捕获的 Promise 异常 的。
// 在 JavaScript 中,如果你写了一个 Promise,但是没有在 链路的最后 .catch() 处理错误,浏览器就会触发一个 unhandledrejection 事件。window.addEventListener('unhandledrejection', function (e) {report({type: 'unhandledrejection',reason: e.reason});
});

2. 性能监控(Performance API)

  • 白屏时间:从 navigationStart首次 DOM 绘制(FP/FCP)

  • 首屏时间:业务可定义,如首屏主要内容渲染完成。可通过 MutationObserver 或在业务点埋点。

  • 页面加载时间loadEventEnd - navigationStart

  • 核心 Web Vitals

    • FCP (First Contentful Paint)

    • LCP (Largest Contentful Paint)

    • FID (First Input Delay)

    • CLS (Cumulative Layout Shift)

示例:

function getPerformance() {const timing = performance.timing;const paint = performance.getEntriesByType('paint');const nav = timing.navigationStart;return {whiteScreen: paint.find(e => e.name === 'first-paint')?.startTime || 0,fcp: paint.find(e => e.name === 'first-contentful-paint')?.startTime || 0,load: timing.loadEventEnd - nav,domReady: timing.domContentLoadedEventEnd - nav,ttfb: timing.responseStart - nav};
}window.addEventListener('load', () => {setTimeout(() => {report({type: 'performance',data: getPerformance()});}, 3000);
});

3. 用户行为监控(可选)

  • 路由变化监控(SPA:监听 popstate, hashchange)。

  • 点击行为监控(采集 click 元素路径,做埋点统计)。

  • 自定义事件埋点(开发者主动上报)。

// 路由变化
window.addEventListener('hashchange', (e) => {report({type: 'route_change',from: e.oldURL,to: e.newURL});
});

4. 数据上报机制

  • 高优先级(报错、关键性能数据)navigator.sendBeacon(页面卸载前保证发送成功)。

  • 低优先级:批量 fetch 上报。

  • 兜底方案new Image().src = 'url?...'。// 兼容性最好,兼容老浏览器 + 页面卸载时也能发请求

function report(data) {const url = 'https://monitor.xxx.com/report';const body = JSON.stringify({...data,userAgent: navigator.userAgent,url: location.href,timestamp: Date.now()});if (navigator.sendBeacon) {navigator.sendBeacon(url, body);} else {fetch(url, { method: 'POST', body, keepalive: true });}
}

三、后端服务(示例)

  • Node.js + Express + MongoDB/Elasticsearch/ClickHouse

  • 接收上报:

app.post('/report', (req, res) => {const data = req.body;// 存储日志db.collection('logs').insertOne(data);res.json({ code: 0 });
});
  • 定时聚合分析(统计错误率、性能指标分布)。


四、可视化与报警

  • 指标面板(可视化框架:ECharts/Grafana):

    • JS 错误率(随时间趋势)

    • 页面加载时间分布

    • 用户地区、设备分布

  • 异常报警

    • 错误率 > 1%

    • 页面白屏时间 > 3s

    • LCP > 4s
      → 触发告警,推送到钉钉/企业微信。


五、优化与扩展

  • 支持 SourceMap 解析,错误堆栈反解到源码位置。

  • 支持 Session 关联(用户 ID、会话 ID)。

  • 支持 前后端链路追踪(结合 Trace ID,关联后端 APM)。

  • 支持 采样率(例如 1% 用户采集,降低服务器压力)。


📌 总结:
实现一个前端监控系统主要分 采集(前端 SDK) → 上报(sendBeacon/fetch) → 存储(DB/ES) → 分析与报警(Dashboard+告警系统) 四个环节。
你可以先做一个 轻量级 SDK + Node 后端 + Grafana 可视化 的 MVP 版本,然后逐步扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94926.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes一EFK日志架构

前言:​ 在云原生时代,Kubernetes已成为容器编排的事实标准,它赋予了应用极高的弹性、可移植性和密度。然而,这种动态、瞬时的特性也带来了可观测性的新难题:当数以百计的Pod在节点间频繁创建和销毁时,传统…

Linux下的软件编程——网络编程(tcp)

重点:1.UDP和TCP区别2.TCP三次握手和四次挥手3.TCP粘包问题及解决办法4.TCP客户端和服务端的编程流程 TCP:传输层传输控制协议(流式套接字)1)TCP的特点1.面向数据流2.有连接(通信之前必须建立连接…

印度尼西亚数据源 PHP 对接文档

一、环境要求与配置 1. 系统要求 PHP ≥ 7.4扩展&#xff1a;cURL、JSON、OpenSSLComposer&#xff08;推荐&#xff09; 2. 安装依赖 composer require guzzlehttp/guzzle3. 基础配置类 <?php // config/StockTVConfig.php class StockTVConfig {const BASE_URL https://…

Maven核心用法

1.什么是Maven2.Maven的作用&#xff08;依赖管理、项目构建、统一的项目结构&#xff09;2.1 依赖管理2.2 项目构建2.3 统一的项目结构3.Maven的介绍IDEA中对应信息4.Maven的安装注意&#xff1a;需要解压到 没有中文 不带空格 的目录下5.IDEA中的Maven配置然后需要配置JD…

TypeScript:never类型

never类型是TypeScript中最特殊的类型之一&#xff0c;它表示永远不会发生的值。作为专业前端工程师&#xff0c;理解never类型对于编写类型安全的代码至关重要。1. never类型的核心概念定义&#xff1a;never类型表示永远不会出现的值&#xff0c;常见于&#xff1a;抛出错误的…

图数据库neo4j的安装

安装JDK Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。从Oracle官方网站下载 Java SE JDK&#xff0c;我的的版本是JDK8。 安装Neo4j 官网下载最新版本Neo4j 我下的是社区版的 Neo4j应用程序有如下主要的目录结构…

汽车诊断服务(UDS——0x27服务解析)

目录 1、服务概述 2、工作原理 3、常用的应用场景 4、子功能 5、请求与响应格式 5、1服务请求 5、2服务肯定响应 5、3服务否定响应 6、延时机制 1、服务概述 该服务对零部件中部分加密的服务进行解密工作安全访问的概念使用“种子”和“密钥”来实现 参数描述种子4字…

波兰密码破译机bomba:二战密码战的隐形功臣

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 从数学原理到机械奇迹&#xff0c;破解enigma的早期利器 ✨ 1. bomba概…

【RAGFlow代码详解-30】构建系统和 CI/CD

Docker 构建系统 RAGFlow 使用主 Dockerfile 1-214 中定义的复杂多阶段 Docker 构建过程&#xff0c;该过程创建应用程序的完整和精简变体。 多阶段构建架构Docker 构建过程 构建过程由 Dockerfile 2-214 中 定义的三个主要阶段组成&#xff1a;基础阶段 &#xff08; Dockerfi…

rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十七)设置主题

设置主题set_visuals ctx.set_visuals(Visuals::dark()); 设置暗色主题ctx.set_visuals(Visuals::light()); 设置亮色主题 fn main() -> eframe::Result<()> {// 配置原生窗口参数let options eframe::NativeOptions::default();eframe::run_simple_native("主题…

Linux入门教程 第十五章 Linux 系统调优工具

文章目录一、系统调优概述与 CPU 负载查看1.使用 uptime 查看系统负载2.使用 top 按 CPU 使用率排序3.使用 ps 查看 CPU 使用最多的进程4.使用 mpstat 查看 CPU 详细状态一、查看内存运行状态1.使用 free 查看内存使用2.查看 /proc/meminfo 获取详细内存信息3.使用 top 按内存使…

【Docker基础】Docker-compose进阶配置:健康检查与服务就绪

目录 引言 1 Docker健康检查基础概念 1.1 什么是健康检查 1.2 健康检查的状态 2 healthcheck配置详解 2.1 基本语法 2.2 配置参数解释 2.3 健康检查命令的编写 2.4 健康检查的工作流程 3 服务依赖与健康检查 3.1 depends_on的基本用法 3.2 结合健康检查的依赖 3.3…

Redis大Key处理流程与注意事项

概述 Redis大Key问题是在生产环境中经常遇到的技术挑战&#xff0c;它可能导致内存占用过高、网络延迟增加、阻塞其他操作等严重问题。本文将深入探讨Redis大Key的识别、处理流程以及相关注意事项。 什么是Redis大Key 定义标准 String类型: 单个Key的Value超过10KBHash类型: 单…

领悟8种常见的设计模式

很多 Java 初学者觉得设计模式 “抽象难学”&#xff0c;其实是没抓住核心逻辑 —— 设计模式不是 “炫技代码”&#xff0c;而是前辈们总结的 “解决高频复杂问题的通用思路”&#xff0c;好吧&#xff0c;你可以过一遍了解这些大概是个什么东西不求我们能够完全理解&#xff…

复杂BI报表SQL

复杂SQL 一行多个人员&#xff0c;平均瓜分总产量。 -- 西宁硅料三期 with b as ( select(row_number() OVER(PARTITION BY t1.tool ORDER BY t1.tool ) - 1) AS help_topic_id from((select1 AS tool union allselect1 AS tool union allselect1 AS tool union allselect1 AS …

bin log 和 redo log有什么区别

问题bin log 和 redo log有什么区别我的回答首先&#xff0c;这两种日志的作用不同。redo log是InnoDB引擎特有的&#xff0c;主要用于崩溃恢复&#xff0c;保证事务的持久性。而bin log是MySQL服务层的日志&#xff0c;主要用于主从复制和数据恢复。从层次上看&#xff0c;red…

导入文件允许合并表格

本来呢&#xff0c;已经有几年没咋写博客了&#xff0c;但是好像网上没什么好的合并导入可以抄的&#xff0c;周末加班了一天弄出来了&#xff0c;想一想也不算造轮子&#xff0c;可以露一手出来&#xff0c;最近也挺喜欢写注释的&#xff0c;应该方便大家抄的public class Tra…

WebIDEPLOY 技术驱动樱桃溯源管理系统的价值重塑与落地实践—— 以樱桃溯源管理系统构建产业信任体系的路径探索

一、WebIDEPLOY 技术支撑下的樱桃溯源系统核心架构樱桃种植从开花到销售的全流程数据记录&#xff0c;需要兼顾专业性与易操作性&#xff0c;WebIDEPLOY 技术以 “零代码降低门槛、云原生优化成本” 的特性&#xff0c;成为连接数字工具与樱桃种植的关键纽带。系统核心架构围绕…

零知开源——基于STM32F407VET6实现ULN2003AN驱动28BYJ-48步进电机控制系统

✔零知IDE 是一个真正属于国人自己的开源软件平台&#xff0c;在开发效率上超越了Arduino平台并且更加容易上手&#xff0c;大大降低了开发难度。零知开源在软件方面提供了完整的学习教程和丰富示例代码&#xff0c;让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品&am…

如何多个手机设备的实现不同公网IP

为了避免多个手机设备使用相同的公网IP地址导致平台检测关联&#xff0c;可以通过以下方法实现不同公网IP的分配和管理. 一、移动网络&#xff08;SIM 卡&#xff09;方案 1.移动数据与Wi-Fi切换&#xff1a;通过切换移动数据和不同Wi-Fi网络&#xff08;如家庭Wi-Fi、公共Wi-F…