真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

埋點系統(tǒng)是什么

這篇文章主要介紹了埋點系統(tǒng)是什么,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)堅信:善待客戶,將會成為終身客戶。我們能堅持多年,是因為我們一直可值得信賴。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。10多年網(wǎng)站建設(shè)經(jīng)驗創(chuàng)新互聯(lián)是成都老牌網(wǎng)站營銷服務(wù)商,為您提供成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、H5高端網(wǎng)站建設(shè)、網(wǎng)站制作、品牌網(wǎng)站設(shè)計、重慶小程序開發(fā)服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。

                                                           埋點系統(tǒng)是什么

前言

最近雜七雜八的事情比較多,難得抽出時間來彌補一下之前的系列,欠大家的埋點系列現(xiàn)在開始走起來

為什么需要埋點系統(tǒng)

電影中

前端開發(fā)攻城獅開開心心的 coding,非常自豪的進(jìn)行了業(yè)務(wù)、UI 分離開發(fā),各種設(shè)計模式、算法優(yōu)化輪番上陣,代碼寫的 Perfect(勞資代碼天下第一),沒有 BUG,程序完美,兼容性 No.1,代碼能打能抗質(zhì)量高。下班輕松打卡,回家看娃。

現(xiàn)實中

實際上,開發(fā)環(huán)境與生產(chǎn)環(huán)境并不能等同,并且測試的過程再完善,依然會有漏測的情況存在??紤]到用戶使用客戶端環(huán)境、網(wǎng)絡(luò)環(huán)境等等一系列的不確定因素存在。

所以在開發(fā)過程中一定要記得三大原則(我胡謅的)

  1. 沒有完美的代碼,只有沒發(fā)現(xiàn)的 BUG
  2. 絕對不要相信測試環(huán)境,沒有一種測試環(huán)境都涵蓋所有線上情況
  3. 如果線上沒有一點反饋,不要懷疑,問題應(yīng)該藏得很深、很深

什么是埋點系統(tǒng)

埋點就像城市中的攝像頭,從產(chǎn)品的角度考慮,它可以監(jiān)控到用戶在我們產(chǎn)品里的行為軌跡,為產(chǎn)品的迭代、項目的穩(wěn)定提供依據(jù),WHO、WHEN、WHERE、HOW、WHAT 是埋點采集數(shù)據(jù)的基礎(chǔ)維度。

對前端開發(fā)而言,可以監(jiān)控頁面資源加載性能,異常等等,提供了頁面體驗和健康指數(shù),為后續(xù)性能優(yōu)化提供依據(jù),及時上報異常和發(fā)生場景。從而能夠及時修正問題,提高項目質(zhì)量等。

埋點可以大概分為三類:

  1. 無痕埋點- 無差別收集頁面所有信息包括頁面進(jìn)出、事件點擊等等,需要進(jìn)行數(shù)據(jù)沖洗才能獲取到有用信息
  2. 可視化埋點- 根據(jù)生成的頁面結(jié)構(gòu)獲取特定點位,單獨埋點分析
  3. 業(yè)務(wù)代碼手動埋點- 根據(jù)具體復(fù)雜的業(yè)務(wù),除掉上述兩種不能涵蓋的地方進(jìn)行業(yè)務(wù)代碼埋點

代碼埋點可視化埋點無痕埋點
典型場景無痕埋點無法覆蓋到,比如需要業(yè)務(wù)數(shù)據(jù)簡單規(guī)范的頁面場景簡單規(guī)范的頁面場景,
優(yōu)勢業(yè)務(wù)數(shù)據(jù)明確開發(fā)成本低,運營人員可直接進(jìn)行相關(guān)埋點配置無需配置,數(shù)據(jù)可回溯
不足數(shù)據(jù)不可回溯,開發(fā)成本高不能關(guān)聯(lián)業(yè)務(wù)數(shù)據(jù),數(shù)據(jù)不可回溯數(shù)據(jù)量較大,不能關(guān)聯(lián)業(yè)務(wù)數(shù)據(jù)

大部分情況,我們可以通過無痕埋點收集到所有的信息數(shù)據(jù),再配合可視化埋點,能夠具體定位到某一個點位,這樣大部分的埋點信息都據(jù)此分析出來。

在特殊情況下,可以多加上業(yè)務(wù)代碼手動埋點,處理一下特別的場景(大部分情況是走強業(yè)務(wù)與正常的點擊,刷新事件無關(guān)需要上報的信息)

埋點 SDK 開發(fā)

埋點數(shù)據(jù)收集分析

  • 事件基本數(shù)據(jù)
    • 事件發(fā)生時間
    • 發(fā)生時頁面信息快照
  • 頁面
    • 頁面 PV,UV
    • 用戶頁面停留時長
    • 頁面跳轉(zhuǎn)事件
    • 頁面進(jìn)入后臺
    • 用戶離開頁面
  • 用戶信息
    • 用戶 uid
    • 用戶設(shè)備指紋
    • 設(shè)備信息
    • ip
    • 定位
  • 用戶操作行為
    • 用戶點擊
      • 點擊目標(biāo)
  • 頁面 AJAX 請求
    • 請求成功
    • 請求失敗
    • 請求超時
  • 頁面報錯
    • 資源加載報錯
    • JS 運行報錯
  • 資源加載新性能
  • 圖片
  • 腳本
  • 頁面加載性能

上面的數(shù)據(jù)通過 3 個維度來定義埋點事件

  • ·LEVEL: 描述埋點數(shù)據(jù)的日志級別
    • INFO:一些用戶操作,請求成功,資源加載等等正常的數(shù)據(jù)記錄
    • ERROR: JS報錯,接口報錯等等錯誤類型的數(shù)據(jù)記錄
    • DEBUG: 預(yù)留開發(fā)人員通過手動調(diào)用的方式回傳排除bug的數(shù)據(jù)記錄
    • WARN: 預(yù)留開發(fā)人員通過手動調(diào)用的方式回傳非正常用戶行為的的數(shù)據(jù)記錄
  • CATEGORY:描述埋點數(shù)據(jù)的分類
    • TRACK: 埋點SDK對象的生命周期管理整個埋點數(shù)據(jù)。
      • WILL_MOUNT:sdk對象即將初始化加載,生成一個默認(rèn)ID,跟蹤全部相關(guān)事件
      • DID_MOUNTED:sdk對象初始化完成,主要獲取設(shè)備指紋等等的異步操作完成
    • AJAX: AJAX相關(guān)數(shù)據(jù)
    • ERROR:頁面中的異常相關(guān)數(shù)據(jù)
    • PERFORMANCE: 關(guān)于性能相關(guān)數(shù)據(jù)
    • OPERATION: 用戶操作相關(guān)數(shù)據(jù)
  • EVENT_NAME:具體的事件名稱

根據(jù)上述的維度,我們可以簡單設(shè)計如下的架構(gòu)

根據(jù)上圖的架構(gòu),再進(jìn)行下面的具體代碼開發(fā)

代理請求

在瀏覽器中現(xiàn)在主要有 2 種請求方式,一個是 XMLHttpRequest, 一個是 Fetch

代理 XMLHttpRequest
function NewXHR() {  var realXHR: any = new OldXHR(); // 代理模式里面有提到過
  realXHR.id = guid()  const oldSend = realXHR.send;

  realXHR.send = function (body) {
    oldSend.call(this, body)    //記錄埋點
  }
  realXHR.addEventListener('load', function () {    //記錄埋點
  }, false);
  realXHR.addEventListener('abort', function () {    //記錄埋點
  }, false);

  realXHR.addEventListener('error', function () {    //記錄埋點
  }, false);
  realXHR.addEventListener('timeout', function () {    //記錄埋點
  }, false);  return realXHR;
}復(fù)制代碼
代理 Fetch
 const oldFetch = window.fetch;  function newFetch(url, init) {    const fetchObj = {      url: url,      method: method,      body: body,
    }
    ajaxEventTrigger.call(fetchObj, AJAX_START);    return oldFetch.apply(this, arguments).then(function (response) {      if (response.ok) {       //記錄埋點
      } else {       //上報錯誤
      }      return response
    }).catch(function (error) {
      fetchObj.error = error        //記錄埋點      
        throw error
    })
  }復(fù)制代碼

監(jiān)聽頁面的 PVUV

在進(jìn)入頁面時,我們通過算法生成一個唯一 session id,作為這次埋點行為的全局 id,上報用戶 id,設(shè)備指紋,設(shè)備信息。在用戶未登錄的情況下,通過設(shè)備指紋來計算 UV,通過 session id計算 PV。

異常捕獲

異常就是干擾程序的正常流程的不尋常事故

RUNTIME ERROR

JS中可以通過 window.onerrorwindow.addEventListener('error', callback) 捕捉運行時異常,一般使用window.onerror,它兼容性更好。

window.onerror = function(message, url, lineno, columnNo, error) {    const lowCashMessage = message.toLowerCase()    if(lowCashMessage.indexOf('script error') > -1) {      return
    }    const detail = {      url: url    
      filename: filename,      columnNo: columnNo,      lineno: lineno,      stack: error.stack,      message: message
    }    //記錄埋點}復(fù)制代碼
Script Error

在這里我們過濾了 Script Error, 它產(chǎn)生的原因主要是頁面中加載的第三方跨域腳本報錯,比如托管在第三方 cdn 中的 js 腳本。這類問題比較難以排查。解決的方法有:

  • 打開 CORS(Cross Origin Resource Sharing,跨域資源共享),如下步驟
    • 修改Access-Control-Allow-Origin: * | 指定域名
  • 使用 try catch
       //加載crgt腳本,window.crgt = {getUser: () => string}
      try{      window.crgt.getUser();
      }catch(error) {      throw error // 輸出正確的錯誤堆棧
      }復(fù)制代碼
Promise reject

js 在異步異常時無法通過 onerror 方法捕獲 ,在 Promise 對象在 reject 時,同時并沒有進(jìn)行處理時 會拋出一個 unhandledrejection 的錯誤,并不會被上述的方法所捕獲,所以需要添加單獨的處理事件。

window.addEventListener("unhandledrejection", event => {  throw event.reason
});復(fù)制代碼
資源加載異常

在瀏覽器中,可以通過 window.addEventListener('error', callback) 的方式監(jiān)聽資源加載異常,比如 js 或者 css 腳本文件丟失。

window.addEventListener('error', (event) => {  if (event.target instanceof HTMLElement) {    const target = parseDom(event.target, ['src']);    const detail = {      target: target,      path: parseXPath(target),
    }    //  記錄埋點
  }
}, true)復(fù)制代碼

監(jiān)聽用戶行為

通過 addEventListener click 監(jiān)聽 click 事件

window.addEventListener('click', (event) => {    //記錄埋點}, true)復(fù)制代碼

在這里通過組件的 displaName 來定位元素的位置,displaName 表示組件的文件目錄,比如 src/components/Form.js 文件導(dǎo)出的組件 FormItem 通過 babel plugin 自動添加屬性 @components/Form.FormItem,或者使用者主動給組件添加 static 屬性 displayName。

頁面路由變化

  • hashRouter 監(jiān)聽頁面hash變化,對hash進(jìn)行解析
window.addEventListener('hashchange', event => {  const { oldURL, newURL } = event;  const oldURLObj = url.parseUrl(oldURL);  const newURLObj = url.parseUrl(newURL);  const from = oldURLObj.hash && url.parseHash(oldURLObj.hash);  const to = newURLObj.hash && url.parseHash(newURLObj.hash);  if(!from && !to ) return;  // 記錄埋點})復(fù)制代碼

監(jiān)聽頁面離開

通過 addEventListener beforeunload 監(jiān)聽離開頁面事件

window.addEventListener('beforeunload', (event) => {    //記錄埋點})復(fù)制代碼

SDK 架構(gòu)

class Observable {    constructor(observer) {
        observer(this.emit)
    }
    emit = (data) => {        this.listeners.forEach(listener => {
            listener(data)
        })
    }
    listeners = [];
    
    subscribe = (listener) => {        this.listeners.push(listeners);        return () => {            const index = this.listeners.indexOf(listener);            if(index === -1) {                return false
            }            
            this.listeners.splice(index, 1);            return true;
        }
     }
}復(fù)制代碼
const clickObservable = new Observable((emit) => {    window.addEventListener('click', emit)
})復(fù)制代碼

然而在處理 ajax,需要將多種數(shù)據(jù)組合在一起,需要進(jìn)行 merg 操作,則顯得沒有那么優(yōu)雅,也很難適應(yīng)后續(xù)復(fù)雜的數(shù)據(jù)流的操作。

const ajaxErrorObservable = new Observable((emit) => {    window.addEventListener(AJAX_ERROR, emit)
})const ajaxSuccessObservable = new Observable((emit) => {    window.addEventListener(AJAX_SUCCESS, emit)
})const ajaxTimeoutObservable = new Observable((emit) => {    window.addEventListener(AJAX_TIMEOUT, emit)
})復(fù)制代碼

可以選擇 RxJS 來優(yōu)化代碼

export const ajaxError$ = fromEvent(window, 'AJAX_ERROR', true)export const ajaxSuccess$ = fromEvent(window, 'AJAX_SUCCESS', true)export const ajaxTimeout$ = fromEvent(window, 'AJAX_TIMEOUT', true)復(fù)制代碼
ajaxError$.pipe(
    merge(ajaxSuccess$, ajaxTimeout$), 
    map(data=> (data) => ({category: 'ajax', data; data}))
    subscribe(data => console.log(data))復(fù)制代碼

通過 merge, map 兩個操作符完成對數(shù)據(jù)的合并和處理。

數(shù)據(jù)流

項目結(jié)構(gòu)

  • core
    • event$ 數(shù)據(jù)流合并
    • snapshot 獲取當(dāng)前設(shè)備快照,例如url,userID,router
    • track 埋點類,組合數(shù)據(jù)流和日志。
  • logger
    • logger 日志類
      • info
      • warn
      • debug
      • error
  • observable
    • ajax
    • beforeUpload
    • opeartion
    • routerChange
    • logger
    • track

結(jié)尾

自建埋點系統(tǒng)是一個需要前后端一起合作的事情,如果人力不足的情況下,建議使用第三方分析插件,例如 Sentry 就能足夠滿足大部分日常使用。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享埋點系統(tǒng)是什么內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來學(xué)習(xí)!


本文題目:埋點系統(tǒng)是什么
當(dāng)前路徑:http://weahome.cn/article/jspsij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部