記錄--百分百空手接大鍋

来源:https://www.cnblogs.com/smileZAZ/archive/2023/07/21/17572049.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 愉快的雙休周末剛過完,早上來忽然被運營通知線上業務掛了,用戶無法下單。卧槽,趕緊進入debug模式,一查原來是服務端返回的數據有問題,趕緊問了服務端,大佬回覆說是業務部門配置套餐錯誤。好在主責不在我們,不過趕緊寫了復盤文檔,主動找自 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

背景

愉快的雙休周末剛過完,早上來忽然被運營通知線上業務掛了,用戶無法下單。卧槽,趕緊進入debug模式,一查原來是服務端返回的數據有問題,趕緊問了服務端,大佬回覆說是業務部門配置套餐錯誤。好在主責不在我們,不過趕緊寫了復盤文檔,主動找自己的責任,扛起這口大鍋,都怪我們前端,沒有做好前端監控,導致線上問題持續兩天才發現。原本以為運營會把推辭一下說不,鍋是她們的,可惜人家不太懂人情世故,這鍋就扣在了技術部頭上。雖然但是,我還是靜下心來把前端異常監控搞了出來,下次一定不要主動接鍋,希望看到本文的朋友們也不要隨便心軟接鍋^_^

監控

因為之前基於sentry做了埋點處理,基礎已經打好,支持全自動埋點、手動埋點和數據上報。相關的原理可以參考之前的一篇文章如何從0-1構建數據平臺(2)- 前端埋點。本次監控的數據上報也基於sentry.js。那麼如何設計整個流程呢。具體步驟如下:

  1. 監控數據分類

  2. 監控數據定義

  3. 監控數據收集

  4. 監控數據上報

  5. 監控數據輸出

  6. 監控數據預警

數據分類

我們主要是前端的數據錯誤,一般的異常大類分為邏輯異常和代碼異常。基於我們的項目,由於涉及營收,我們就將邏輯錯誤專註於支付異常,其他的代碼導致的錯誤分為一大類。然後再將兩大異常進行細分,如下:

  1. 支付異常

    1.1 支付成功

    1.2 支付失敗

  2. 代碼異常

    2.1 bindexception

 2.1.1  js_error

 2.1.2  img_error

 2.1.3  audio_error

 2.1.4  script_error

 2.1.5 video_error
  1. unhandleRejection

    3.1 promise_unhandledrejection_error

    3.2 ajax_error

  2. vueException

  3. peformanceInfo

數據定義

基於sentry的上報數據,一般都包括事件與屬性。在此我們定義支付異常事件為“page_h5_pay_monitor”,定義代碼異常事件為“page_monitor”。然後支付異常的屬性大概為:

    pay_time,

    pay_orderid,

    pay_result,

    pay_amount,

    pay_type,

    pay_use_coupon,

    pay_use_coupon_id,

    pay_use_coupon_name,

    pay_use_discount_amount,

    pay_fail_reason,

    pay_platment
代碼異常不同的錯誤類型可能屬性會有所區別:
    // js_error

    monitor_type,

    monitor_message,

    monitor_lineno,

    monitor_colno,

    monitor_error,

    monitor_stack,

    monitor_url

    // src_error

    monitor_type,

    monitor_target_src,

    monitor_url

    // promise_error

    monitor_type,

    monitor_message,

    monitor_stack,

    monitor_url

    // ajax_error

    monitor_type,

    monitor_ajax_method,

    monitor_ajax_data,

    monitor_ajax_params,

    monitor_ajax_url,

    monitor_ajax_headers,

    monitor_url,

    monitor_message,

    monitor_ajax_code

    // vue_error

    monitor_type,

    monitor_message,

    monitor_stack,

    monitor_hook,

    monitor_url

    // peformanceInfo 為數據添加 loading_time 屬性,該屬性通過entryTypes獲取

    try {

        const observer = new PerformanceObserver((list) => {

            for (const entry of list.getEntries()) {

                if (entry.entryType === 'paint') {

                    sa.store.set('loading_time', entry.startTime)

                }
            }

        })

        observer.observe({ entryTypes: ['paint'] })

    } catch (err) {

        console.log(err)

    }

數據收集

數據收集通過事件綁定進行收集,具體綁定如下:

import {

    BindErrorReporter,

    VueErrorReporter,

    UnhandledRejectionReporter

} from './report'

const Vue = require('vue')


// binderror綁定

const MonitorBinderror = () => {

    window.addEventListener(

    'error',

    function(error) {

        BindErrorReporter(error)

    },true )

}

// unhandleRejection綁定 這裡由於使用了axios,因此ajax_error也屬於promise_error

const MonitorUnhandledRejection = () => {

    window.addEventListener('unhandledrejection', function(error) {

        if (error && error.reason) {

            const { message, code, stack, isAxios, config } = error.reason

            if (isAxios && config) {

                // console.log(config)

                const { data, params, headers, url, method } = config

                UnhandledRejectionReporter({

                isAjax: true,

                data: JSON.stringify(data),

                params: JSON.stringify(params),

                headers: JSON.stringify(headers),

                url,

                method,

                message: message || error.message,

                code

                })

            } else {

                UnhandledRejectionReporter({

                isAjax: false,

                message,

                stack

                })

            }

        }

    })

}

// vueException綁定

const MonitorVueError = () => {

    Vue.config.errorHandler = function(error, vm, info) {

        const { message, stack } = error

        VueErrorReporter({

            message,

            stack,

            vuehook: info

        })

    }

}

// 輸出綁定方法

export const MonitorException = () => {

    try {

        MonitorBinderror()

        MonitorUnhandledRejection()

        MonitorVueError()

    } catch (error) {

        console.log('monitor exception init error', error)

    }

}

數據上報

數據上報都是基於sentry進行上報,具體如下:

/*

* 異常監控庫 基於sentry jssdk

* 監控類別:

* 1、window onerror 監控未定義屬性使用 js資源載入失敗問題

* 2、window addListener error 監控未定義屬性使用 圖片資源載入失敗問題

* 3、unhandledrejection 監聽promise對象未catch的錯誤

* 4、vue.errorHandler 監聽vue腳本錯誤

* 5、自定義錯誤 包括介面錯誤 或其他diy錯誤

* 上報事件: page_monitor

*/

// 錯誤類別常量

const ERROR_TYPE = {

    JS_ERROR: 'js_error',

    IMG_ERROR: 'img_error',

    AUDIO_ERROR: 'audio_error',

    SCRIPT_ERROR: 'script_error',

    VIDEO_ERROR: 'video_error',

    VUE_ERROR: 'vue_error',

    PROMISE_ERROR: 'promise_unhandledrejection_error',

    AJAX_ERROR: 'ajax_error'

}

const MONITOR_NAME = 'page_monitor'

const PAY_MONITOR_NAME = 'page_h5_pay_monitor'

const MEMBER_PAY_MONITOR_NAME = 'page_member_pay_monitor'

export const BindErrorReporter = function(error) {

    if (error) {

        if (error.error) {

            const { colno, lineno } = error

            const { message, stack } = error.error

            // 過濾

            // 客戶端會有調用calljs的場景 可能有一些未知的calljs

            if (message && message.toLowerCase().indexOf('calljs') !== -1) {

                return

            }

            sa.track(MONITOR_NAME, {

            //屬性

            })

        } else if (error.target) {

            const type = error.target.nodeName.toLowerCase()

            const monitorType = type + '_error'

            const src = error.target.src

            sa.track(MONITOR_NAME, {

            //屬性

            })

        }

    }

}

export const UnhandledRejectionReporter = function({

    isAjax = false,

    method,

    data,

    params,

    url,

    headers,

    message,

    stack,

    code

}) {

        if (!isAjax) {

            // 過濾一些特殊的場景

            // 1、自動播放觸發問題

            if (message && message.toLowerCase().indexOf('user gesture') !== -1) {

                return

            }

            sa.track(MONITOR_NAME, {

                //屬性

            })

        } else {

            sa.track(MONITOR_NAME, {

                //屬性

            })

        }

    }

    export const VueErrorReporter = function({ message, stack, vuehook }) {

    sa.track(MONITOR_NAME, {

        //屬性

    })

}

export const H5PayErrorReport = ({

    isSuccess = true,

    amount = 0,

    type = -1,

    couponId = -1,

    couponName = '',

    discountAmount = 0,

    reason = '',

    orderid = 0,

}) => {

    // 事件名:page_member_pay_monitor

    sa.track(PAY_MONITOR_NAME, {

        //屬性

    })

}

以上,通過sentry的sa.track進行上報,具體不作展開

輸出與預警

數據被上報到大數據平臺,被存儲到hdfs中,然後我們直接做定時任務讀取hdfs進行一定的過濾通過釘釘webhook輸出到釘釘群,另外如果有需要做數據備份可以通過hdfs到數據倉庫再到kylin進行存儲。

總結

數據監控對於大的,特別是涉及營收的平臺是必要的,我們在設計項目的時候一定要考慮到,最好能說服服務端,讓他們服務端也提供相應的代碼監控。ngnix層或者雲端最好也來一層。嚴重的異常可以直接給你打電話,目前雲平臺都有相應支持。這樣有異常及時發現,鍋嘛,接到手裡就可以精準扔出去了。

本文轉載於:

https://juejin.cn/post/7244363578429030459

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


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

-Advertisement-
Play Games
更多相關文章
  • **註:** Silverlight工作流控制項,如果在網頁中打不開,則要判斷是否缺少`Silverlight工作流控制項`的插件程式,如果不是則可以進行一下步驟檢查,如果是以下原因則是:由於IIS版本問題,安裝後可能出現不支持wcf服務的請求處理,需要手動添加處理程式;資料庫客戶端如果是64位,需要修 ...
  • 今天給大家分享一下STM32 流水燈簡單的模擬吧,我感覺這個提供有用的,但是自己也是第一次使用,主要是感覺曲線很高級。在PWM中查看脈寬很有用。 code: led.c #include "led.h"#include "delay.h"/*GPIO的控制寄存器的配置1、配置輸出引腳2、打開對應的輸 ...
  • # clion申請教育認證 ## 1、註冊jetbrains賬號 [jetbrains註冊賬號網站鏈接](https://account.jetbrains.com/login) ![picture 1](https://img2023.cnblogs.com/blog/2915785/202307 ...
  • 一、多表關係 一對多或者多對一 案例:部門與員工的關係 關係:一個部門對應多個員工,一個員工對應一個部門(不考慮跨部門的特殊情況) 實現:在多的一方建立外鍵,指向一的一方的主鍵,這裡員工表是多的的一方,部門表是一的一方 多對多 案例:學生與課程的關係 關係:一個學生可以選修多門課程,一門課程也可以供 ...
  • ORALCE substr函數及substrb與字元集關係 語法 函數用途: SUBSTR函數用來截取從源字元(參數 char)中截取一部分目標字元,截取方式為限定從源字元截取起始位置(參數 positon),並限定截取目標字元長度(參數 substring_length)。substr系列函數計算 ...
  • ## 簡述 本文主要介紹使用 [CloudCanal](https://www.clougence.com?kw=cnblogs_20230721) 做數據遷移同步時如何對特定數據做脫敏處理。 ## 技術點 ### 自定義代碼 CloudCanal 允許用戶上傳業務代碼到數據任務中,完成數據遷移、同 ...
  • 一、哪些因素會成為系統的瓶頸 CPU:如果存在大量的計算,他們會長時間不間斷的占用CPU資源,導致其他資源無法爭奪到CPU而響應緩慢,從而帶來系統性能問題,例如頻繁的FullGC,以及多線程造成的上下文頻繁的切換,都會導致CPU繁忙,一般情況下CPU使用率<75%比較合適。 記憶體:Java記憶體一般是 ...
  • 我們智能客服知識庫機器人已經開發完成,後端資料庫是使用的qdrant向量資料庫,但是該資料庫並沒有導出備份功能,所以我按簡單的純前端實現知識庫導出excel數據 使用第三方庫(如SheetJS) SheetJS是一個流行的JavaScript庫,可幫助處理Excel文件。您可以使用SheetJS來將 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...