前端異常監控,性能監控,埋點,怎么做的


你想做的是一個 前端監控系統(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
英文地址,請注明出處:http://en.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…