APM體系
APM(Application Performance Management )
核心思想是什么? 在服務(wù)各節(jié)點(diǎn)彼此調(diào)用的時候撞反,記錄并傳遞一個應(yīng)用級別的標(biāo)記妥色,這個標(biāo)記可以用來關(guān)聯(lián)各個服務(wù)節(jié)點(diǎn)之間的關(guān)系。比如兩個節(jié)點(diǎn)之間使用 HTTP 作為請求協(xié)議的話遏片,那么這些標(biāo)記就會被加入到 HTTP 頭中嘹害。因此如何傳遞這些標(biāo)記是與節(jié)點(diǎn)之間使用的通訊協(xié)議有關(guān)的,有些協(xié)議就很容易加入這樣的內(nèi)容吮便,但有些協(xié)議就相對困難甚至不可能笔呀,因此這一點(diǎn)就直接決定了實(shí)現(xiàn)分布式追蹤系統(tǒng)的難度。
監(jiān)控對象
-
數(shù)據(jù)維度 從數(shù)據(jù)類型劃分髓需,大體可分為:
- 日志(
logs
):自動埋點(diǎn)/手動埋點(diǎn) - 指標(biāo)監(jiān)控(
metrics
):服務(wù)许师、端點(diǎn)、實(shí)例的各項(xiàng)指標(biāo) - 調(diào)用鏈(
tracing
): 同一TraceId的調(diào)用序列
- 日志(
-
功能維度 從業(yè)務(wù)角度劃分,可分為:
- 基礎(chǔ)監(jiān)控 :應(yīng)用服務(wù)的基本性能枯跑,物理機(jī)/虛擬機(jī)的指標(biāo)
- 中間件監(jiān)控:kafka Db Redis Zk 等依賴項(xiàng)的性能
- 業(yè)務(wù)監(jiān)控:根據(jù)業(yè)務(wù)需求定制監(jiān)控內(nèi)容
功能模塊
所有現(xiàn)有的解決方案惨驶,都需要如下模塊的支持:
? 數(shù)據(jù)采集:如何在廣度和效率上進(jìn)行數(shù)據(jù)采集 ——> Agent
? 數(shù)據(jù)加工:數(shù)據(jù)統(tǒng)一格式的整理、調(diào)用鏈集合 ——> Collector
? 數(shù)據(jù)存儲:將計(jì)算出的指標(biāo)和聚合鏈路信息實(shí)時保存起來 ——> Storeage
? 數(shù)據(jù)展示:高顏值敛助、多功能顯示 ——> UI
Skywalking & Pinpoint 生態(tài)下的四大組件
使用人群
現(xiàn)有的方法
目前的實(shí)現(xiàn)方式SkyWalking
這種直接使用javaagent
技術(shù)修改字節(jié)碼來自動埋點(diǎn)粗卜;也有類似于cat
這種直接編碼進(jìn)行手動埋點(diǎn)的,雖然方式不同纳击,但是解決的問題相同续扔。
- 收集組件的異構(gòu)化。開發(fā)語言可能有
java
焕数,也可能有golang
- 組件的多樣化纱昧。從前端埋點(diǎn)開始,nginx堡赔、中間件识脆、db等鏈路都需要包含
- 調(diào)用鏈的完整性,技術(shù)難點(diǎn)的攻關(guān)善已,如異步灼捂、進(jìn)程間上下文傳遞等
- 時效采樣。尤其在海量調(diào)用時换团,既要保證準(zhǔn)確性悉稠,也要保證效率
調(diào)用鏈難題 & OpenTracing
相比較普通監(jiān)控和日志,調(diào)用鏈APM等就復(fù)雜的多了艘包。除了有大量的數(shù)據(jù)產(chǎn)生源的猛,也要有相應(yīng)的業(yè)務(wù)組件來支持調(diào)用鏈聚合和展示∠牖ⅲ看似展示的結(jié)果很直接簡答卦尊,但是過程卻很復(fù)雜。器復(fù)雜性主要體現(xiàn)在調(diào)用鏈數(shù)據(jù)的收集上舌厨。
如何統(tǒng)一囊括記錄日志岂却、指標(biāo)和調(diào)用鏈三個維度的數(shù)據(jù)?這是關(guān)鍵挑戰(zhàn)邓线。
—— “Dapper, a Large-Scale Distributed Systems Tracing Infrastructure”
關(guān)于Tracing的數(shù)據(jù)結(jié)構(gòu)淌友,為了解決不同的分布式追蹤系統(tǒng) API 不兼容的問題煌恢,誕生了 OpenTracing
(opentracing.io/ ) 規(guī)范骇陈。本質(zhì)上說是一套接口定義,主流的調(diào)用鏈服務(wù)端實(shí)現(xiàn)都兼容此規(guī)范瑰抵,OpenTracing
大有一統(tǒng)天下的架勢你雌,它在其中融合Tracing、Log、Metrics的概念婿崭。
目前看標(biāo)準(zhǔn)化是大趨勢(CNCF Jaeger拨拓,SpringCloud,Elastic APM)氓栈,至于國內(nèi)大公司的產(chǎn)品渣磷,也都在主動向其靠攏(阿里的鷹眼、聽云授瘦、OpenApm)醋界。
系統(tǒng)架構(gòu)實(shí)現(xiàn)方案
整體來說,整個APM體系就是將大三類數(shù)據(jù)(logs提完、metrics形纺、trace)應(yīng)用到四大模塊中(收集、加工徒欣、存儲逐样、展示),并在四個難點(diǎn)(程序異構(gòu)打肝,組件多樣脂新,鏈路完整,時效采樣)上不斷優(yōu)化
全開源方案
不同數(shù)據(jù)采取不同采樣數(shù)據(jù)源闯睹,過于笨重戏羽。依賴過多無法維護(hù)
根據(jù)自己的技術(shù)棧,DIY APM框架
[Dapper] (https://bigbully.github.io/Dapper-translation/)
通過AGENT生成調(diào)用鏈日志楼吃。
通過logstash采集日志到kafka始花。
kafka負(fù)責(zé)提供數(shù)據(jù)給下游消費(fèi)。
storm計(jì)算匯聚指標(biāo)結(jié)果并落到es孩锡。
storm抽取trace數(shù)據(jù)并落到es酷宵,這是為了提供比較復(fù)雜的查詢。比如通過時間維度查詢調(diào)用鏈躬窜,可以很快查詢出所有符合的traceID浇垦,根據(jù)這些traceID再去 Hbase 查數(shù)據(jù)就快了。
logstash將kafka原始數(shù)據(jù)拉取到hbase中荣挨。hbase的rowkey為traceID男韧,根據(jù)traceID查詢是很快的。
在框架中引進(jìn)kafaka:
- 可以削峰填谷默垄,防止大數(shù)據(jù)量的沖擊
- 實(shí)現(xiàn)數(shù)據(jù)的多同步此虑,擴(kuò)展性也提高
PinPoint
利用HBase來存儲實(shí)時數(shù)據(jù)
鷹眼
16年開始完全放棄HDFS,引入流式計(jì)算 口锭,改有HBASE列存儲朦前。
SkyWalking
在Apache“云原生”生態(tài)中的布局
部署框架
方案對比
方案 | skywalking | cat | pinpoint | zipkin |
---|---|---|---|---|
依賴 | Java 8+ maven3.0+ nodejs zookeeper/k8s elasticsearch | Java 6 7 8介杆、Maven 3+ MySQL 5.6 5.7、Linux 2.6+ hadoop可選 | Java 6韭寸,7春哨,8 maven3+ Hbase0.94+ | Java 6,7恩伺,8 Maven3.2+ rabbitMQ |
實(shí)現(xiàn)方式 | java探針赴背,字節(jié)碼增強(qiáng) | 代碼埋點(diǎn)(攔截器,注解晶渠,過濾器等) | java探針癞尚,字節(jié)碼增強(qiáng) | 攔截請求,發(fā)送(HTTP乱陡,mq)數(shù)據(jù)至zipkin服務(wù) |
存儲 | elasticsearch , H2 | mysql , hdfs | HBase | in-memory 浇揩, mysql , Cassandra 憨颠, Elasticsearch |
jvm監(jiān)控 | 支持 | 不支持 | 支持 | 不支持 |
trace查詢 | 支持 | 支持 | 需要二次開發(fā) | 支持 |
stars | 13k | 13.1k | 10.2k | 12.7k |
侵入 | 低, 也可以手動埋點(diǎn) | 高胳徽,需要埋點(diǎn) | 低 | 高,需要開發(fā) |
部署成本 | 較低爽彤,集群部署需要中間支持 | 中 | 較高 | 中 |
數(shù)據(jù)導(dǎo)出 | 需要開發(fā)养盗,ES 支持分索引定時導(dǎo)出 | 不容易,hdfs 太重 | HBase 實(shí)時同步較容易 | 較容易 |
定制化監(jiān)控 | 基于端口可以支持适篙,再細(xì)粒度需要二次開發(fā) | 支持往核,手動埋點(diǎn)來實(shí)現(xiàn) |
SkyWalking
功能展示
SkyWalking是分布式系統(tǒng)的應(yīng)用程序性能監(jiān)視工具,專為微服務(wù)嚷节、云原生架構(gòu)和基于容器(Docker聂儒、K8S、Mesos)架構(gòu)而設(shè)計(jì)
演示地址:
集成方式
-
agent 自動無侵入埋點(diǎn)
JVM參數(shù)中添加 -javaagent:/path/to/skywalking-package/agent/skywalking-agent.jar硫痰,并且確保這個參數(shù)在-jar參數(shù)之前衩婚。
-
注意 需要和agent包一起使用
java -javaagent:/Users/rongxin.srx/Downloads/apache-skywalking-apm-bin/agent/skywalking-agent.jar \ -DSW_AGENT_NAME=sw-test-demo-app \ -Dskywalking.collector.backend_service=<ip>:<port> \ -Dspring.profiles.active=local,nosso \ -jar is-kcloud-1.0-SNAPSHOT.jar
提供SDK 手動埋點(diǎn)
服務(wù)端功能
性能大盤
服務(wù)依賴拓?fù)?/p>
請求調(diào)用追蹤
性能采樣分析
業(yè)務(wù)告警
指標(biāo)對比
需要解決的問題
-
大數(shù)據(jù)量下穩(wěn)定性
缺乏數(shù)據(jù)緩沖池,需要引入MQ
依賴ES的穩(wěn)定性 (ES可能出現(xiàn)性能抖動)
可擴(kuò)展性效斑,ES中的數(shù)據(jù)不易導(dǎo)出 非春,進(jìn)行多備份 (考慮使用多方監(jiān)聽MQ中的數(shù)據(jù),進(jìn)行備份)
二次開發(fā):agent插件開發(fā)比較專業(yè)缓屠,服務(wù)端邏輯復(fù)雜奇昙,需要時間消化