Jaeger為何物?
Jaeger 是Uber推出的一款開源分布式追蹤系統(tǒng),兼容OpenTracing API。分布式追蹤系統(tǒng)用于記錄請求范圍內(nèi)的信息。例如,一次遠(yuǎn)程方法調(diào)用的執(zhí)行過程和耗時。是我們排查系統(tǒng)問題和系統(tǒng)性能的利器。
分布式追蹤系統(tǒng)種類繁多,但是核心步驟有三個:代碼埋點,數(shù)據(jù)存儲和查詢展示。
以上幾句描述都是我copy的,所以大家想要對Jaeger有更加深入的了解,可以參閱這篇文章Jaeger 分布式追蹤系統(tǒng)模塊分析,能讓你對Jaeger有一個簡單的認(rèn)識。
當(dāng)然我們還要記得APM的三大模塊分別是集中式日志系統(tǒng),集中式度量系統(tǒng)和分布式全鏈接追蹤系統(tǒng)。
而Jaeger屬于的就是追蹤系統(tǒng),度量系統(tǒng)我們則會使用prometheus,日志系統(tǒng)一般則是elk。
選用Jaeger的原因
一個是它兼容OpenTracing API,寫起來簡單方便,一個是UI相較于Zipkin的更加直觀和豐富,還有一個則是sdk比較豐富,go語言編寫,上傳采用的是udp傳輸,效率高速度快。
相比Pinpoint的缺點,當(dāng)然是UI差距了,基本上現(xiàn)在流行的追蹤系統(tǒng)UI上都遠(yuǎn)遠(yuǎn)遜于它。
搭建
測試搭建
在個人使用或者測試上,Jaeger的搭建其實較為簡單,因為我們使用的存儲方式是內(nèi)存化的,所以我們可以直接使用官方給我們打包好的鏡像。
docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp \
-p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
線上搭建
線上搭建我采用的是jaeger搭配elasticsearch,效果還不錯,而且搭配起來比較簡單,官方給的方式是jaeger搭cassandra,不過我試了下沒有搭起來。。。。。這是官方的地址jaeger-docker-compose.yml,下面是我采用的搭建yml
version: '2.1'
services:
elasticsearch:
image: elasticsearch:5.6.4
environment:
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
collector:
image: jaegertracing/jaeger-collector
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
- ES_USERNAME=elastic
- LOG_LEVEL=debug
depends_on:
- elasticsearch
agent:
image: jaegertracing/jaeger-agent
environment:
- COLLECTOR_HOST_PORT=collector:14267
- LOG_LEVEL=debug
ports:
- "5775:5775/udp"
- "5778:5778"
- "6831:6831/udp"
- "6832:6832/udp"
depends_on:
- collector
query:
image: jaegertracing/jaeger-query
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
- ES_USERNAME=elastic
- LOG_LEVEL=debug
ports:
- 16686:16686
depends_on:
- elasticsearch
hotrod:
image: jaegertracing/example-hotrod:1.6
command: all --jaeger-agent.host-port=agent:6831
ports:
- 8080:8080
depends_on:
- agent
這里面除了hotrod以外都是必須的,hotrod是用來測試我們搭建后是否能成功上傳到我們的agent的。
這里要注意的一點是,雖然有depends_on,但是由于elasticsearch啟動的原因,導(dǎo)致query, collector連不上直接掛掉,agent雖然沒掛但是也連不上,所以我們需要手動重啟query,collector,agent,這個時候再查看應(yīng)該是都正常啟動了。

測試 (地址應(yīng)該是http://127.0.0.1:8080)
進(jìn)入到hotrod,隨便點擊一個按鈕,生成調(diào)用傳到agent

查看我們的query
如果是本地就是這個地址http://127.0.0.1:16686


可以看到,Jaeger的UI還是非常直觀,友好,漂亮的。
sdk 接入
目前官方提供了Java,Python,Go,C++,Node.js。sdk,
php暫時只有第三方的,我現(xiàn)在使用的是php這個sdk,還不錯,可以擴(kuò)展開發(fā),我基于這個sdk寫了一個swoft框架的jaeger組件,默認(rèn)支持mysql,redis,httpClient監(jiān)控,并且可靈活添加header,如果有需要,可以使用,地址:swoft-jaeger
最后
無論是什么樣的監(jiān)控系統(tǒng),對于線上服務(wù)都或多或少都有性能損耗,所以在線上一定要采樣處理才是最佳使用方式,當(dāng)然,我的組件支持采樣咯。