淺談前端埋點(diǎn)&監(jiān)控
淺談前端埋點(diǎn)&監(jiān)控
https://www.zoo.team/article/monitor
一、為什么需要埋點(diǎn)&監(jiān)控
在開(kāi)始正文之前,我們先想想為什么需要埋點(diǎn)&監(jiān)控?
當(dāng)我們?cè)诜治鰪?fù)盤(pán)一個(gè)產(chǎn)品是否成功的時(shí)候,不同的角色考慮的方向是不同的。
站在產(chǎn)品的視角,經(jīng)常會(huì)問(wèn)如下幾個(gè)問(wèn)題:
1. 產(chǎn)品有沒(méi)有用戶使用
2. 用戶用得怎么樣
3. 系統(tǒng)會(huì)不會(huì)經(jīng)常出現(xiàn)異常
4. 如何更好地滿足用戶需求服務(wù)用戶
當(dāng)站在技術(shù)視角時(shí),經(jīng)常會(huì)問(wèn)如下幾個(gè)問(wèn)題:
1. 系統(tǒng)出現(xiàn)異常的頻率如何
2. 異常出現(xiàn)后如何快速進(jìn)行定位追蹤
3. 如何分析解決問(wèn)題
而當(dāng)站在老板的視角時(shí),問(wèn)題可能又會(huì)變?yōu)椋?br>
1. 我的存量用戶多少,未來(lái)還有多少潛力
2. 多少用戶在系統(tǒng)內(nèi)進(jìn)行了消費(fèi)
當(dāng)在回答了上述問(wèn)題之后,埋點(diǎn)&監(jiān)控便躍然紙上。因?yàn)橐卮鹨陨蠁?wèn)題,只有通過(guò)對(duì)系統(tǒng)進(jìn)行數(shù)據(jù)分析的方式才能弄清楚。
其實(shí)無(wú)論是埋點(diǎn)亦或是監(jiān)控,二者并不是獨(dú)立存在,而是相互依存的關(guān)系。
二、埋點(diǎn)&監(jiān)控能做什么
從單個(gè)頁(yè)面的常規(guī)數(shù)據(jù)角度出發(fā)我們可以通過(guò)埋點(diǎn)獲?。涸L問(wèn)次數(shù)(UV/PV)、地域數(shù)據(jù)(IP)、在線時(shí)長(zhǎng)、區(qū)域點(diǎn)擊次數(shù)等數(shù)據(jù)。
當(dāng)我們將這些單點(diǎn)數(shù)據(jù)按照特定的緯度進(jìn)行數(shù)據(jù)聚合,就可以獲得全流程視角下的數(shù)據(jù)如:用戶留存率/流轉(zhuǎn)率、用戶轉(zhuǎn)化率、用戶訪問(wèn)深度等數(shù)據(jù)。
而在埋點(diǎn)數(shù)據(jù)進(jìn)行上報(bào)的同時(shí),我們也可以同步收集頁(yè)面基礎(chǔ)數(shù)據(jù)/接口相關(guān)數(shù)據(jù)如:頁(yè)面加載/渲染時(shí)長(zhǎng)、頁(yè)面異常、請(qǐng)求接口等數(shù)據(jù)。
同時(shí)對(duì)于前端監(jiān)控來(lái)說(shuō),大致可以分成三個(gè)方向:數(shù)據(jù)監(jiān)控、性能監(jiān)控、異常監(jiān)控。
數(shù)據(jù)監(jiān)控
數(shù)據(jù)監(jiān)控即通過(guò)數(shù)據(jù)分析用戶行為,常見(jiàn)的監(jiān)控?cái)?shù)據(jù)包括:PV/UV、頁(yè)面停留時(shí)長(zhǎng)、通過(guò)什么入口進(jìn)入、在頁(yè)面觸發(fā)了什么行為等。統(tǒng)計(jì)這些數(shù)據(jù)就是為了清楚用戶來(lái)源,拓寬產(chǎn)品的推廣渠道;了解用戶在頁(yè)面停留的時(shí)間情況,針對(duì)停留較短的頁(yè)面進(jìn)行分析改進(jìn)。也就是我們常說(shuō)的:who(uuid)、when(time)、from where(referrer)、where(x,y)、what (自定義拓展數(shù)據(jù))串成的用戶行為路徑。
性能監(jiān)控
性能監(jiān)控主要是針對(duì)前端進(jìn)行監(jiān)控,比如不同用戶在不同地區(qū)使用不同機(jī)型下的首屏加載時(shí)間、頁(yè)面的白屏?xí)r間、靜態(tài)資源下載時(shí)間等數(shù)據(jù)。通過(guò)針對(duì)這些性能數(shù)據(jù)進(jìn)行監(jiān)控,可以大概反映前端性能的好壞,根據(jù)性能監(jiān)測(cè)的結(jié)果可以進(jìn)一步的去優(yōu)化前端性能。
異常監(jiān)控
前端代碼在執(zhí)行過(guò)程中也可能會(huì)發(fā)生異常,因此需要引入異常監(jiān)控例如 sentry 等工具及時(shí)的上報(bào)異常情況,可以避免線上故障的發(fā)上。常見(jiàn)的異常包括:Javascript 的異常監(jiān)控、css 的異常監(jiān)控等。
三、目前埋點(diǎn)方案&后續(xù)演進(jìn)方向
現(xiàn)有方案
目前公司已經(jīng)存在一套埋點(diǎn) SDK 在運(yùn)行,使用的是代碼埋點(diǎn)方案,其埋點(diǎn)上報(bào)數(shù)據(jù)可大致分為三類:頁(yè)面進(jìn)入、事件觸發(fā)、頁(yè)面離開(kāi)。
(1) 頁(yè)面進(jìn)入 (pageIn)
進(jìn)入頁(yè)面時(shí),同步推送頁(yè)面基礎(chǔ)信息如:當(dāng)前頁(yè)面的來(lái)源頁(yè)面、操作系統(tǒng)、瀏覽器、頁(yè)面 url,發(fā)生時(shí)間等
{
title: '政采云', // document title
pre: '', // referrer
utm-url: 'a.b.c.d.e', // url 中獲取的 utm
utm-cnt: 'a.b.0.0.e', // 這個(gè)頁(yè)面的 utm a b 值
scr: '1400x900', // 分辨率
os: 'mac', // 操作系統(tǒng)
k: 'webkit', // 瀏覽器內(nèi)核
b: 'chrome/70', // 瀏覽器及版本
lver: '1.0.0', // js 版本
createTime: '', // 當(dāng)前時(shí)間的時(shí)間戳(用戶本地時(shí)間)
logType: 1 // 頁(yè)面進(jìn)入發(fā)送數(shù)據(jù)
}
(2) 事件觸發(fā) (Event)
觸發(fā)事件時(shí),同步推送事件類型 (click、hover 等)、鼠標(biāo)位置、附加業(yè)務(wù)參數(shù)等
{
evt: 'click', // 事件類型
utm-cnt: 'a.b.c.d.e', // utm 值
bdata: '{"test": "12345" }', // 業(yè)務(wù)數(shù)據(jù)
mx: xx, // 鼠標(biāo)點(diǎn)擊位置 x
my: xx, // 鼠標(biāo)點(diǎn)擊位置 y
lver: '1.0.0', // js 版本
logType: 2 // 數(shù)據(jù)類型
}
(3) 頁(yè)面離開(kāi) (pageOut)
離開(kāi)頁(yè)面時(shí),同步推送發(fā)生時(shí)間、頁(yè)面 url 等
{
title: '政采云', // document title
pre: '', // referrer
utm-url: 'a.b.c.d.e', // url 中獲取的 utm
utm-cnt: 'a.b.0.0.e', // 這個(gè)頁(yè)面的 utm a b 值
lver: '1.0.0', // js 版本
createTime: '', // 當(dāng)前時(shí)間的時(shí)間戳(用戶本地時(shí)間)
logType: 3 // 頁(yè)面離開(kāi)發(fā)送數(shù)據(jù)
}
其埋點(diǎn)大致邏輯如下圖,通過(guò)生成獨(dú)有的四段值 +pvid 即可定位某個(gè)項(xiàng)目的某個(gè)頁(yè)面在某個(gè)區(qū)塊點(diǎn)擊了某個(gè)按鈕,同時(shí)生成唯一的 pvid 記錄頁(yè)面的 pv 數(shù)據(jù)。具體說(shuō)明可翻閱往期關(guān)于政采云埋點(diǎn)分析系統(tǒng)的文章:前端工程實(shí)踐之?dāng)?shù)據(jù)埋點(diǎn)分析系統(tǒng)(一)。前端搞監(jiān)控|如何實(shí)現(xiàn)用戶行為的動(dòng)態(tài)采集與分析 (https://juejin.cn/post/6844904161566261256)
后續(xù)演進(jìn)
在現(xiàn)有 SDK 的基礎(chǔ)上我們可以發(fā)現(xiàn),目前的埋點(diǎn) SDK 只上報(bào)了一些用戶的基礎(chǔ)信息數(shù)據(jù),在性能數(shù)據(jù)和異常數(shù)據(jù)的上報(bào)上還存在可拓展的空間。
(1) 性能數(shù)據(jù)上報(bào)
在獲取用戶基礎(chǔ)數(shù)據(jù)的同時(shí),后續(xù)可以通過(guò) window.performanceAPI 獲取前端性能數(shù)據(jù),在第一次進(jìn)入頁(yè)面時(shí)隨 pageIn 一起將頁(yè)面初始性能數(shù)據(jù)進(jìn)行上報(bào)。
可進(jìn)行上報(bào)的字段包含如下:
const getPerformanceData = () => {
let performance = {};
try {
performance = window.performance.getEntries()[0];
} catch (e) {}
const {
domainLookupEnd = 0,
domainLookupStart = 0,
connectStart = 0,
connectEnd = 0,
requestStart = 0,
responseStart = 0,
// etc...
} = performance;
const dns = ~~(domainLookupEnd - domainLookupStart);
const tcp = ~~(connectEnd - connectStart);
const ttfb = ~~(responseStart - requestStart);
// etc...
return {
// TODO...
};
};
(2) 接口數(shù)據(jù)上報(bào)
除了上報(bào)性能數(shù)據(jù)外,我們也可將頁(yè)面內(nèi)所發(fā)的所有請(qǐng)求通過(guò)重寫(xiě) XMLHttpRequest 進(jìn)行劫持打標(biāo)上報(bào),即在當(dāng)前頁(yè)面下的所有請(qǐng)求 header 上默認(rèn)加上當(dāng)前頁(yè)面 ID,將各個(gè)請(qǐng)求與當(dāng)前頁(yè)面的 pageId 進(jìn)行綁定。
通過(guò)該類數(shù)據(jù)可以進(jìn)行統(tǒng)計(jì)分析出某一頁(yè)面的請(qǐng)求量、請(qǐng)求異常等情況判斷出頁(yè)面級(jí)別的請(qǐng)求健康度;后期甚至可與 Yapi 接口系統(tǒng)打通,若出現(xiàn)異常情況可直接將實(shí)際請(qǐng)求參數(shù)與文檔上的請(qǐng)求參數(shù)進(jìn)行對(duì)比,排除異常是由于請(qǐng)求參數(shù)錯(cuò)誤造成的。
let req = XMLHttpRequest;
(function(open, send) {
// TODO...
XMLHttpRequest.prototype.open = function() {
open.apply(this, arguments);
}
// TODO...
XMLHttpRequest.prototype.send = function () {
this.setRequestHeader('XXXXX', 'XXX')
send.apply(this, arguments);
}
})(req.prototype.open, XMLHttpRequest.prototype.send)
四、前端數(shù)據(jù)可視化
對(duì)于已經(jīng)采集上來(lái)的數(shù)據(jù)經(jīng)由數(shù)倉(cāng)清洗之后的可視化玩法就千變?nèi)f化了??梢葬槍?duì)不同元數(shù)據(jù)按不同指標(biāo)緯度聚合,產(chǎn)生不同的數(shù)據(jù)分析側(cè)重點(diǎn)。再通過(guò)各類可視化工具進(jìn)行展示,例如:渾儀系統(tǒng)、小采BI等。
渾儀系統(tǒng)
渾儀系統(tǒng)(內(nèi)部系統(tǒng))主要針對(duì)埋點(diǎn)進(jìn)行元數(shù)據(jù)后臺(tái)管理,推進(jìn)埋點(diǎn)平臺(tái)的規(guī)范化建設(shè)。同時(shí)在此基礎(chǔ)上,優(yōu)化數(shù)據(jù)分析功能,為公司內(nèi)部用戶提供埋點(diǎn)數(shù)據(jù)自助分析平臺(tái),提升數(shù)據(jù)利用率和日常工作效率。
小采 BI
小采 BI 是可視化團(tuán)隊(duì)內(nèi)部搭建系統(tǒng),分為報(bào)表搭建、大屏搭建和看板搭建等模塊。通過(guò)內(nèi)部這些搭建工具直接對(duì)元數(shù)據(jù)進(jìn)行展示,組合成面向不同受眾、不同角色的自定義數(shù)據(jù)報(bào)表或監(jiān)控大屏等。
五、結(jié)語(yǔ)
本文只是針對(duì)埋點(diǎn)系統(tǒng)和監(jiān)控系統(tǒng)的融合的一點(diǎn)簡(jiǎn)單的介紹與探索,實(shí)際操作落地上肯定會(huì)有各種問(wèn)題。比如多端情況下的數(shù)據(jù)埋點(diǎn)&上報(bào),比如手動(dòng)埋點(diǎn)增加了工作量破壞了原有代碼的可讀性等一系列實(shí)操上的問(wèn)題,這些都需要逐步完善優(yōu)化,同時(shí)我們也希望各位讀者提出自己意見(jiàn)和建議,一起完善埋點(diǎn)&監(jiān)控的大生態(tài)。
作者:北海
歡迎關(guān)注微信公眾號(hào) :政采云前端團(tuán)隊(duì)