iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Software Development

一個新鮮人如何完轉Spring boot與DevOps從0到101系列 第 23

分散式鏈路追蹤 - Jaeger

在 OpenTelemetry 中有提到 trace 的概念。而 Trace 由多個 Span 組成。今天的內容組要是針對 Jaeger 這個服務進行簡易的介紹,並使用官方提供範例來搭建環境。

Span

一個 span 代表系統中具有開始時間和執行時長的邏輯運行單元。會有以下資訊:

  • 操作名稱
  • 開始與完成的時間戳
  • 一組鍵值隊的屬性(Attributes)
  • 一組零或多個事件,每個事件本身就是一個元組(時間戳、名稱、屬性),名稱必須是字符串
  • 父級 Span 標識
  • 鏈接(Links)到零個或多個因果相關的 Span
    • 藉由相關 Span 的 SpanContext
  • 引用 Span 所需的 SpanContext 訊息
    • 其中包含 Trace ID 和 Span ID 引用關係

Span Context

可在調用服務之間進行傳送。包含從父 Span 傳播到子 Span 的追蹤標識和選項。
每個 Span 包含如下狀態:

  • TraceId 是追蹤的標識符,用於將所有過程中特定追蹤的所有範圍分組在一起
  • SpanId 是 Span 的標識符,當傳遞給子 Span 時,此標識符將成為子 Span 的父 Span 標識符
  • TraceFlags 表示追踪的選項
    • Sampling bit 表示是否採樣追蹤的 Bit
  • Tracestate 在鍵值對列表中包含特定於追蹤系統的上下文
    • 允許不同的供應商傳播其他訊息,並與他們的舊 ID 格式進行交互操作

詳細內容可參考 opentelemetry 此鏈接或 opentracing 參考資源

Jaeger

用於監控和診斷基於微服務的分散式系統,包括以下

  • 分散式傳播
  • 分散式交易監控
  • 根本原因分析
  • 服務依賴分析
  • 性能/延遲優化

在 Jaeger 中工作單元為 Span,該 Span 有觸發時間、持續時間,並利用嵌套方式建立父子因果關係。一個 Trace 是一個執行路徑,可說是是由一組 Span 定義的有向無環圖(DAG)組合。

組件

官方描述可直接將數據寫入 DB 或是使用 Kafka 做一個緩衝在送至 DB。

Agent

為一個守護程序,監聽 UDP 端口發送的 Span,然後將其分批發送給收集器(jaeger-collector)。他為一個基本組件,將會佈署至每台主機,

Collector

從 Jaeger Agent 接收 tracing,並藉由管道運行處裡它們。管道中會驗證 tracing,為其建立索引,執行任何轉換最後儲存它們。

Query

是一項從儲存中檢索追蹤並交給 UI 來顯示追蹤的服務

Ingester

是一個從 Kafka topic 讀取並寫入儲存後端(Elasticsearch等)的服務。

實驗

啟動 Jaeger 服務,但這邊需要啟用 Elasticsearch 作為儲存。

docker run -it -d --name=jaeger -e SPAN_STORAGE_TYPE=elasticsearch -e ES_SERVER_URLS=http://192.168.101.129:3001 -e ES_TAGS_AS_FIELDS_ALL=true -p 3006:16686 jaegertracing/opentelemetry-all-in-one

官方提供的測試數據

docker run --rm --link jaeger --env JAEGER_AGENT_HOST=jaeger --env JAEGER_AGENT_PORT=6831 -p8080-8083:8080083 jaegertracing/example-hotrod:latest all

UI 呈現

明天會使用 Spring boot 作為範例,結合 Opentelemetry 和 Jaeger 來實現鏈路追蹤。更詳細的細節可以直接看官方


上一篇
初探 OpenTelemetry
下一篇
OpenTelemetry 與 Jaeger 應用
系列文
一個新鮮人如何完轉Spring boot與DevOps從0到10130

尚未有邦友留言

立即登入留言