浙政釘部分埋點成功排查

前言

相信大部分做浙政釘應用的朋友都必然要經歷一次“埋點部分成功”的坑,怎麼排查?對於老司機可能沒有難度,但是對於第一次做浙政釘應用的新手司機來說,就會有一種無從下手的感覺。因爲你感覺一切都是按照文檔上來的啊,偷偷告訴我你是不是有這種感覺?哈哈哈...
不論大家的埋點都是怎麼操作的,這裏我也介紹一下我這邊的埋點,希望對那些埋點還沒有成功還在苦惱的朋友來說,可以提供一些幫助,早日脫離埋點的坑。
提示:我這邊採用的是vue的單頁面的開發方式,對於其它開發方式僅供參考。

埋點分類

浙政釘埋點代碼分爲:

  • 穩定性監控代碼(Emas):穩定性監控代碼(Emas)只需要在首頁加入
  • 流量分析代碼(A+):流量分析代碼(A+)每個頁面都需要加入。
    • 通用採集SDK
    • 基礎埋點
    • 用戶信息埋點

穩定性監控代碼(Emas)相信基本上都沒有什麼難度,貼在首頁即可。流量分析代碼就需要將它封裝到一個js中,然後每個頁面調用一下即可。

穩定性監控代碼(Emas)

這個埋點幾乎沒有難度,一般應用在審批上架後,浙政釘應用技術人員會給提交審批單的人(一般是業主單位)發送一個文件,文件中包含了:

  • 應用名稱
  • 應用標識
  • 正式的App Key
  • 正式的 App Secret
  • 業主單位的浙政釘租戶Id
  • 正式環境的浙政釘域名
  • 以及埋點的代碼
    • 穩定性監控
    • 通用採集SDK
    • 基礎埋點
    • 用戶信息埋點

我們只用把其中穩定性監控代碼貼到首頁(index.html)head內即可,因爲該穩定性代碼中,已經包含了正式的 bidsignkey。比如:

<script src='https://wpk-gate.zjzwfw.gov.cn/static/wpk-jssdk.1.0.2/wpkReporter.js' crossorigin='true'></script>
<script>
  try {
    const config = {
      bid: 'xxxxxxxxxx',
      signkey: 'xxxxxxxxxxx',
      gateway: 'https://wpk-gate.zjzwfw.gov.cn'
    };
    const wpk = new wpkReporter(config);
    wpk.installAll();
    window._wpk = wpk;
  } catch (err) {
    console.error('WpkReporter init fail', err);
  }
</script>

流量分析代碼(A+)

流量分析代碼每個頁面都要加,但是“通用採集SDK”這塊由於是固定值,所以放在首頁即可。

通用採集SDK

接下來是通用採集SDK的埋點,這一步幾乎也是沒有難點。都是一些固定代碼,我們只用跟着貼在穩定性監控代碼的後邊即可。比如:

(function(w, d, s, q, i) {
    w[q] = w[q] || [];
    var f = d.getElementsByTagName(s)[0],j = d.createElement(s);
    j.async = true;
    j.id = 'beacon-aplus';
    j.src = 'https://alidt.alicdn.com/alilog/mlog/aplus_cloud.js';
    f.parentNode.insertBefore(j, f);
  })(window, document, 'script', 'aplus_queue');

  aplus_queue.push({
    action: 'aplus.setMetaInfo',
    arguments: ['aplus-rhost-v', 'alog.zjzwfw.gov.cn']
  });
  aplus_queue.push({
    action: 'aplus.setMetaInfo',
    arguments: ['aplus-rhost-g', 'alog.zjzwfw.gov.cn']
  });
  
  var u = navigator.userAgent
  var isAndroid = u.indexOf('Android') > -1
  var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)

  aplus_queue.push({
    action: 'aplus.setMetaInfo',
    arguments: ['appId', isAndroid ? '28302650' : isIOS ? '28328447' : '47130293']
  });

大概就是醬紫了

基礎埋點和用戶信息埋點

相信只要是埋點出問題的同學基本上都是這裏的問題,由於這兩塊埋點代碼每個頁面都需要,所以我們將這兩塊代碼封裝到一個js文件中,每次路由切換的時候就調用一下即可。

基礎埋點
// 單頁應用 或 “單個頁面”需異步補充PV日誌參數還需進行如下埋點:
aplus_queue.push({
  action: 'aplus.setMetaInfo',
  arguments: ['aplus-waiting', 'MAN']
});//
// 單頁應用路由切換後 或 在異步獲取到pv日誌所需的參數後再執行sendPV:
aplus_queue.push({
  'action':'aplus.sendPV',
  'arguments':[{
    is_auto: false
  }, {
    // 當前你的應用信息,此兩行請勿修改
    sapp_id: 'xxxx',
    sapp_name: 'xxxxxx',
    //自定義PV參數key-value鍵值對(只能是這種平鋪的json,不能做多層嵌套),
    page_id: '頁面ID,與page 參數配合使用,保證唯一性',
    page_name: '頁面中文名稱',
    page_url: '頁面URL'
  }]
})

分析:

  • sapp_id:該值在浙政釘給的正式配置文件中可以找到
  • sapp_name:同上
  • page_id:每個頁面的唯一ID,可以使用頁面組件名稱,因爲它也項目中也是唯一的
  • page_name:每個頁面的中文名稱,vue中頁面的中文名即可
  • page_url:頁面Url,vue中傳該頁面的路由即可

我這邊的處理方式是,先在路由那邊每個頁面路由添加一個meta,包含了id和title兩個屬性,這樣每個頁面調用封裝方法的時候只用把路由傳過去就可以取到 page_id、page_name、page_url。比如:

封裝的方法:

我這邊創建了一個 baseAplus.js 文件,具體內容如下,有兩點需要注意:

  1. settings 是一個配置文件,我把sapp_id和sapp_name寫在了其中
  2. local-cache 是封裝的一個緩存類,首次打開應用的時候將獲取到的浙政釘用戶信息緩存到localStorage中, getUserInfoCache 就是獲取緩存的用戶信息。
  3. 會員暱稱和會員ID的埋點中,注意大小寫,浙政釘文檔上返回的是小駝峯,我這邊後端反序列化的成了大駝峯,這裏需要注意。具體看你們那邊情況。
import GLOBAL from '../settings'
import { getUserInfoCache } from './local-cache'

/**
 * 添加基礎埋點
 * @param {object} route 路由
 */
export function addBaseAplus(route) {
    //基礎埋點
    // 單頁應用 或 “單個頁面”需異步補充PV日誌參數還需進行如下埋點:
    aplus_queue.push({
        action: "aplus.setMetaInfo",
        arguments: ["aplus-waiting", "MAN"],
    });

    // 單頁應用路由切換後 或 在異步獲取到pv日誌所需的參數後再執行sendPV:
    aplus_queue.push({
        action: "aplus.sendPV",
        arguments: [
            {
                is_auto: false,
            },
            {
                // 當前你的應用信息,此兩行請勿修改
                sapp_id: GLOBAL.sapp_id,
                sapp_name: GLOBAL.sapp_name,
                // 自定義PV參數key-value鍵值對(只能是這種平鋪的json,不能做多層嵌套),如:
                page_id: route.meta.id,
                page_name: route.meta.title,
                page_url: route.path,
            },
        ],
    });

    //用戶信息埋點
    // 如採集用戶信息是異步行爲需要先執行這個BLOCK埋點
    aplus_queue.push({
        action: 'aplus.setMetaInfo',
        arguments: ['_hold', 'BLOCK']
    });

    let userInfo = getUserInfoCache();

    // 設置會員暱稱
    aplus_queue.push({
        action: "aplus.setMetaInfo",
        arguments: ["_user_nick", userInfo.NickNameCn]
    });

    // 設置會員ID
    aplus_queue.push({
        action: "aplus.setMetaInfo",
        arguments: ["_user_id", userInfo.AccountId]
    });

    // dd.getUUID().then(res => {
    //     aplus_queue.push({
    //         action: "aplus.setMetaInfo",
    //         arguments: ["_dev_id", "設備ID是業務定義的,用於定義唯一的設備標識。這個目前沒有要求,可不設置。"]
    //     });
    // })

    // 如採集用戶信息是異步行爲,需要先設置完用戶信息後再執行這個START埋點
    // 此時被block住的日誌會攜帶上用戶信息逐條發出
    aplus_queue.push({
        action: 'aplus.setMetaInfo',
        arguments: ['_hold', 'START']
    });
}

頁面調用

每個頁面都要這樣調用!!!
每個頁面都要這樣調用!!!
每個頁面都要這樣調用!!!

埋點部分成功

完成埋點後,等待浙政釘埋點數據的更新,羣裏說通常是下午五六點的樣子。然後可以到 宜搭 上查看埋點情況。
穩定性監控基本上都能成功,如果流量分析中引用出現在左邊則說明成功,如果出現在右邊則說明只有部分成功,就需要排查了。比如:

成功示例:

失敗示例:

排查方法

可以參考 https://www.yuque.com/docs/share/a2ca4143-dba7-4b8e-8bf5-f0746a7214c3#ljnli 文檔中,上報日誌API塊文檔。
但是對於那些沒有排查過的同學來說,按照文檔中的方法看到了日誌也不知道對不對,就像該文檔的評論中說的那樣“聽君一席話,如聽一席話”,寫的不是一般的難懂。

其實,新同學只是不知道日誌的關注點是什麼,搞懂這個就可以了。這個其實在文檔中的“埋點注意h事項及FAQ”中已經有提及。

16)
我們可以一個一個排除:

  • 確保前邊“基礎埋點和用戶信息埋點”一節中封裝的方法在每個頁面都有調用。
  • page_id、page_name、page_url、用戶信息等參數的排查。確保page_id唯一(檢查路由配置)、page_url和page_name按照要求填寫。
  • 確保用戶信息有上報,其實大部分可能都是因爲 _user_id 爲空導致的。

由於本地無法通過 dd.getAuthCode({}) 獲取免登授權碼,該方法只能在浙政釘環境或專有釘釘環境可以調用,所以也就無法在本地獲取用戶信息。
但是我們可以在後端獲取浙政釘用戶信息接口處添加一個日誌,記錄一下傳進來的免登授權碼,然後把該值寫到前端,繞過 dd.getAuthCode({}) 方法,直接調用獲取用戶信息接口,這樣本地就可以拿到浙政釘或專有釘釘的用戶信息了。然後就可以按照 語雀文檔 上說的那樣獲取到上報日誌。查看(page_id、page_name、page_url和用戶信息)這幾項是否有傳即可。

等理解後,是不是發現其實也沒那麼難。

寫在最後

如果你覺的哪裏寫的不清楚的,可以提出來,我儘量再補充一下,儘量每個人都可以看的懂。
如果這篇文章解決了您的埋點問題,麻煩給個贊。
踩過坑,纔會覺得如果有個人能給予指點,那是多麼幸福的一件事啊!
最後,看着桌面上掉落的頭髮,感覺自己又變強許多!!

如果您覺得這篇文章有幫助到你,歡迎推薦,也歡迎關注我的公衆號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章