分布式軌跡
分布式軌跡
1)為什麼,什麼是
分布式跟蹤是一種連接整個查詢路徑上的操作的方法:前端→ API網關→微服務→ DB/緩存 → → joba/pipline經紀人。
結果是來自span(span)的trace(trace),其中每個span捕獲具有屬性,事件和狀態的組件的操作。這會加速RCA,幫助保持SLO並降低MTTR。
- 關鍵路徑和「瓶頸」的可見性。
- 癥狀(度量)與原因(旋轉)和細節(徽標)的相關性。
- Retrais分析,隊列,DLQ,粉絲出局,「鋸」潛伏期。
2)跟蹤數據模型
Trace是帶有「trace_id」的調用圖。
Span — операция: `name`, `kind` (SERVER/CLIENT/PRODUCER/CONSUMER/INTERNAL), `start/end`, `status`, `attributes`, `events`, `links[]`.
Attributes-鍵值(route, db.system, messaging.system, cloud.區域等)。
事件是span中的即時標簽(例如「retry」,「cache_miss」)。
Span Links是「親子關系」(batchi,retrai,fan-in/out)之外的鏈接。
資源-進程/服務元數據('服務。名稱,版本,環境)。
3)上下文和可移植性
3.1 W3C Trace Context
標題:- 「traceparent」:「version-traceid-spanid-flags」(標誌包括采樣)。
- 「tracestate」:供應商特定狀態(最小)。
- Baggage是業務上下文的鑰匙(受限制,沒有PII/秘密)。
3.2通過上下文
HTTP: `traceparent`/`tracestate`;gRPC: 元數據;WebSocket:升級和消息;
消息:在頭部(Kafka/NATS/RabbitMQ)中-我們在PRODUCER下保留原始上下文,並在CONSUMER下傳輸。
基數:不「攜帶」上下文,我們在span (query, rows, db.系統),但不重要。
4)采樣: 如何不破產
頭部采樣(在入口處):概率/規則(route, tenant, endpoint)。
Tail采樣(在收集器上):我們保持「有趣的」路徑-錯誤,長的p95/p99,罕見的路徑。
Exemplars:直方圖度量存儲指向特定「trace_id」的鏈接。
建議:組合-5xx/timeout/p99的5-20%+tail規則100%。
5)屬性和分類法(最低強制性)
常見:- `service.name`, `service.version`, `deployment.environment`, `cloud.region`, `http.route`, `http.method`, `http.status_code`, `db.system`, `db.statement'(簡稱/無數據),'messaging.system`, `messaging.operation`, `peer.service`, `net.peer.name`, `tenant.id`, `request.id`.
商業標簽: 整潔,沒有PII。示例:'order。segment`, `plan.tier`.
6)異步腳本、隊列和蹦床
PRODUCER → CONSUMER:創建具有上下文的PRODUCER Span;消息是headers (traceparent, baggage)。CONSUMER從SERVER/CONSUMER span從link到PRODUCER(如果沒有嚴格的層次結構)開始。
Fan-out:一個輸入-很多出路→子彈或鏈接。
Batch: CONSUMER讀取一包N消息→每個消息Id的「事件」或N個單獨上下文的「鏈接」。
DLQ: 一個獨立的span'messaging。dlq.publish` с reason и count.
Retrai: 'event: retry'+'retry。計數屬性;最好是試用新的CHILD。
7)與日誌和指標集成
Logi用「trace_id」/「span_id」寫作JSON →點擊後進入日誌。
RED/USE度量標準包含exemplars →從p99峰值進入「不良」spana。
路線通過事件生成tehsignals(依賴性錯誤)和業務信號(轉換)。
8)生產力和成本
采樣和傾斜事件。
縮寫屬性基數(不是'user_id'/'session_id'作為標簽!)。
出口商壓縮/戰鬥;出口界限。
存儲:熱門1-7天,接下來-聚合體/僅「問題」跟蹤。
支出類別: 收集器,索引,存儲,egress.
9)安全和隱私
In Transit: TLS 1.3/mTLS kollektor↔agenty;At Rest:加密,專有密鑰(請參閱「加密In Transit/At Rest」)。
PII和秘密:不要寫入屬性/事件;prodewser上的令牌/偽裝。
多範圍:'tenant。id'作為資源標簽和空間隔離,閱讀策略;審核對跟蹤的訪問(請參閱「審核和不可更改日誌」)。
10)實施計劃(參考)
10.1 OpenTelemetry SDK(偽代碼)
python from opentelemetry import trace from opentelemetry. sdk. trace import TracerProvider from opentelemetry. sdk. resources import Resource from opentelemetry. sdk. trace. export import BatchSpanProcessor from opentelemetry. exporter. otlp. proto. grpc. trace_exporter import OTLPSpanExporter
provider = TracerProvider(resource=Resource. create({
"service. name":"checkout","service. version":"1. 12. 0","deployment. environment":"prod"
}))
provider. add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint="otel-collector:4317", insecure=True)))
trace. set_tracer_provider(provider)
tr = trace. get_tracer("checkout")
with tr. start_as_current_span("POST /pay", attributes={
"http. route":"/pay","http. method":"POST","tenant. id":"t-42"
}):
business logic, external API call and pass DB
10.2 OTel Collector-tail采樣(片段)
yaml processors:
tailsampling:
decision_wait: 2s policies:
- type: status_code status_codes: [ERROR]
- type: latency threshold_ms: 900
- type: probabilistic sampling_percentage: 10 exporters:
otlphttp: { endpoint: http://trace-backend:4318 }
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, tailsampling]
exporters: [otlphttp]
10.3 Kafka-上下文轉移(概念)
生產者:我們添加頭部「traceparent」,「baggage」。
CONSUMER:如果消息觸發新線程-新的SERVER/CONSUMER-span從頭部到上下文的鏈接。
11) Data/ETL и ML
Batch piplines: span to batch/partition with 'dataset。urn`, `run.id`, `rows.in/out`, `freshness.lag`.
對於ML:睡眠訓練/地獄,模型版本,latency,功能商店。
與Lineage的捆綁在一起:'運行。id` и `dataset.urn'允許從trace切換到數據來源圖。
12)跟蹤平臺SLO
可用性: ≥ 99。9%
索引前延遲: ≤ 60與p95
覆蓋範圍: ≥ 5-10%的關鍵路線
100%保存具有ERROR狀態且具有latency>「關鍵路徑」目錄的閾值"
平臺的Alerts: drops的增長,出口的taymauts,指數器脫落,基數過熱。
13)測試和驗證
CI中的跟蹤合同:關鍵端點上有旋轉,強制屬性,正確的「traceparent」飛過網關/代理。
合成/朗姆酒樣本:從外部收集步道。
混亂/事件:斷開依賴關系,檢查尾部采樣器「拾取」錯誤。
Smoke在銷售:發布後-「是否有噴霧」和exemplar → trace。
14)支票單
出售前
- W3C Trace Context將隨處可見;對於消息-頭條。
- 包括基本頭部采樣;5xx/p99的尾巴規則已配置。
- 強制屬性:route、method、status、service。version, tenant.id.
- Logi JSON帶有「trace_id」/「span_id」,帶有exemplars的度量。
- PII消毒劑;路徑/靜止加密;訪問策略。
- Dashbords:「關鍵路徑」,「依賴性錯誤」,「retrai/taymauts」。
運營
- 屬性基本性的每月審查;配額。
- 在SLO上調整尾部采樣(在樣本中減少噪音,所有「熱」)。
- 帶有→ exemplar度量轉換→ trace → logi的教學RCA。
- 檢查隊列、DLQ、ETL-jobs的覆蓋範圍。
15) Runbook’и
RCA: p99 上漲/pay
1.打開RED dashboard;從bin p99穿過exemplar進入步道。
2.找到「窄」CLIENT span(例如,'gateway)。call'),檢查「retry」。count', taymouts。
3.比較服務/依存關系版本,區域/區域。
4.啟用降級(緩存響應/RPS限制),通知依賴關系所有者。
5.小說之後-RCA和縮放優化。
DLQ激增
1.「消息傳遞」上的路徑過濾器。dlq.publish`.
2.檢查原因(事件),與發布相關聯。
3.運行reprocess,暫時增加CONSUMER的定時,通知下遊業主。
16)經常出錯
沒有通過網關/經紀人對上下文進行近似。解決方案:middleware/interseptors,統一庫。
所有步道100%。昂貴且毫無意義-使用tail采樣。
沒有「trace_id」的日誌。失去相關性→ MTTR ↑。
屬性中的PII。偽裝/令牌化;僅存儲技術上下文。
「無聲」背景喬巴。在batch/partition和'run上添加spans。id`.
命名差異。鍵入span名稱和屬性密鑰字典。
17) FAQ
問:頭部還是尾部采樣更好?
答:組合。頭部給出基層,尾巴確保異常/錯誤持續存在。
問:如何在沒有嚴格等級制度的情況下穿越卡夫卡?
答:使用PRODUCER和CONSUMER之間的span鏈接;上下文是頭條。
問: 敏感的SQL如何處理?
O: 'db。statement「縮短」/規範化(無值)或'db。operation'+尺寸/時間。
問: 如何與業務指標相關聯?
答:添加沒有PII (計劃/segment)的域屬性,使用span內部的「業務階段」事件,然後從exemplar轉換指標轉換。
相關材料:- 「可觀察性:邏輯,度量,跟蹤」
- 「審核和不變日誌」
- 「加密In Transit/At Rest」
- 「數據來源(Lineage)」
- «Privacy by Design (GDPR)»
- 「秘密管理」