<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          有贊移動Crash平臺建設(shè)

          共 5506字,需瀏覽 12分鐘

           ·

          2020-08-28 22:45




          ?
          ?

          作者:王劍標(biāo)

          部門:電商移動


          背景 & 痛點 & 價值

          穩(wěn)定性始終會是一家成功公司的重要指標(biāo),在移動端亦是如此。跟大部分創(chuàng)業(yè)公司一樣,有贊在創(chuàng)業(yè)初期選擇以核心業(yè)務(wù)為主, 在一些基礎(chǔ)設(shè)施的搭建上主要以使用三方平臺為主(騰訊bugly)。隨著業(yè)務(wù)的發(fā)展和bugly的長期不維護,慢慢出現(xiàn)一些三方平臺的弊端。例如:
          • 某次版本上線之后,沒有及時發(fā)現(xiàn)其隱藏的Crash, 導(dǎo)致故障產(chǎn)生
          • Crash發(fā)生之后,無法根據(jù)特定規(guī)則分給某位處理人。
          • 某個版本上線灰度時,該版本在特定角色下存在Crash。這個時候沒法中斷灰度版本的下發(fā)

          crash平臺建設(shè)的線路規(guī)劃

          為了解決這些問題,我們就開始著手搭建自有的Crash反饋平臺。平臺建設(shè)的規(guī)劃大致的路線是:
          1. 基礎(chǔ)架構(gòu)搭建。Crash的收集、上報、分類、查看、處理

          2. 增加三方平臺沒有的功能。實時監(jiān)控、告警、日報

          3. 補齊三方平臺的功能,Crash趨勢統(tǒng)計、Crash符號化

          crash平臺的功能集

          總結(jié)下來,Crash平臺大概需要有以下功能:
          • Crash收集:某次Crash從發(fā)生,保存本地到上報的過程
          • Crash查看:查看Crash的發(fā)生堆棧,版本分布,發(fā)生頁面,操作頁面路徑,幫助處理人快速定位問題。
          • Crash處理人以及狀態(tài):將某個Crash分配給指定人,發(fā)送通知。處理人修復(fù)完成之后,修改Crash的狀態(tài)。
          • Crash分類:根據(jù)上報的Crash將Crash進行分組,不同機型、不同版本可能發(fā)生同一個Crash,某個Crash標(biāo)識某段代碼錯誤。
          • Crash告警檢測:針對新版本引入的Crash以及因為服務(wù)端變更引起的老版本Crash,增加告警功能,第一時間發(fā)現(xiàn)影響面廣的Crash問題。
          • Crash報告:每日報告,本日Crash情況,讓團隊的小伙伴能夠清晰的了解到當(dāng)天整體的crash情況,及時解決crash次數(shù)較多的問題。

          Crash平臺整體設(shè)計

          得益于有贊在數(shù)據(jù)埋點方面的建設(shè),Crash數(shù)據(jù)收集可以通過埋點通道的進行上報,然后通過Flink實時計算任務(wù)將上報上來的Crash實時進行撈取、分組、實時監(jiān)控,最后落到我們自己的業(yè)務(wù)數(shù)據(jù)庫中。Crash平臺上可以對Crash進行瀏覽,分配,標(biāo)記解決等等。整個Crash上報過程、后續(xù)處理流程如下圖:

          為了避免crash堆棧的數(shù)據(jù)量過大,crash堆棧等長字段存儲至HBase. Mysql中只要存儲前128預(yù)覽字符與Hbase中的row_key即可

          一、實現(xiàn)方案

          1.1 Crash發(fā)生時的攔截+上報

          Crash的攔截主要依靠各端系統(tǒng)的攔截機制。以Android為例,首先需要實現(xiàn)Thread.UncaughtExceptionHandler接口,在初始化的時候?qū)⒕€程默認(rèn)的Handler替換為我們攔截的Handler(當(dāng)然別忘了調(diào)用下原先默認(rèn)的handler)。

          1.2 Crash收集、數(shù)據(jù)整理--分組歸類及自動分配處理人

          1.2.1 Crash收集

          Crash收集主要由埋點平臺提供的實時計算任務(wù)來運行。

          為什么要用埋點平臺, 而不是用自己上報?

          一個原因是避免重復(fù)造輪子,再者埋點平臺需要設(shè)計之初就是為了超大數(shù)據(jù)量而設(shè)計,支持分布式存儲,實時響應(yīng)數(shù)據(jù)分析等等優(yōu)點。而這些都是我們Crash收集所需要的,因此選擇了通過埋點平臺。

          埋點平臺在收到來自客戶端的數(shù)據(jù)后為我們做了哪些工作

          首先我們先來看下平臺工作時的整體流程圖:
          日志流轉(zhuǎn)主要環(huán)節(jié):
          1. 前端監(jiān)控用戶行為,收集并通過http請求上報
          2. NIO高并發(fā)日志接收服務(wù)將日志轉(zhuǎn)發(fā)到rsyslog服務(wù)器中
          3. rsyslog服務(wù)器再通過logstash轉(zhuǎn)發(fā)到kafka原始日志中
          4. flink實時ETl任務(wù)將原始日志加工成標(biāo)準(zhǔn)中間層格式,并繼續(xù)落地到kafka
          5. 最后消息會到我們的Crash收集flink任務(wù)程序crash-clollection-task
          crash-clollection-task實時任務(wù)只要訂閱相關(guān)的Topic,就能實時接收到訂閱相關(guān)的Topic消息:

          消息:

          // 隱去敏感數(shù)據(jù),更改為測試數(shù)據(jù)
          {
          topic: "topic.log",
          servers: "****",
          type: "kafka010",
          consumerGroup: "crash_collection_task"
          }
          因為我們訂閱的Crash涉及到的有贊全部移動端的Crash,所以訂閱了全量的數(shù)據(jù)。在代碼中對數(shù)據(jù)進行過濾,只過濾Crash相關(guān)的數(shù)據(jù):
          @Override
          public boolean filter(String line) {
          try {
          JSONObject data = JSON.parseObject(line);
          String type = data.getString("event_type");
          return Objects.equal(type, "crash");
          } catch (Exception e) {
          System.out.println(String.format("line:[%s]: \n解析發(fā)生錯誤:%s", line, e.toString()));
          }
          return false;
          }
          這樣就只剩下我們關(guān)心的Crash相關(guān)的數(shù)據(jù)了。

          1.2.2 分組歸類、自動分配處理人

          分組歸類

          分組歸類是必不可少的一個工作,理想情況下。針對同一處代碼錯誤的Crash上報上來,可以精確的將其分組歸類。
          但是因為代碼混淆、同一處代碼錯誤,錯誤堆棧缺不能完全匹配等等原因。做到這一點其實不容易。
          那目前采取的做法是以App標(biāo)識、系統(tǒng)、crash類型crash錯誤原因、crash發(fā)生頁面這五個維度來將crash分配到指定組。
          其中App標(biāo)識、系統(tǒng)是用來區(qū)分具體哪個App上報的crash的。
          crash類型crash錯誤原因是來根據(jù)crash發(fā)生的錯誤堆棧來區(qū)分出不同錯誤的類型。
          以Android堆棧為例:
          crashType為“java.lang.OutOfMemoryError”,crashReson為“Failed to allocate a 8306416 byte allocation with 502326 free bytes and 490KB until OOM”
          crash發(fā)生頁面是用來區(qū)分不同頁面發(fā)生的同一個錯誤類型的。
          最后將這些字段通過MD5算法計算出一個 groupId
          private String generateGroupId() {
          String groupKey = MD5Utils.crypt(bundleId + crashType + crashReason + pageType);
          return "Android-v4-" + groupKey;
          }

          自動分配處理人

          自動分配處理人主要目的是為了讓對應(yīng)業(yè)務(wù)的人快速處理屬于自己業(yè)務(wù)的Crash。為此做了兩種方式的自動分配。
          1. 配置清單分配

          2. 歷史頁面自動分配

          配置清單分配
          我們先來看下配置清單:
          {
          "modules": [
          {
          "name": "xxxxSDK",
          "key_stacks": [
          "com.youzan.mobile.xxxx"
          ],
          "cas_id": 10086
          }
          }
          清單中配置著模塊列表,模塊中主要有兩個字段keystacks(關(guān)鍵堆棧)、casid(模塊負(fù)責(zé)人)。有crash上報時,會根據(jù)模塊列表一一匹配其crash堆棧,看是否能匹配上若匹配上,則將該crash分配給該模塊負(fù)責(zé)人。
          自動分配處理人的初步匹配就是讀取配置清單中的key_stacks, 然后從上報crash的堆棧中找是否包含目標(biāo)堆棧。
          如果包含就匹配成功,會將該crash發(fā)送至配置好的messenger群中去,并且@casid字段指定的處理人。
          歷史頁面自動分配
          如果清單匹配匹配失敗,還會落入歷史頁面自動匹配。與清單匹配不同的是歷史頁面自動分配給該頁面上次的處理人。
          當(dāng)手動分配crash給指定人時,這張表中會記錄著這個crash發(fā)生頁面分配給某個人。例如 工作臺頁面有一個crash發(fā)生,是分配給張三。那么當(dāng)下次工作臺頁面有crash發(fā)生時,都會以此分配給張三。

          2.2 Crash實時監(jiān)控、每日報告

          得益于實時計算平臺,我們能很容易做到實時監(jiān)控。我們可以做到只要有Crash上報,就會向企業(yè)微信對應(yīng)的處理人發(fā)送消息通知。這樣做的在某種程度上來說是無意義的,尤其是疑難雜癥問題多的時候,最多的時候一天能產(chǎn)生1000條通知,對于這樣的通知無異于沒有通知。
          后來發(fā)現(xiàn)我們報上來大部分問題都是針對最新版本解決就OK,因為老版本要么是趨于穩(wěn)定。要么如果因為后端某個接口變動,那么新老版本同樣會受到影響。所以就只要監(jiān)控最新版本。因此問題就變成如何版本過濾

          2.2.1 版本過濾

          想要過濾版本就需要知道目前某個App的最新版本多少。目前有贊移動端的打包發(fā)版控制已經(jīng)都使用自研的構(gòu)建發(fā)布平臺。

          crash上報之后,只要它的版本號大于等于最新全量的版本號,就實時上報到秒級響應(yīng)群,以便及時發(fā)現(xiàn)最新版本、灰度版本、項目測試包的crash問題。

          2.2.2?每日報告

          每日報告功能有兩個目的,一是為了讓各個App負(fù)責(zé)人對每天的Crash大致狀況有個大致上的了解。二是為了讓沒時間及時處理的小伙伴,當(dāng)有屬于自己的模塊,發(fā)生次數(shù)、影響面比較大的Crash出現(xiàn)時要引起重視。

          基于這樣的目的我們在每日報告中加了每日Crash變化趨勢(與前一日相比)、每日Crash Top N兩大塊。這里主要講下設(shè)計思路。

          每日Crash變化趨勢

          日報中會取昨日的crash與今日的crash對比。如漲幅過大,則說明很可能新版本是存在問題的,需要引起注意。
          碰到的坑
          起初昨日與今日的Crash次數(shù)是按照自然日取的。這樣有個問題,就是昨日的次數(shù)是一整天的,今天的次數(shù)不是一整天。所以這里對比,應(yīng)該以報告時間往前24小時內(nèi)、48~24小時,這樣來對比。才能正常反饋Crash的變化趨勢。

          每日Crash Top N

          排序規(guī)則

          排序的背后是Crash的影響面大小,影響面大的排在前。這樣讓處理人與管理者能每天及時知曉影響大的Crash有哪些,是否需要及時處理等等目的。

          我們?yōu)槭裁催x擇了Top3?

          其實開始不是Top3 ,而是Top10。但是運轉(zhuǎn)一段時間后發(fā)現(xiàn),crash問題并不多,每天匯報時都報Top10,會有大部分次數(shù)少的crash,會讓人失焦。無論是管理者還是處理人,都搞不清楚,某個問題是該及時處理還是可以延后處理。再集合運轉(zhuǎn)的這一段時間的平均數(shù)據(jù),最終選擇了Top3。

          技術(shù)實現(xiàn)
          每日報告背后的技術(shù)實現(xiàn)有定時任務(wù)。起初使用的是SpringBoot自帶的定時任務(wù)。
          功能都能實現(xiàn),有一個麻煩的點就是調(diào)試起來不方便。比如配置10點報告的,難道要等到10點么?;蛘吒某?分鐘一次,那調(diào)式完成之后是不是又得改回來?后來使用了TSP,具體可參考 有贊調(diào)度系統(tǒng) TSP 調(diào)試起來非常方便,定時任務(wù)也像普通接口的形式書寫即可。
          日報的業(yè)務(wù)就是在不斷的聚合查詢當(dāng)天的最新版本的數(shù)據(jù),細(xì)節(jié)不再贅述,直接上日報最終效果圖:

          2.3 Crash反饋平臺--管理后臺

          Crash管理后臺的作用是提供Crash問題分析定位Crash處理流程管理。

          如何快速定位問題

          為了方便快速定位在列表接口添加了最近上報信息發(fā)生過的系統(tǒng)版本、發(fā)生過的應(yīng)用版本來幫處理人第一時間發(fā)現(xiàn)問題。
          有這樣一個場景:
          4.47.0改了某塊代碼之后,發(fā)布至線上,因為用戶老數(shù)據(jù)的問題,Crash一直隱藏著帶到了線上。此時根據(jù)發(fā)生過的應(yīng)用版本就能很快定位到Crash就是出現(xiàn)在4.47.0這個版本上。
          類似的發(fā)生過的系統(tǒng)版本能幫助快速識別某個系統(tǒng)版本特定的問題。
          Crash列表頁信息:

          更詳細(xì)的排查維度

          為了降低排查難度,增加了Crash頁面路徑、Crash出錯堆棧、符號化等功能來增加排查的線索。
          Crash詳情信息:
          詳情中展示全量的Crash堆棧信息,以及最新上報的一次設(shè)備相關(guān)信息。目的是為了幫助排查Crash。

          Crash離線日志

          值得一提的是某些時候需要再結(jié)合Crash時App端的日志來綜合排查,這個點已經(jīng)在著手設(shè)計排查,開始將Crash時跟日志綁定。后續(xù)在此頁面會直接顯示Crash時手機上的日志

          總結(jié)

          Crash反饋平臺目前還沒有實現(xiàn)Crash處理流程的閉環(huán),存在大家在使用時不會去修改Crash的狀態(tài)等問題,接下來會對這個流程做整體優(yōu)化,提升整體協(xié)作效率。隨著接入的業(yè)務(wù)方越來越多,為了保證業(yè)務(wù)方能更加容易、快速的排查與定位問題,修復(fù)問題,需要做的工作還不少,比如Crash的分組更加準(zhǔn)確,Android堆棧符號化,頑固Crash定時提醒等等。
          Crash反饋平臺技術(shù)上來說他的綜合性比較高,涉及的技術(shù)棧有大數(shù)據(jù)技術(shù)、后端技術(shù)、前端技術(shù)、移動端技術(shù)等4端技術(shù)棧。開發(fā)一個綜合性的平臺,不能單從技術(shù)層面去思考怎么解決技術(shù)上的問題,更多的需要從整個平臺的目的出發(fā)。就crash平臺而言,需要以去搭建一套能快速發(fā)現(xiàn)Crash、及時修復(fù)Crash為目標(biāo)去思考。而技術(shù)更多的是“鋤頭”,它只是幫助實現(xiàn)“大豐收”的其中一個工具。




          點個“在看”支持一下?
          ?
          瀏覽 62
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  怡红院在线播放 | 超碰在线97免费 | 精品人妻一区二区蜜桃视频 | 日本三级三级欧美三级 | 黄色的A片 |