前序
2個月前突然發(fā)現(xiàn)APP有點卡,好像內存泄漏了碍粥,然后就在想要是有一個庫可以把泄漏的頁面和引用信息獲取到就好了突硝,那就自己擼一個easyReport庫來上報數(shù)據(jù)设拟;有了數(shù)據(jù)存在哪好呢雁社,那就自己搭建一個ElasticSearch服務把數(shù)據(jù)放里面浴井;那怎么把數(shù)據(jù)存在ElasticSearch呢,那就自己用Go語言寫一個Web服務霉撵,然后APP調用這個服務把數(shù)據(jù)存在ElasticSearch里面磺浙;既然有數(shù)據(jù)了我展示在哪呢,那就搭建一個Kibana服務把ElasticSearch的數(shù)據(jù)關聯(lián)過來喊巍;如果我想要一個報表式的數(shù)據(jù)或者定制化高的數(shù)據(jù)呢,那就自己用flutter寫一個web頁面箍鼓,并且支持App端崭参;既然是一個web 那我這個web部署在哪呢,那就自己搭建一個nginx服務吧款咖;flutter web每次改了代碼都要重新打包何暮,然后部署才可以看到新的效果挺麻煩的奄喂,那就再搭建一個jenkins服務,這樣就可以一鍵打包和部署了海洼;這么多服務我要一個一個搭建不是很復雜嗎跨新,怎么快速搭建呢,那就用docker來搭建這些服務吧;這么多服務就算是用docker 管理也有點麻煩坏逢,怎么能讓其他同事一鍵部署呢域帐,那就用docker compose吧;這樣看起來也可以做是整,總結一下 easyapm = easyReport + elasticSearch + kibana + go + flutter + nginx + jenkins + docker
簡介
easyapm 想把內存泄漏 卡頓(慢函數(shù)) 啟動時間 進行數(shù)據(jù)采集肖揣,篩選 和 展示 來幫助我們業(yè)務一線的同學快速定位到問題,作為一線寫業(yè)務的同學我深知在firebase上可以看到部分頁面卡頓浮入,但是不知道頁面里面哪種場景下哪個方法造成了卡頓龙优,因為是從0開始做,而且只做了部分功能事秀,所以很多邏輯可能不會那么完美彤断,希望看過這篇文章的同學可以留下寶貴的意見,我這邊后期進行優(yōu)化
架構
性能數(shù)據(jù)從上報到展示一共經(jīng)歷的4層易迹,分別是上報層宰衙,數(shù)據(jù)層,業(yè)務層赴蝇,展示層菩浙。
上報層:主要是通過easyReport進行數(shù)據(jù)的采集和上報。
數(shù)據(jù)層:主要是通過ElasticSearch或者firebase以及google play進行數(shù)據(jù)存儲
業(yè)務層:對上報的數(shù)據(jù)進行篩選 整理 和 保存
展示層:Kibana展示的數(shù)據(jù)比較靈活和完成句伶,但是定制化不高劲蜻,flutter web展示的數(shù)據(jù)定制化高 但是不夠靈活
CI/CD :主要是代碼的打包和部署
效果
easyReport 中內存泄漏的demo展示
easyReport屬于上報層,也就是App的一個SDK目前只支持android的內存泄漏數(shù)據(jù)上包考余,后期支持flutter 內存泄漏 以及Android 的 卡頓和啟動時間的采集和上報先嬉,具體的接入細節(jié)可以參考github上的文檔【easyReport】
Go服務支撐
Go服務屬于邏輯層 目前封裝了firebase卡頓數(shù)據(jù)獲取,內存泄漏上報楚堤,elasticSearch數(shù)據(jù)的增刪改查疫蔓,flutter web Apm數(shù)據(jù)的獲取
內存泄漏在 kibana上的數(shù)據(jù)展示
kibana屬于展示層 通過content字段里面的泄漏頁面的引用鏈 清楚定位到相關的泄漏信息,也可以通過APP的版本,手機型號和具體的時間來定位是哪個手機哪位同事在哪個時間操作造成的這個問題身冬,讓我們距離內存泄漏的真相更近一步
Flutter Web APM
web頁面是使用flutter編寫衅胀,屬于展示層 目前只完成了 卡頓里面的緩慢幀和凍結幀的展示 支持公司2個項目卡頓數(shù)據(jù)展示(屏蔽了部分敏感信息),并解決了firebase google play數(shù)據(jù)不直觀酥筝,搜索 過濾 不方便滚躯,卡頓周報數(shù)據(jù)整理花費時間比較久,重點卡頓頁面具體占比不明確等問題
CI/CD
通過jenkins自動打包和部署web頁面到docker里面的nginx中
Docker 容器管理
主要鏡像有 elasticSearch kibana nginx jd gotest
jd 是基于jenkins把flutter環(huán)境打包在里面的一個鏡像,主要用于flutter web的一鍵打包和部署
gotest是go服務生成的鏡像 可以將go寫的業(yè)務邏輯通過docker 一鍵部署
elasticSearch:數(shù)據(jù)存儲
kibana:數(shù)據(jù)展示
nginx:flutter web部署的服務
未來規(guī)劃
目前的進度:
- 上報層 數(shù)據(jù)層 邏輯層 展示層的框架和服務搭建完成并跑通
- 部分卡頓數(shù)據(jù)在flutter web上的展示
- easyReport支持內存 android內存泄漏 并在kibana上展示
業(yè)務上的規(guī)劃:
- flutter內存泄漏的上報
- 內存泄漏在flutter web的展示
- 卡頓凍結幀和緩慢幀在kibana展示
- easysdk增加 卡頓 啟動時間的檢測和上報 并在kibana和flutter web的展示
- 告警策略掸掏,不同的業(yè)務場景增加不同的告警策略茁影,比如今天新增加了5個內存泄漏,就可以根據(jù)泄漏的業(yè)務模塊通知相應的業(yè)務開發(fā)同學來關注這個問題
架構上的規(guī)劃:
- 微服務:雖然整個業(yè)務邏輯不復雜丧凤,但是做就想做好募闲,做成微服務,帶來的收益主要是 便于后期多人開發(fā)愿待,同時提升自己的在微服務的認知
- 云函數(shù):通過openfaas 增加 faas服務浩螺,這樣后期所有的web服務直接使用go的云函數(shù)
服務地址
除了easyReport其他都是部署在內網(wǎng)
easyReport: https://github.com/guixin567/easyreport
Web平臺/Nginx:http://locahost:8088
Go服務:http://locahost:8082
Kibana:http://locahost:5601
Jenkins 平臺 :http://locahost:8080 目前只支持flutter web的打包
寄語
從12月中旬初想做到現(xiàn)在差不多2個月,利用業(yè)余和過年的時間寫完上面的功能呼盆,遇到了很多問題年扩,也收獲了很多,如果大家覺得有點意思的話访圃,可以幫忙點贊 評論 收藏 或者 轉發(fā)一下 厨幻,后續(xù)文章會針對具體模塊的邏輯進行分析,比如 怎么檢測android內存泄漏腿时,easyreport怎么上報泄漏數(shù)據(jù)况脆,上報了哪些數(shù)據(jù),go服務怎么接收到easyreport上報的數(shù)據(jù)批糟,又怎么將數(shù)據(jù)存儲在elasticsearch里面格了,最后怎么在kibana展示泄漏數(shù)據(jù),通過泄漏數(shù)據(jù)怎么快速定位到問題徽鼎,在flutter web頁面怎么展示泄漏數(shù)據(jù)盛末,為什么這么展示,flutter寫web遇到了哪些問題等等否淤。因為到現(xiàn)在只做了一部分悄但,也希望自己可以堅持到最后,把這個監(jiān)控平臺完整做起來石抡,感謝所有的看過這篇文章的靚男靚女們檐嚣,也感謝一路幫助我的人【大家有時間也可以幫忙轉到字節(jié)開發(fā)者社區(qū)幫忙點個贊(想獲取一個獎品),謝謝啦 https://developer.volcengine.com/articles/7062287664598220831 】