Tracer Provider
Tracer Provider(有時稱為TracerProvider)是 Tracers 的工廠。在大多數應用程序中,Tracer Provider 會初始化一次,并且其生命周期與應用程序的生命周期相匹配。Tracer Provider 初始化還包括 Resource 和 Exporter 初始化。這通常是使用 OpenTelemetry 進行跟蹤的第一步。在某些語言的 SDK 中,已經為您初始化了全局 Tracer Provider。
Tracer
Tracer 創建的跨度包含有關給定操作(例如服務中的請求)所發生情況的更多信息。跟蹤器是從跟蹤器提供者創建的。
Tracer Exporter
跟蹤導出器將跟蹤發送給消費者。該使用者可以是用于調試和開發時的標準輸出、OpenTelemetry Collector 或您選擇的任何開源或供應商后端。
上下文傳播
上下文傳播是實現分布式跟蹤的核心概念。通過上下文傳播,Span 可以相互關聯并組裝成跟蹤,無論 Span 是在哪里生成的。我們通過兩個子概念來定義上下文傳播:上下文和傳播。
上下文是一個對象,其中包含發送和接收服務的信息,用于將一個跨度與另一個跨度關聯起來,并將其與整個跟蹤相關聯。例如,如果服務 A 調用服務 B,則服務 A 中 ID 位于上下文中的 Span 將用作服務 B 中創建的下一個 Span 的父 Span。上下文中的跟蹤 ID 將用于下一個 Span。也在服務 B 中創建了 Span,這表示該 Span 與服務 A 中的 Span 屬于同一跟蹤的一部分。
傳播是在服務和進程之間移動上下文的機制。它序列化或反序列化上下文對象,并提供要從一個服務傳播到另一服務的相關跟蹤信息。傳播通常由檢測庫處理,并且對用戶來說是透明的,但如果您需要手動傳播上下文,則可以使用傳播 API。
OpenTelemetry 支持多種不同的上下文格式。OpenTelemetry 跟蹤中使用的默認格式稱為 W3C TraceContext。每個上下文對象都存儲在一個范圍中。有關上下文對象的詳細信息以及其他可用信息,請參閱跨度上下文。
通過組合上下文和傳播,您現在可以組裝跟蹤。
跨度
跨度代表一個工作或操作單元。Span 是 Traces 的構建塊。在 OpenTelemetry 中,它們包含以下信息:
- 姓名
- 父跨度 ID(對于根跨度為空)
- 開始和結束時間戳
- 跨度上下文
- 屬性
- 跨度事件
- 跨度links
- 跨度狀態
樣本跨度:
{
"trace_id": "7bba9f33312b3dbb8b2c2c62bb7abe2d",
"parent_id": "",
"span_id": "086e83747d0e381e",
"name": "/v1/sys/health",
"start_time": "2021-10-22 16:04:01.209458162 +0000 UTC",
"end_time": "2021-10-22 16:04:01.209514132 +0000 UTC",
"status_code": "STATUS_CODE_OK",
"status_message": "",
"attributes": {
"net.transport": "IP.TCP",
"net.peer.ip": "172.17.0.1",
"net.peer.port": "51820",
"net.host.ip": "10.177.2.152",
"net.host.port": "26040",
"http.method": "GET",
"http.target": "/v1/sys/health",
"http.server_name": "mortar-gateway",
"http.route": "/v1/sys/health",
"http.user_agent": "Consul Health Check",
"http.scheme": "http",
"http.host": "10.177.2.152:26040",
"http.flavor": "1.1"
},
"events": [
{
"name": "",
"message": "OK",
"timestamp": "2021-10-22 16:04:01.209512872 +0000 UTC"
}
]
}
跨度可以嵌套,正如父跨度 ID 的存在所暗示的那樣:子跨度表示子操作。這使得跨度能夠更準確地捕獲應用程序中完成的工作。
跨度上下文
Span 上下文是每個 Span 上的不可變對象,包含以下內容:
- 表示該跨度所屬跟蹤的跟蹤 ID
- Span 的 Span ID
- 跟蹤標志,包含有關跟蹤信息的二進制編碼
- 跟蹤狀態,可以攜帶特定于供應商的跟蹤信息的鍵值對列表
Span 上下文是 Span 的一部分,與 分布式上下文和 Baggage一起序列化和傳播。
由于 Span Context 包含 Trace ID,因此在創建 Span Links時會使用它。
屬性
屬性是包含元數據的鍵值對,可用于注釋 Span 以攜帶有關其正在跟蹤的操作的信息。
例如,如果跨度跟蹤將商品添加到電子商務系統中用戶的購物車的操作,則您可以捕獲用戶的 ID、要添加到購物車的商品的 ID 以及購物車 ID。
屬性具有每種語言 SDK 實現的以下規則:
- 鍵必須是非空字符串值
- 值必須是非空字符串、布爾值、浮點值、整數或這些值的數組
此外,還有 語義屬性,它們是通常出現在常見操作中的元數據的已知命名約定。盡可能使用語義屬性命名很有幫助,以便跨系統標準化常見類型的元數據。
跨度事件
Span 事件可以被視為 Span 上的結構化日志消息(或注釋),通常用于表示 Span 持續時間內有意義的奇異時間點。
例如,考慮 Web 瀏覽器中的兩種場景:
- 跟蹤頁面加載
- 表示頁面何時變為交互式
Span 最適合第一種情況,因為它是一個有開始和結束的操作。
跨度事件最適合跟蹤第二種情況,因為它代表一個有意義的單一時間點。
跨度
links的存在使您可以將一個跨度與一個或多個跨度關聯起來,從而暗示一種因果關系。例如,假設我們有一個分布式系統,其中一些操作是通過跟蹤來跟蹤的。
為了響應其中一些操作,附加操作會排隊等待執行,但其執行是異步的。我們也可以通過跟蹤來跟蹤后續操作。
我們希望將后續操作的跟蹤與第一個跟蹤關聯起來,但我們無法預測后續操作何時開始。我們需要關聯這兩個跟蹤,因此我們將使用span links。
您可以將第一條跡線的最后一個span links到第二條跡線中的第一個跨度。現在,它們彼此之間存在著因果關系。
links是可選的,但它是一種將跟蹤跨度相互關聯的好方法。
跨度狀態
狀態將附加到跨度。通常,當應用程序代碼中存在已知錯誤(例如異常)時,您將設置跨度狀態。跨度狀態將被標記為以下值之一:
UnsetOkError
當處理異常時,Span狀態可以設置為Error。否則,Span 狀態為 Unset 狀態。通過將 Span 狀態設置為 Unset,處理 Span 的后端現在可以分配最終狀態。
跨度類型
創建跨度時,它是Client、Server、Internal、Producer或之一Consumer。這種跨度類型向跟蹤后端提供了有關如何組裝跟蹤的提示。根據 OpenTelemetry 規范,服務器 Span 的父級通常是遠程客戶端 Span,客戶端 Span 的子級通常是服務器 Span。類似地,消費者 Span 的父級始終是生產者,生產者 Span 的子級始終是消費者。如果未提供,則假定跨度類型是內部的。
有關 SpanKind 的更多信息,請參閱 SpanKind。
客戶端
客戶端跨度表示同步傳出遠程調用,例如傳出 HTTP 請求或數據庫調用。請注意,在這種情況下,“同步”并不是指async/await,而是指它沒有排隊等待稍后處理的事實。
服務器
服務器跨度表示同步傳入遠程調用,例如傳入 HTTP 請求或遠程過程調用。
內部類型
內部跨度表示不跨越流程邊界的操作。諸如檢測函數調用或 Express 中間件之類的事情可能會使用內部跨度。
生產者
生產者跨度表示創建一個稍后可能會異步處理的作業。它可能是一項遠程作業,例如插入作業隊列的作業,也可能是由事件偵聽器處理的本地作業。
消費者
消費者跨度代表對生產者創建的作業的處理,并且可能在生產者跨度已經結束之后很久才開始。