在微服務爲咱們提供了模塊分,低耦合的高效開發和DevOPS中,具體業務中當一個請求中,請求了多個服務單元,若是請求出現了錯誤或異常,很難去定位是哪一個服務出了問題,這時就須要鏈路追蹤。可能你會想在業務系統中請求中埋點,或寫日誌,可是這種都須要在業務代碼中來寫,並且耦合在代碼中,不具有微服務的擴張性後後期的易維護行。python
受Dapper和OpenZipkin啓發的Jaeger是由Uber Technologies做爲開源發佈的分佈式跟蹤系統。它用於監視和診斷基於微服務的分佈式系統,包括:git
Jaeger後端的設計沒有單點故障,能夠根據業務需求進行擴展。例如,Uber上任何給定的Jaeger安裝一般天天要處理數十億個跨度。github
Jaeger後端,Web UI和工具庫已徹底設計爲支持OpenTracing標準。docker
經過跨度引用將跡線表示爲有向無環圖(不只是樹)shell
支持強類型的跨度標籤和結構化日誌經過行李數據庫
支持通用的分佈式上下文傳播機制json
Jaeger支持兩個流行的開源NoSQL數據庫做爲跟蹤存儲後端:Cassandra 3.4+和Elasticsearch 5.x / 6.x / 7.x。正在進行使用其餘數據庫的社區實驗,例如ScyllaDB,InfluxDB,Amazon DynamoDB。Jaeger還附帶了一個簡單的內存存儲區,用於測試設置。後端
Jaeger Web UI是使用流行的開源框架(如React)以Javascript實現的。v1.0中發佈了幾項性能改進,以容許UI有效處理大量數據,並顯示具備成千上萬個跨度的跟蹤(例如,咱們嘗試了具備80,000個跨度的跟蹤)。api
Jaeger後端做爲Docker映像的集合進行分發。這些二進制文件支持各類配置方法,包括命令行選項,環境變量和多種格式(yaml,toml等)的配置文件。Kubernetes模板和Helm圖表有助於將其部署到Kubernetes集羣。安全
默認狀況下,全部Jaeger後端組件都公開Prometheus指標(也支持其餘指標後端)。使用結構化日誌庫zap將日誌寫到標準輸出。
Jaeger的第三方安全審覈可在https://github.com/jaegertracing/security-audits中得到。有關Jaeger中可用安全機制的摘要,請參見問題#1718。
儘管咱們建議使用OpenTracing API來對應用程序進行檢測並綁定到Jaeger客戶端庫,以從其餘地方沒法得到的高級功能中受益,可是若是您的組織已經使用Zipkin庫對檢測進行了投資,則沒必要重寫全部代碼。Jaeger經過在HTTP上接受Zipkin格式(Thrift或JSON v1 / v2)的跨度來提供與Zipkin的向後兼容性。從Zipkin後端切換隻是將流量從Zipkin庫路由到Jaeger後端的問題。
您的應用程序必須通過檢測,而後才能將跟蹤數據發送到Jaeger後端。查看「客戶端庫」部分,以獲取有關如何使用OpenTracing API以及如何初始化和配置Jaeger跟蹤器的信息。
您的應用程序必須通過檢測,而後才能將跟蹤數據發送到Jaeger後端。查看「客戶端庫」部分,以獲取有關如何使用OpenTracing API以及如何初始化和配置Jaeger跟蹤器的信息。
多合一是用於快速本地測試的可執行文件,具備內存存儲組件,可啓動Jaeger UI,收集器,查詢和代理。開始多合一的最簡單方法是使用發佈到DockerHub的預構建映像(單個命令行)。
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:1.14
複製代碼
Or run the jaeger-all-in-one(.exe)
executable from the binary distribution archives:
jaeger-all-in-one --collector.zipkin.http-port=9411
複製代碼
You can then navigate to http://localhost:16686
to access the Jaeger UI.
容器須要暴露的端口
Port | Protocol | Component | Function |
---|---|---|---|
5775 | UDP | agent | accept zipkin.thrift over compact thrift protocol (deprecated, used by legacy clients only) |
6831 | UDP | agent | accept jaeger.thrift over compact thrift protocol |
6832 | UDP | agent | accept jaeger.thrift over binary thrift protocol |
5778 | HTTP | agent | serve configs |
16686 | HTTP | query | serve frontend |
14268 | HTTP | collector | accept jaeger.thrift directly from clients |
14250 | HTTP | collector | accept model.proto |
9411 | HTTP | collector | Zipkin compatible endpoint (optional) |
HotROD(按需乘車)是一個演示應用程序,由幾個微服務組成,並說明了OpenTracing API的用法。博客文章中提供了一個教程/演練:以OpenTracing API.的方式進行HotROD。它能夠獨立運行,但須要Jaeger後端才能查看跟蹤。Take OpenTracing for a HotROD ride
mkdir -p $GOPATH/src/github.com/jaegertracing
cd $GOPATH/src/github.com/jaegertracing
git clone git@github.com:jaegertracing/jaeger.git jaeger
cd jaeger
make install
go run ./examples/hotrod/main.go all
複製代碼
docker run --rm -it \
--link jaeger \
-p8080-8083:8080-8083 \
-e JAEGER_AGENT_HOST="jaeger" \
jaegertracing/example-hotrod:1.14 \
all
複製代碼
Run example-hotrod(.exe)
executable from the binary distribution archives:
$ example-hotrod all
複製代碼
Then navigate to http://localhost:8080
.
收集器服務公開了Zipkin兼容的REST API / api / v1 / spans,該API接受Thrift和JSON。此外,還有/ api / v2 / spans用於JSON和Proto。默認狀況下,它是禁用的。可使用--collector.zipkin.http-port = 9411啓用它
Zipkin Thrift IDL and Zipkin Proto IDL files can be found in jaegertracing/jaeger-idl repository. They’re compatible with openzipkin/zipkin-api Thrift and Proto.
Span表示Jaeger中的邏輯工做單元,具備操做名稱,操做的開始時間和持續時間。跨度能夠嵌套並排序以創建因果關係模型。
每一個 Span 包含如下對象:
跟蹤是經過系統的數據/執行路徑,能夠看做跨度的有向無環圖。
Jaeger能夠做爲多合一二進制(其中全部Jaeger後端組件都在單個進程中運行)進行部署,也能夠做爲可擴展的分佈式系統進行部署,以下所述。有兩個主要的部署選項:
本節詳細介紹Jaeger的組成部分以及它們之間的關係。它由您的應用程序與之交互的順序安排。
Jaeger客戶端是OpenTracing API的特定於語言的實現。它們可用於手動或經過與OpenTracing集成的各類現有開源框架(例如Flask,Dropwizard,gRPC等)來檢測應用程序以進行分佈式跟蹤。
檢測服務在接收新請求時建立跨度,並將上下文信息(跟蹤ID,跨度ID和行李)附加到傳出請求。只有ID和行李隨請求一塊兒傳播;不會傳播構成跨度的全部其餘信息,例如操做名稱,日誌等。取而代之的是,採樣的跨度在後臺異步傳輸到Jaeger Agents的過程外。
該儀器的開銷很小,而且設計爲始終在生產中啓用。請注意,雖然生成了全部跟蹤,但僅採樣了一些。對跟蹤進行採樣將跟蹤標記爲進一步處理和存儲。默認狀況下,Jaeger客戶端對0.1%的跡線進行採樣(每1000箇中的1個),而且可以從代理中檢索採樣策略。
Jaeger代理是一個網絡守護程序,它偵聽經過UDP發送的跨度,而後將其分批發送給收集器。它旨在做爲基礎結構組件部署到全部主機。該代理將收集器的路由和發現抽象到遠離客戶端的位置。
Jaeger收集器從Jaeger代理接收跟蹤,並經過處理管道運行它們。當前,咱們的管道會驗證跟蹤,爲其創建索引,執行任何轉換並最終存儲它們。Jaeger的存儲設備是可插拔組件,目前支持Cassandra,Elasticsearch和Kafka。
查詢是一項從存儲中檢索跟蹤並託管UI來顯示跟蹤的服務。
Ingester is a service that reads from Kafka topic and writes to another storage backend (Cassandra, Elasticsearch).
Jaeger庫實現了一致的前期(或基於頭)的採樣。例如,假設咱們有一個簡單的調用圖,其中服務A調用服務B,服務B調用服務C:A-> B->C。當服務A收到不包含跟蹤信息的請求時,Jaeger跟蹤器將開始新的跟蹤,爲其分配一個隨機跟蹤ID,而後根據當前安裝的採樣策略作出採樣決定。採樣決策將與請求一塊兒傳播到B和C,所以這些服務將不會再次作出採樣決策,而是會尊重頂級服務A作出的決策。這種方法保證了,若是對跟蹤進行了採樣,則全部其跨度將記錄在後端。若是每一個服務都作出本身的抽樣決定,那麼咱們不多會在後端得到完整的跟蹤。
使用配置對象實例化跟蹤器時,能夠經過sampler.type和sampler.param屬性選擇採樣類型。Jaeger庫支持如下采樣器:
sampler.type=const
) sampler always makes the same decision for all traces. It either samples all traces (sampler.param=1
) or none of them (sampler.param=0
).sampler.type=probabilistic
) sampler makes a random sampling decision with the probability of sampling equal to the value of sampler.param
property. For example, with sampler.param=0.1
approximately 1 in 10 traces will be sampled.sampler.type=ratelimiting
) sampler uses a leaky bucket rate limiter to ensure that traces are sampled with a certain constant rate. For example, when sampler.param=2.0
it will sample requests with the rate of 2 traces per second.sampler.type=remote
, which is also the default) sampler consults Jaeger agent for the appropriate sampling strategy to use in the current service. This allows controlling the sampling strategies in the services from a central configuration in Jaeger backend, or even dynamically (see Adaptive Sampling).自適應採樣器是一個組合了兩個功能的複合採樣器:
能夠靜態配置每一個操做參數,也能夠在遠程採樣器的幫助下從Jaeger後端按期提取每一個操做參數。自適應採樣器旨在與Jaeger後端即將推出的自適應採樣功能一塊兒使用。
能夠經過--sampling.strategies-file選項使用靜態採樣策略實例化收集器(若是使用Remote sampler配置,則將其傳播到相應的服務)。此選項須要一個已定義採樣策略的json文件路徑。
{
"service_strategies": [
{
"service": "foo",
"type": "probabilistic",
"param": 0.8,
"operation_strategies": [
{
"operation": "op1",
"type": "probabilistic",
"param": 0.2
},
{
"operation": "op2",
"type": "probabilistic",
"param": 0.4
}
]
},
{
"service": "bar",
"type": "ratelimiting",
"param": 5
}
],
"default_strategy": {
"type": "probabilistic",
"param": 0.5
}
}
複製代碼
代碼示例可參考一位go大佬的一個示例:github.com/xinliangnot…