前端埋點

来源:https://www.cnblogs.com/yangsg/archive/2020/07/08/13266601.html
-Advertisement-
Play Games

前端埋點主要是為了服務運營人員採集用戶行為數據,進行後續的數據分析工作。 前端監控和埋點能做什麼 數據監控(用戶行為) pv,uv 記錄操作系統 用戶在每一個頁面的停留時間(離開頁面,進入頁面) 用戶進入的入口 用戶在相應頁面的觸發行為,點擊按鈕 性能監控 (js中的performance) 用戶的 ...


 
前端埋點主要是為了服務運營人員採集用戶行為數據,進行後續的數據分析工作。

前端監控和埋點能做什麼

  • 數據監控(用戶行為)
    • pv,uv
    • 記錄操作系統
    • 用戶在每一個頁面的停留時間(離開頁面,進入頁面)
    • 用戶進入的入口
    • 用戶在相應頁面的觸發行為,點擊按鈕
  • 性能監控 (js中的performance)
    • 用戶的首屏載入
    • http請求響應時間
    • 頁面渲染時間
    • 頁面交互動畫完成時間 關鍵代碼
let timing = performance.timing,
start = timing.navigationStart,
dnsTime = 0,
tcpTime = 0,
firstPaintTime = 0,
domRenderTime = 0,
loadTime = 0;
//DNS解析時間
dnsTime = timing.domainLookupEnd - timing.domainLookupStart;
//TCP建立時間
tcpTime = timing.connectEnd - timing.connectStart;
//首屏時間
firstPaintTime = timing.responseStart - start;
//dom渲染完成時間
domRenderTime = timing.domContentLoadedEventEnd - start;
//頁面onload時間
loadTime = timing.loadEventEnd - start;

 

| 功能變數名稱( domain ) | javascript | document.domain ;獲取的值如:"domain" : "127.0.0.1" | | URL (url) | javascript | document.URL;獲取的值如:"url" : "http://127.0.0.1:3000/" | | 頁面標題 (title) | javascript | document.title;獲取的值如:"title" : "Express"; | | 上一跳url、referrer (referrer) | javascript | document.referrer;獲取的值如:"referrer" : "" ; | | 解析度 (height:sh; width: sw) | javascript | window.screen.height & width; 獲取的值如:"sh" : "1050" ,"sw" : "1680"; | | 顏色深度 (cd) | javascript | window.screen.colorDepth; 獲取的值如:"cd" : "32"; | | 客戶端語言 (lang) | javascript | navigator.language;獲取的值如:"lang" : "zh-CN"; | | user-agent header(userAgent) | javascript | navigator.userAgent;獲取的值如:"userAgent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36"; |

現有的前端埋點方案總結

  • 手動埋點 1.命令埋點,前端代碼中需要監控的地方插入監控邏輯
    // 頁面載入時發送埋點請求
    $(document).ready(function(){
    // ... 這裡存在一些業務邏輯
    sendRequest(params);
    });
    // 按鈕點擊時發送埋點請求
    $('button').click(function(){
    // 這裡存在一些業務邏輯
    sendRequest(params);
    });

     

    2.聲明式埋點 聲明式埋點的思路是將埋點代碼和具體的交互和業務邏輯解耦,開發者只用關心需要埋點的控制項,並且為這些控制項聲明需要的埋點數據即可,從而降低埋點的成本 ,在dom元素上增添埋點信息,如下 // key表示埋點的唯一標識;act表示埋點方式 <button data-stat="{key:'111', act: 'click'}">埋點</button>
  • 相比命令式埋點,不至於傻瓜式的在哪監控在哪埋點
  • 遍歷dom樹,找到[data-stat]元素的節點,綁定click事件,將[data-stat]上的信息發送給伺服器
  • 缺點: 1.遍歷DOM樹的時機問題,一個簡單的例子,一個表格的行數據是通過非同步載入,而表格行中的操作按鈕需要埋點,那麼在DOM ready的時候去遍歷,顯然是無法找到的 2.綁定埋點事件次數的問題,怎樣保證埋點事件不會被重覆綁定到元素上,一次操作發了N個埋點請求 重覆工作很多,還要處理冒泡。
  • 可視化埋點 業內開源解決方案:Mixpanel 與配套的可視化頁面搭建和 運營通過可視化的界面拖拽配置實現,這些活動控制項元素都帶有唯一標識。通過埋點配置後臺,將元素與要採集事件關聯起來,可以自動生成埋點代碼嵌入到頁面中。
  • 全埋點 無埋點則是前端自動採集全部事件,上報埋點數據,由後端來過濾和計算出有用的數據,優點是前端只要一次載入埋點腳本。缺點是流量和採集的數據過於龐大,伺服器性能壓力山大,主流的 GrowingIO 就是這種實現方案。
SDK就會自動追蹤頁面上的按鈕(a、button、input) 這種html標簽類型的點擊情況,一旦頁面某一個按鈕發生了點擊行為,SDK就會去採集此按鈕的一些信息,例如: 這個按鈕的標簽類型,這個按鈕的文本內容,這個按鈕的name,這個按鈕的id、class名,還有一些按鈕特有的屬性如href等。 比如click事件,在document上綁定click,在事件中的捕獲階段進行綁定,即使按鈕元素取消冒泡了,也跟不會影響捕獲階段的傳遞(在頁面中點擊一個元素,事件是從這個元素的祖先元素中逐層傳遞下來的,這個階段為事件的捕獲階段。當事件傳遞到這個元素之後,又會把事件逐成傳遞迴去,直到根元素為止,這個階段是事件的冒泡階段 ) 事件標識?怎麼唯一定位到某個頁面的元素,設定一個根節點,根節點到這個元素自頂向下的屬性名 缺點:dom結構可能會變,class 名字, 元素嵌套,很難唯一定位到
  • 美團實現方案 70%全埋點 + 30%手動埋點
在不同場景下我們需要選擇不同的埋點方案。例如對於簡單的用戶行為類事件,可以使用全埋點解決;而對於需要攜帶大量運行時才可獲知的業務欄位的埋點需求,就需要聲明式埋點來解決。從更高的層面來看

思考

前端路由
前端路由通過‘#’錨點,其本來加在URL中指示網頁的位置的,hash雖然出現在URL中,但不會被包括在HTTP請求中。它是用來指導瀏覽器動作的,對伺服器端完全無用,因此,改變hash不會重新載入頁面。 改寫history.replaceState
 

數據上傳方式

  • img標簽上傳
  • ajax
    • 帶來跨域問題

參考

免費開源的前端監控平臺(github):https://github.com/kisslove/web-monitoring    


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 腳本文件是utf-8,mysql資料庫utf-8; 運行mysql文件,在navicat打開,中文註釋亂碼 解決方法如下: 5.5和5.6版本修複中文亂碼後,運行mysql刪除腳本,資料庫存在遺漏的數據表 (遺漏數據表中存在主外鍵關係) 1.查詢資料庫的編碼格式 show variables lik ...
  • 教程 Flutter 和桌面應用的最新進展 譯】Flutter vs React Native vs Native:深度性能比較 Flutter 中的圖文混排與原理解析 告別 Flutter Channel,調用 Native API 僅需一行代碼! Flutter 核心原理與混合開發模式 我們用 ...
  • AJAX Asynchronous Javascript And XML"(非同步 JavaScript 和 XML),是指一種創建互動式網頁應用的網頁開發技術。通過在後臺與伺服器進行少量數據交換,Ajax 可以使網頁實現非同步更新。意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。傳統的 ...
  • ​互聯網的高速發展促使互聯網企業對於網站等頁面的用戶體驗要求也越來越高,導致網站開發難度越來越大,於是一個新興職業應運而生——web前端工程師。因為互聯網時代的高速發展,公司企業的迫切需求web前端工程師,web人才成為各大公司名企爭搶的“香餑餑”。 ...
  • 簡介 http-server是一個簡單的零配置命令行http伺服器。 它足夠強大,足以用於生產用途,但它既簡單又易於破解,可用於測試,本地開發和學習 應用場景 1、區域網訪問靜態頁面 訪問本地電腦中的文件都是基於file協議,如果要開放我們的本地文件給區域網人員訪問,是不能使用file協議。得用h ...
  • 今天為什麼要給大家講解這個東西呢,因為css這部分,尤其是數值這部分感覺非常簡單,但是尤其是簡單的,卻很多人根本就沒有弄懂。所以今天就來講一下css的數值問題吧。大家還是好好聽一下吧。 width height 百分比 當元素的height、width設置為百分比時,分別基於包含它的塊級對象的高度、 ...
  • 今天面試了一個前端實習生,我問了一個比較簡單的問題,就是css如何實現元素垂直居中的問題,但是要說出多種方案。其實他說的不錯,基本上說到了flex佈局,grid佈局等下麵提到的佈局。還不錯,但是這幾種都是已經經常用的,老生常談,但是我想聽到他說一種用的比較少的解決方案,瞭解一下他學習的深度和廣度。但 ...
  • 許多同學是不是還在徘徊、猶豫、糾結的階段,想學怕學不好,甚至不知從何入手,下麵這篇文章幫助想轉行前端及想學好Web前端開發的同學們解決心中的困惑。 1HTML的學習 超文本標記語言(HyperTextMark-up Language簡稱HTML)是一個網頁的骨架,無論是靜態網頁還是動態網頁,最終返回 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...