【前端】前端監控?埋點

文章目錄

  • 前端監控分為三個方面
  • 前端監控流程
  • 異常監控
    • 常見的錯誤捕獲方法主要是 try / catch 、window.onerror 和window.addEventListener 等。
    • Promise 錯誤
    • Vue 錯誤
    • React 錯誤
  • 性能監控
  • 用戶行為監控
  • 常見的埋點方案
  • 來源

前端監控分為三個方面

  1. 異常監控(監控前端頁面的報錯)
  2. 性能監控(監控頁面的性能)
  3. 用戶行為監控(監控用戶的行為,計算PV、UV、在線時間等、數據監控即我們常說的埋點

前端監控流程

  1. 前端埋點
  2. 數據上報
  3. 加工匯總
  4. 可視化展示
  5. 監控報警

異常監控

  • JS 代碼運行錯誤、語法錯誤等;
  • AJAX 請求錯誤;
  • 靜態資源加載錯誤;
  • Promise 異步函數錯誤;

錯誤信息監控簡單來說就是要搜集報錯信息的發生的位置,以及報錯的類型,進行上報,便于我們能夠更好的掌握錯誤信息,從而能夠對癥下藥。按照 5W1H 的法則來說,我們需要關注以下的幾項信息:

  • What ,發生了什么錯誤:語法錯誤、類型錯誤、數據錯誤、邏輯錯誤等;
  • When ,什么時間發生的錯誤,可帶上時間戳進行上報;
  • Who ,哪個用戶或者哪一類用戶發生了錯誤,包括用戶 ID 、設備信息、IP 信息等;
  • Where ,哪個項目、哪些頁面發生錯誤,可以上報頁面的 URL 以及代碼報錯行數等信息;
  • Why ,為什么會發生錯誤,也就是用戶在什么樣的場景下發生的錯誤,便于問題復現;
  • How ,根據以上的信息如何進行問題的定位,然后怎么處理并解決問題;

常見的錯誤捕獲方法主要是 try / catch 、window.onerror 和window.addEventListener 等。

try / catch

這是我們在代碼調試的過程中最常用的一個方式,但它只能捕獲代碼常規的運行錯誤,語法錯誤和異步錯誤并能捕獲到。

// 常規運行時錯誤,可以捕獲 ?
try {console.log(notdefined);
} catch(e) {console.log('捕獲到異常:', 'ReferenceError');}// 語法錯誤,不能捕獲 ?
try {const notdefined,
} catch(e) {console.log('捕獲不到異常:', 'Uncaught SyntaxError');
}// 異步錯誤,不能捕獲 ?
try {setTimeout(() => {console.log(notdefined);}, 0)
} catch(e) {console.log('捕獲不到異常:', 'Uncaught ReferenceError');
}

window.onerror
當 JS 運行時錯誤發生時,window 會觸發一個 ErrorEvent 接口的 error 事件,并執行 window.onerror() 。

加載一個全局的 error 事件處理函數可用于自動收集錯誤報告。

最后需要補充的是:window.onerror 函數只有在返回 true 的時候,異常才不會向上拋出,否則即使是知道異常的發生,控制臺還是會顯示 Uncaught Error 。

 
```javascript
/*** @param { string } message 錯誤信息
* @param { string } source 發生錯誤的腳本URL
* @param { number } lineno 發生錯誤的行號
* @param { number } colno 發生錯誤的列號
* @param { object } error Error對象*/window.onerror = function(message, source, lineno, colno, error) {console.log('捕獲到的錯誤信息是:', message, source, lineno, colno, error )
}// 常規運行時錯誤,可以捕獲 ?
window.onerror = function(message, source, lineno, colno, error) {console.log('捕獲到異常:',{message, source, lineno, colno, error});
}
console.log(notdefined);
// message: "Uncaught ReferenceError: notdefined is not defined"
// source: "file:///C:/Users/qinzq42866/Desktop/error.html"
// lineno: 14
// colno: 19
// error: ReferenceError: notdefined is not defined at file
// 語法錯誤,不能捕獲 ?
window.onerror = function(message, source, lineno, colno, error) {console.log('未捕獲到異常:',{message, source, lineno, colno, error});
}
const notdefined,
// Uncaught SyntaxError: Missing initializer in const declaration// 異步錯誤,可以捕獲 ?
window.onerror = function(message, source, lineno, colno, error) {console.log('捕獲到異常:',{message, source, lineno, colno, error});
}
setTimeout(() => {console.log(notdefined);
}, 0)// message: "Uncaught ReferenceError: notdefined is not defined"// source: "file:///C:/Users/qinzq42866/Desktop/error.html"// lineno: 15// colno: 21// error: ReferenceError: notdefined is not defined at file// 資源錯誤,不能捕獲 ?
<script>
window.onerror = function(message, source, lineno, colno, error) {console.log('捕獲到異常:',{message, source, lineno, colno, error});
}</script>// GET https://yun.tuia.cn/image/kkk.png 404 (Not Found)

window.addEventListener
當一項靜態資源加載失敗時,加載資源的元素會觸發一個 Event 接口的 Error 事件,這些 Error 事件不會向上冒泡到 window ,但能被捕獲。而 window.onerror 不能檢測捕獲。

// 圖片、script、css加載錯誤,都能被捕獲 ?<script>window.addEventListener('error', (error) => {console.log('捕獲到異常:', error);}, true)</script>// fetch錯誤,不能捕獲 ?<script>window.addEventListener('error', (error) => {console.log('未捕獲到異常:', error);}, true)</script<script>fetch('https://tuia.cn/test')</script>

由于網絡請求異常不會發生事件冒泡,因此必須在事件捕獲的階段將其捕捉到才行,這種方式雖然能夠捕捉到網絡請求的異常,但是卻無法判斷 HTTP 的狀態,因此仍然需要配合服務端的日志進行配合分析。

需要注意的是:不同瀏覽器下返回的 Error 對象是不一樣的,需要做兼容處理。

Promise 錯誤

沒有寫 catch 的 Promise 中拋出的錯誤是無法被 onerror 或 try / catch 捕獲到的,這也是為什么我們一定要在 Promise 后面加上 catch 去捕獲和處理異常。

為了防止有漏掉的 Promise 異常信息,建議在全局增加一個對 unhandledrejection 的監聽,用來全局監聽 Uncaught Promise Error 。

說明:當 Promise 被 reject 且沒有 reject 處理器的時候,會觸發 unhandledrejection 事件;這可能發生在 window 下,但也可能發生在 Worker 中。 這對于調試回退錯誤處理非常有用。

window.addEventListener("unhandledrejection", event => {console.warn('UNHANDLED PROMISE REJECTION:', ${event.reason});});window.onunhandledrejection = event => {console.warn('UNHANDLED PROMISE REJECTION:', ${event.reason});};window.addEventListener("unhandledrejection", function(e){e.preventDefault()console.log('捕獲到異常:', e);});Promise.reject('promise error');

說明:如果去掉控制臺的異常顯示,需要加上 event.preventDefault() ;

Vue 錯誤

由于 Vue 會捕獲到所有 Vue 單文件組件或者 Vue.extend 繼承的代碼,所以在 Vue 里面出現的錯誤并不會直接拋給 window.onerror ,而是會被 Vue 自身的 Vue.config.errorHandler 捕獲。

Vue.config.errorHandler = (err, vm, info) => {console.error('通過vue errorHandler捕獲的錯誤');console.error(err);console.error(vm);console.error(info);}

React 錯誤

React 16 提供了一個內置函數 componentDidCatch ,使用它可以輕松的捕獲到 React 組件內部拋出的錯誤信息。

 
class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}componentDidCatch(error, errorInfo) {console.log('捕獲到錯誤:', error, errorInfo);}render() {if (this.state.hasError) {return `Something went wrong.`;}return this.props.children; }
}

性能監控

  • 不同用戶和不同設備下的首屏加載時間,包括白屏時間;
  • HTTP 接口的響應時間;
  • 靜態資源、包括圖片的下載時間;

根據W3C性能小組引入的新的API(目前IE9以上的瀏覽器)–window.performance,實現前端性能監控
在這里插入圖片描述

(function () {handleAddListener('load', getTiming)function handleAddListener(type, fn) {if (window.addEventListener) {window.addEventListener(type, fn)} else {window.attachEvent('on' + type, fn)}}function getTiming() {try {var time = performance.timing;var timingObj = {};var loadTime = (time.loadEventEnd - time.loadEventStart);if (loadTime < 0) {setTimeout(function () {getTiming();}, 200);return;}// 階段耗時timingObj['DNS解析耗時'] = (time.domainLookupEnd - time.domainLookupStart);timingObj['TCP連接耗時'] = (time.connectEnd - time.connectStart);timingObj['SSL安全連接耗時'] = (time.connectEnd - time.secureConnectionStart);//針對httpstimingObj['網絡請求耗時'] = (time.responseStart - time.requestStart);timingObj['數據傳輸耗時'] = (time.responseEnd - time.responseStart);timingObj['DOM解析耗時'] = (time.domInteractive - time.responseEnd);timingObj['資源加載耗時, 表示頁面中的同步加載資源'] = (time.loadEventStart - time.domContentLoadedEventEnd);timingObj['前端onload執行時間'] = (time.loadEventEnd - time.loadEventStart);//性能指標(上報字段名)timingObj["首次渲染"] = time.responseEnd - time.fetchStart// timingObj["首屏時間"] =  first meaningful painttimingObj["首次可交互"] = time.domInteractive - time.fetchStarttimingObj["DOMReady"] = time.domContentLoadedEventEnd - time.fetchStarttimingObj["頁面完全加載"] = time.loadEventStart - time.fetchStarttimingObj["首包時間"] = time.responseStart - time.domainLookupStartfor (item in timingObj) {console.log(item + ":" + timingObj[item] + '毫秒(ms)');}console.log(performance.timing);console.log(performance);} catch (e) {console.log(timingObj)console.log(performance.timing);}}
})();

用戶行為監控

  • PV / UV:PV 即 Page View ,也就是頁面的瀏覽數量,沒打開頁面一次就會統計一次;UV 即 User View
    ,也就是不同用戶訪問的次數,在 PV 的基礎上根據 User 信息的不同做了去重操作;
  • 用戶在每個頁面停留的時間信息。即從用戶打開該頁面到用戶離開該頁面的時間差,用于表示該頁面對用戶的留存程度;
  • 用戶的來處。即從什么入口或什么渠道來到了當前頁面,通常會在 URL 中添加查詢參數來做區分統計;
  • 用戶的頁面操作行為。即用戶在該頁面點擊了哪些按鈕,或者從什么鏈接去到了某些頁面等等,來分析用戶的去向。
import tracker from "../util/tracker";
export function pv() {tracker.send({kind: "business",type: "pv",startTime: performance.now(),pageURL: getPageURL(),referrer: document.referrer,uuid: getUUID(),});let startTime = Date.now();window.addEventListener("beforeunload",() => {let stayTime = Date.now() - startTime;tracker.send({kind: "business",type: "stayTime",stayTime,pageURL: getPageURL(),uuid: getUUID(),});},false);
}

常見的埋點方案

代碼埋點
嵌入代碼的形式
優點:精確(任意時刻,數據量全面)
缺點:代碼工作量點

可視化埋點
通過可視化交互的手段,代替代碼埋點
將業務代碼和埋點代碼分離,提供一個可視化交互的頁面,輸入為業務代碼,通過這個系統,可以在業務代碼中自定義的增加埋點事件等等,最后輸出的代碼耦合了業務代碼和埋點代碼
用系統來代替手工插入埋點代碼

無痕埋點
前端的任意一個事件被綁定一個標識,所有的事件都被記錄下來
通過定期上傳記錄文件,配合文件解析,解析出來我們想要的數據,并生成可視化報告供專業人員分析
無痕埋點的優點是采集全量數據,不會出現漏埋和誤埋等現象
缺點是給數據傳輸和服務器增加壓力,也無法靈活定制數據結構

來源

前端監控指的是什么?
前端 監控

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164178.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于element-ui后臺模板,日常嘮嗑

后面會補充github地址 文章目錄 目錄 文章目錄 案例說明 1.引入庫 2.創建布局組件 3.創建布局組件 4.菜單效果展示 5.創建頂部組件 5.創建頂部面包屑組件 6.創建內容區域組件 7.效果總覽 7.布丁&#xff08;實現一些小細節&#xff09; 前言一、pandas是什么&#xff1f;二、使…

CentOS7中升級OpenSSL詳細教程

文章目錄 一. 引言二. 升級前的準備1.備份現有配置2. 檢查系統版本3. 安裝依賴 三. OpenSSL安裝四. 驗證 一. 引言 OpenSSL: 是用于保護數據安全的重要工具。它能提供加密&#xff0c;解密等多項功能。 然而&#xff0c;隨著技術的發展和新的安全漏洞的出現&#xff0c;使用最…

管理類聯考——英語二——備考 100 句涵蓋所有詞匯

全中 在海里的這個地區&#xff0c;熊貓們喜歡就著蘇打碗豆喝茶。而大洋州的民兵則喜歡經過半島&#xff0c;帶著編劇本的公式上餐廳去。附件的電影院里有額外的歌劇和香蕉&#xff0c;這一時代的斑馬們被外面的天線所吸引。實驗室里的蟹想用它的肋骨去戳四肢象燈炮的小羊。但…

千夢網創:創業,一場游戲一場夢

創業這件事就好比一場養成類游戲&#xff0c;而我們自己就是游戲主角。 這個游戲有一個特殊之處在于&#xff1a;SSS級裝備有穿戴等級設定&#xff0c;就算你氪重金買到了一把神器&#xff0c;自身閱歷不夠也根本無法發揮它的強大威力而只能當個裝飾。 這就要求我們真正沉浸在…

催單開發信怎么寫?外貿人如何寫催單郵件?

年末催單開發信編寫技巧&#xff1f;最有效的催單話術有哪些&#xff1f; 催單開發信成為了企業間日常溝通的重要一環。這些信件不僅有助于促進業務發展&#xff0c;還可加強供應鏈的協調&#xff0c;確保貨物及時送達。蜂郵EDM將介紹如何寫一封出色的催單開發信&#xff0c;以…

ubuntu20.04安裝多版本cuda,切換版本

1. 安裝cuda toolkit: 下載網站 https://developer.nvidia.com/cuda-11.3.0-download-archive 選擇版本&#xff0c;這里選擇11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run給cuda權限: chmod x…

Linux加強篇001-部署Linux系統

目錄 一、前言 1.1準備工具 1.2安裝配置VM虛擬機 1.3安裝軟件 1.4系統初始化進程 1.5重置root密碼 二、鞏固練習 1&#xff0e;為什么建議讀者在下載系統文件后先進行校驗而不是直接安裝呢&#xff1f; 2&#xff0e;使用虛擬機安裝Linux系統時&#xff0c;為什么要先…

科技與藝術如何交織出“理想之家”?三星電視給出家電行業最優解答

作者 | 曾響鈴 文 | 響鈴說 理想的家&#xff0c;是什么樣子? 關于這個問題&#xff0c;社交媒體上有形形色色的答案。很多人的夢中情屋是原木風、奶油色&#xff0c;點綴著綠意盎然的植物&#xff1b;還有一些人的Dream house是用全屋智能將科技感拉滿&#xff0c;再配上打…

OpenStack云計算平臺-計算服務

目錄 一、計算服務概覽 二、安裝并配置控制節點 1、先決條件 2、安全并配置組件 3、完成安裝 三、安裝和配置計算節點 1、安全并配置組件 2、完成安裝 四、驗證操作 一、計算服務概覽 使用OpenStack計算服務來托管和管理云計算系統。OpenStack計算服務是基礎設施即服務…

2024東北師范大學計算機考研分析

24計算機考研|上岸指南 東北師范大學 信息科學與技術學院位于長春凈月國家高新技術產業開發區&#xff0c;毗鄰風光秀美的凈月潭國家森林公園。 信息科學與技術學院由原“計算機科學與信息技術學院”和“信息與軟件工程學院”于2017年根據學校事業發展需要整合形成。學院設有…

全球三大網絡安全威脅

網絡安全IP數據云 - 免費IP地址查詢 - 全球IP地址定位平臺威脅日益復雜&#xff0c;涵蓋了多個層面&#xff0c;從個人用戶到大型企業&#xff0c;都面臨著不同形式的網絡安全威脅。以下是當前全球范圍內廣泛認可的三大網絡安全威脅&#xff1a; 1. 惡意軟件和病毒攻擊&#x…

【沁恒藍牙mesh】OTA功能詳解

本文基于沁恒CH58X 單片機的OTA功能 一鍵三連&#xff0c;收藏點贊評論 私信可獲取原文 &#x1f4cb; 個人簡介 &#x1f496; 作者簡介&#xff1a;大家好&#xff0c;我是喜歡記錄零碎知識點的小菜鳥。&#x1f60e;&#x1f4dd; 個人主頁&#xff1a;歡迎訪問我的 Ethern…

不可錯過的10個即時通訊軟件開發技巧

歡迎來到本文&#xff0c;作為即時通訊軟件開發領域的專家&#xff0c;我將為您分享十個不容錯過的開發技巧。無論您是新手開發者還是有經驗的專業人士&#xff0c;這些技巧都將幫助您實現卓越的即時通訊軟件。讓我們開始吧&#xff01; 1. 選擇適當的開發平臺 在開始開發之前…

注意:怎么用JMeter操作MySQL數據庫?看完秒懂!

近期用JMeter做接口測試&#xff0c;遇到了一個需要用到數據數據庫的場景&#xff1a;一個關于數據報告的頁面&#xff0c;需要將數據庫里面的數據求和或者取均值之后&#xff0c;展示出來。 如果要斷言的話&#xff0c;需要連接數據庫&#xff0c;通過寫sql語句&#xff0c;將…

jmeter中調用python代碼

1、安裝pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller 2、將py腳本打包 pyinstaller -F venv/get_image/OCR_jmeter_api.py 3、jmeter中添加OS Process Sampler并調用dist下的程序 4、執行jmeter

刪除鏈表的倒數第N個結點

題目&#xff1a; 給你一個鏈表&#xff0c;刪除鏈表的倒數第 n 個結點&#xff0c;并且返回鏈表的頭結點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], n 2 輸出&#xff1a;[1,2,3,5]示例 2&#xff1a; 輸入&#xff1a;head [1], n 1 輸出&#xff1a;…

機器學習實戰-第5章 Logistic回歸

Logistic 回歸 概述 Logistic 回歸 或者叫邏輯回歸 雖然名字有回歸,但是它是用來做分類的。其主要思想是: 根據現有數據對分類邊界線(Decision Boundary)建立回歸公式,以此進行分類。 須知概念 Sigmoid 函數 回歸 概念 假設現在有一些數據點,我們用一條直線對這些點進行…

淺析基于智能音視頻技術的城市重要場館智能監控系統設計

了解旭帆科技的朋友都知道&#xff0c;旭帆科技一直都樂于和大家分享各類場景的視頻解決方案&#xff0c;今天小編就基于智能音視頻技術的城市重要場館智能監控系統設計和大家探討一下。 基于智能音視頻技術的城市重要場館智能監控系統設計&#xff0c;主要包含以下要素&#x…

外部 prometheus監控k8s集群資源(pod、CPU、service、namespace、deployment等)

prometheus監控k8s集群資源 一&#xff0c;通過CADvisior 監控pod的資源狀態1.1 授權外邊用戶可以訪問prometheus接口。1.2 獲取token保存1.3 配置prometheus.yml 啟動并查看狀態1.4 Grafana 導入儀表盤 二&#xff0c;通過kube-state-metrics 監控k8s資源狀態2.1 部署 kube-st…

手把手教你編寫LoadRunner腳本

編寫 LoadRunner 腳本需要熟悉腳本語言、業務場景、參數化技術、斷言和事務等基礎知識。 在實際編寫時&#xff0c;可以根據具體測試需求&#xff0c;結合實際情況進行合理的配置和調整。 基本步驟 創建腳本 在 LoadRunner 的 Controller 模塊中&#xff0c;創建一個新的測…