全鏈路監(jiān)控Jaeger搭建實戰(zhàn)

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)該是都正常啟動了。

jaeger

測試 (地址應(yīng)該是http://127.0.0.1:8080)

進(jìn)入到hotrod,隨便點擊一個按鈕,生成調(diào)用傳到agent

hotrod

查看我們的query

如果是本地就是這個地址http://127.0.0.1:16686

query

query2

可以看到,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)然,我的組件支持采樣咯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容