-
打點 需求 : 每新上一個功能,數據產品便會同步加上打點需求,當數據打點上線后一段時間,數據產品/業務產品便會針對數據的轉化率分析和對業務需求的調整;
-
打點正確性驗證 :當某一天數據轉化率大幅度變化不符合預期,數據產品/業務產品便會和開發確認打點的位置是否出現紕漏;
-
線上問題排查 : 接到上報一個線上問題,然而開發們卻無法重現該case,此時需要有線上對應該case的數據才能進一步分析問題,倘若沒有數據,那這個問題很可能將變成一樁“懸案”,便會遭受多合作方的質疑和對于業務穩定性的安全感大大降低。
由此數據是很重要的,我們接下來從數據采集的重要性、數據的劃分、采集方式以及在微信小程序中的埋點方案幾個方面來一起詳細聊一下數據采集。
一、數據采集的重要性
本篇我們重點討論數據采集,暫不詳細論證數據的作用,先歸納總結一下數據對于性能優化、業務增長和線上問題排查的重要作用,這也是我們為什么需要埋點的原因。
數據對于線上問題排查的作用:
-
用戶行為數據還原“現場”,幫助分析和定位問題,提高問題定位效率
-
對于問題分析提供有力證據
數據對于性能優化的作用:
-
幫助發現和監控在線業務的關鍵成功指標
-
幫助發現最需要優化環境及其優先順序
-
幫助發現所面臨的挑戰的信息和改進決策
-
幫助提供對應用測試和優化更好的分析
數據對于業務增長的作用:
-
幫助衡量市場營銷效果
-
幫助發現激活轉化效果的策略
-
幫助發現用戶留存和用戶活躍分析
-
幫助產品營收變現分析
二、采集數據劃分梳理
從第一大點,我們總結了數據的重要性,不同的業務項目對于數據重要性的側重點會有不同,那數據采集到底要采集哪些數據呢?
首先閉環數據包括:
-
用戶行為
-
用戶信息、CRM(客戶關系)
-
交易數據、服務端日志數據
以上三項數據,才算是一個完整數據流閉環,當然不同的業務場景中數據還可以再更細劃分,大體的關鍵點基本不超出這三項。對于前端的數據收集來講,閉環數據中前兩項主要由客戶端上報數據,而第三點主要由服務端記錄數據,客戶端輔助,因為交易請求真正到達服務端完成處理才算是完成交易的一個閉環。用戶行為數據又包括——時間(when)、地點(where)、人物(who)、交互(how)、交互內容(what)五個要素,和新聞五要素有點類似;用戶信息有的業務涉及到用戶敏感信息和隱私等需要授權,所以用戶信息由業務場景定奪具體維度,最基本的數據需求是能唯一標識用戶;CRM、交易數據和用戶信息類似,具體所需數據細節由業務場景定奪,CRM基本數據需求是登陸信息、會員相關信息,交易數據包括——交易時間、交易對象、交易內容、交易金額、交易狀態。
三、數據上報方式
聊完數據,下一步便是需要知道如何獲取到我們真正所需要的數據。數據上報方式大體上可以歸為三類:
-
第一類是代碼埋點,即在需要埋點的節點調用接口直接上傳埋點數據,友盟、百度統計等第三方數據統計服務商大都采用這種方案;
-
第二類是可視化埋點,即通過可視化工具配置采集節點,在前端自動解析配置并上報埋點數據,從而實現所謂的“無痕埋點”, 代表方案是已經開源的 Mixpanel ;
-
第三類是“無埋點”,它并不是真正的不需要埋點,而是前端自動采集全部事件并上報埋點數據,在后端數據計算時過濾出有用數據,代表方案是國內的GrowingIO。
重點討論無埋點,可視化埋點其實可以算是無埋點的一個衍生故可視化埋點在此不討論,主要對比代碼埋點與無埋點。
3.1代碼埋點或Capture模式的埋點缺點
對于數據產品來說:
-
依賴人的經驗和直覺判斷。
業務相關的埋點位置需要數據產品或者業務產品主觀判斷,技術相關的埋點則需要技術人員主觀判斷。
-
溝通成本高
數據產品確定所需要的數據,需要提出需求與開發溝通,且數據人員對技術不是特別熟悉,還需與開發人員明確相關信息否能上報的可行性。
-
存在數據清洗成本
隨著業務更迭變化,之前主觀判斷所需的數據會存在更改變化,此時對之前打點的數據就需要手動清洗,且清洗的工作量占比并不小。
對于開發來說:
-
開發人員精力消耗
埋點對于業務團隊來說,常常被相關開發人員所詬病。開發技術人員不能只關注技術,還需分散精力做埋點這樣高度重復且機械性的任務。
-
埋點相關代碼侵入性強,對系統設計和代碼可維護性造成負面影響
大部分的業務相關數據點都需要手動埋點完成,埋點代碼不得不與業務代碼強耦合在一起。即使業界已有無埋點sdk,數據產品關注的業務特殊點也逃離不了手動埋點。
在業務不斷變化下對數據的需求變更,埋點相關代碼也需要跟著變化。進一步增加開發和代碼維護成本。
-
易錯、漏
由于人工打點存在主觀意識差異,打點位置的準確度難控,且易漏數據
-
存在打點流程成本
當數據漏采或錯采時,又要經歷一遍開發流程和上線流程,效率低下。
3.2無埋點優勢
與手動埋點相比較,無埋點優勢便不用多解釋。
-
提高效率
-
數據更全面,按需提取
-
減少代碼侵入
四、微信小程序無埋點sdk方案
4.1 無埋點數據需求
-
小程序的初始化執行情況上報
-
接口請求上報
-
錯誤上報
-
用戶行為上報

由于小程序不同于web服務,不存在js /css資源加載一說,所以更關注的是小程序初始化狀態和執行情況的記錄和捕獲上報情況,圖中資源完整性檢查對應 初始化完成性檢查。 線上小程序中的請求域名都必須是https協議的,故dns劫持概率大大降低甚至不大可能發生,且從客戶端監控DNS劫持可行性較低(存在悖論),暫不考慮DNS劫持捕獲情況。
4.2 針對微信小程序開發無埋點sdk的難點及重點
-
無法直接攔截/監聽請求
微信請求統一通過微信API完成 ,請求模塊已被微信方封裝,且小程序的運行環境不是瀏覽器對象,不像web應用那樣重寫封裝很自如。
-
三種運行環境的監控兼容性保證
-
Android 上,js運行環境是 X5 內核
-
iOS 上,js 運行環境是 JavaScriptCore
-
開發工具上, j s運行環境是 nwjs(chrome內核)
-
用戶行為無法直接監聽
-
強拓展性
需要適用于多種架構設計場景(小程序)下使用
-
sdk需輕量
每個小程序的包存在2M的限制,并且小程序并不支持在代碼中引入npm包,故sdk本身會占用2M的大小限制。雖然小程序有分包的內測,但該功能未完全放開,再者作為一個sdk體積過大也是不合理的。
-
數據收集量大,盡量減少性能損耗
-
不影響業務(基本需求)
4.3 微信小程序無埋點sdk設計
數據層設計:

數據流走向設計:

采集方式設計:

接入方式:
在小程序初始化代碼之前引入sdk npm包代碼,小程序打包代碼時將sdk代碼引入到項目中初始化后即可自動打點收集數據。初始化例子如下:
import Prajna from './lib/prajna-wxapp-sdk.js';
Prajna.init({channel: 'channel',env: config.IS_PRODUCION ? 'product': 'beta',project: 'yourProjectName',methodConfg: {} // 業務特殊關注的方法執行和自定義打點名稱})
無埋點結合埋點:
小程序的無埋點方式,可以獲取到大量的數據基本可以做到用戶使用場景的高度還原。SDK打點的粒度是到某個方法的執行,對于業務特殊關注點的粒度小于SDK粒度時無法單純靠SDK無埋點完全解決,可采用無埋點和埋點相結合,故我們的小程序無埋點SDK也提供手動埋點的API接口,完善數據的完整程度,進而解決更多的問題(回顧參照數據重要性提到的作用)。
五、小程序無埋點SDK中遇到的問題
除了解決了前文提到的 針對微信小程序開發無埋點sdk的難點及重點 所面臨的問題外,還遇到了一些新的問題。
-
SDK本身會對業務性能造成一定成都影響,數據暫存放在了小程序的localstorage中,多次較頻繁的存/取小程序的localstorage在業務方本身較耗費性能的情況下會暴露出操作卡頓問題。減少localstorage的存/取操作,只在頁面關閉時未上傳的數據才存入localstorage
-
全量無埋點的數據量龐大,灰度上線時遇到過服務器過載導致服務器可用性下降的問題。后續對于數據上報的量有所控制,只自動上報關鍵節點數據,其他業務關注節點可通過接入初始化時針對性配置再上報,避免上報過多冗余數據。此外對于上報數據結構的設計也需要尤為注意,結構目標是要清晰、簡潔、便于數據檢索(區分)。
-
初期原本想針對灰度上線做一個SDK使用與否的“開關”,避免小程序回滾流程。由于“開關”依賴server接口控制,而請求是異步的,意味著初始化過程以及小程序啟動都必須等到控制開關的接口返回才可進行,否則“開關”就相當于失效的。 考慮到SDK不能影響到業務性能,丟棄“開關”,在SDK內部做好try、catch,避免對業務可用性造成影響。
有了無埋點上報獲得數據,后續便可以利用數據來解決很多問題。對于數據的利用請期待下節——數據的應用篇。