Observability и trace sampling
1)為什麼觀察力
Observability(O11y)回答了三個問題:發生了什麼,為什麼,如何解決。它依賴於4個信號:- 度量(聚合,反應迅速);
- Logi(零件和偽裝);
- Traces(端到端因果關系);
- Profile (prod模式下的CPU/heap/lock contention)。
關鍵:信號之間的相關性+遙測經濟學(采樣、回避、壓縮)。
2)信號圖和原理
2.1 RED/USE
RED(用於API): Rate (RPS), Errors(%5xx/4xx重要),Duration (p50/p95/p99)。
USE(用於資源):Utilization, Saturation, Errors (NIC、CPU、磁盤、隊列)。
2.2產品不變量
定義SLO(例如"p95 latents"/v1/payments "≤ 300毫秒,預算錯誤0。5%在30天內)。Alerts只有在違反SLO或其燃燒時「尖叫」。
2.3個背景
實施W3C Trace Context(「traceparent」,「tracestate」)和baggage,以安全地傳輸那些/業務屬性(例如「tenant」,「region」,沒有PII)。
3)可觀察性架構
SDK/自動工具:服務中的OpenTelemetry(OTel)(HTTP/gRPC/DB/客戶端)。
OTel Collector作為總線:接收→濃縮→采樣→出口(Prometheus,Tempo/Jaeger,Loki/ELK,ClickHouse)。
- 度量:Prometheus/Mimir/VictoriaMetrics;
- 步道:Tempo/Jaeger/Zipkin;
- Logs:Loki/ELK/Vector→S3+deshevoye存儲;
- Profyles:Pyroscope/Parca。
- 相關:服務圖,exemplars,從p99圖到特定軌跡的過渡。
4)示蹤劑: 策略
4.1基於頭部的采樣(在入口處,直到知道結果)
簡單而便宜的實現(在SDK/ingress中)。
缺點:可能會錯過罕見的錯誤/緩慢查詢。
當:高的RPS,嚴格的預算,需要可預測的份額(例如1-5%)。
4.2基於尾巴的采樣(出口,知道結果)
Span完成後,將在Collector中做出決定。
可以保證選擇異常:錯誤,p99,特定路由器/tenant。
缺點:緩沖更復雜,更昂貴。
何時:需要「有意義的」步道,成本適中。
4.3組合模型
全球頭部1-5%,加上尾巴規則:「始終保存錯誤/慢速播放」,「采樣50%的金絲雀流量」,「在事件發生時保留所有支付路徑跟蹤」。
5)動態采樣和遙測預算
Budget-aware: 保持≤ N Trays/Min的體積;超過時-提高閾值(例如,僅選擇p99。5+, error-only).
Route/tenant規則:重要的終端/tenant-具有更大的份額。
自適應窗口:爆發→暫時增加錯誤/緩慢的百分比。
降低基數:規範化用戶代理、IP/ASN、squash堆棧跟蹤,掩蓋秘密。
6)Configa(裁判)
6.1 OpenTelemetry Collector-tail-sampling (yaml片段)
yaml receivers:
otlp: { protocols: { http: {}, grpc: {} } }
processors:
batch: { send_batch_size: 8192, timeout: 2s }
tail_sampling:
decision_wait: 5s num_traces: 100000 expected_new_traces_per_sec: 5000 policies:
- name: always-error type: status_code status_code: { status_codes: [ERROR] }
- name: slow-endpoints type: latency latency: { threshold_ms: 300 } # p95 цель
- name: important-routes type: string_attribute string_attribute: { key: http. target, values: ["/v1/payments", "/v1/payouts"] }
- name: tenant-eu1 type: string_attribute string_attribute: { key: tenant, values: ["eu-1"] }
- name: probabilistic-default type: probabilistic probabilistic: { sampling_percentage: 5. 0 }
exporters:
otlphttp/tempo: { endpoint: http://tempo:4318 }
prometheus: { endpoint: "0. 0. 0. 0:9464" }
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, tail_sampling]
exporters: [otlphttp/tempo]
6.2 Prometheus-exemplars(片段)
在應用程序中,寫直方圖時,請使用「trace_id」添加exemplars。在格拉法納(Grafana),「針頭」的點擊導致步道。
yaml scrape_configs:
- job_name: api scrape_interval: 10s honor_labels: true static_configs: [{ targets: ["api:9100"] }]
exemplar_limit: 10
6.3 Loki-降低日誌成本
標簽僅穩定(「服務」,「env」,「區域」,「route_class」)。
高基數(request_id,user_id)-在付費中,但帶有redaction。
采樣「成功」信息日誌,保存所有錯誤/警告。
6.4 Jaeger/Tempo-重建和指數
保存3-7天的原始步道,聚合/對稱性更長。
在便宜的存儲(S3兼容)中啟用parquet/blocks,索引是緊湊的。
7)跟蹤模擬
7.1命名和屬性
`service.name`, `service.version`, `deployment.environment`.
`http.method`, `http.route`, `http.target`, `http.status_code`, `net.peer.name`.
沒有PII的業務屬性:「tenant」,「region」,「payment_provider」,「game_id」。
7.2事件和聯系
Span events:重要點(DB事務開始、轉發、電路打開、小姐小姐)。
Links:zapros→vebkhuk/sobytiye聯系;對EDA和outbox/inbox有用。
7.3個實例(exemplars)
在直方圖中添加帶有"trace_id"的latency/size示例:從度量→到跟蹤"單次單擊。
8)度量: 哪些和如何
8.1個技術
路線/tenant/提供商(PSP,KYC)上的RED。
Пулы: `db_connections_in_use`, `http_client_in_flight`, `queue_depth`.
穩定:retries、timeouts、circuit open/half open、rate-limit hits。
Go/Java/Python運行時:GC暫停,重播,safepoints,GIL延遲。
8.2個業務指標
註冊/登錄/存款/結算,轉換,3DS/KYC失敗,收費率。
重要的fici:時間到錢包,成功率付款。
8.3基數和存儲
帶有顯式桶的直方圖(例如「[50.100.200.300.500.1000.000] ms」)。
避免使用高基數標記(raw user_id, request_id)-將標記傳遞到logi/traces.
9) Logi: 標準與相關性
格式:JSON+必需的密鑰(「timestamp」,「level」,「message」,「trace_id」,「span_id」,「service」,「env」)。
編輯:偽裝PAN、令牌、PII。
采樣:100% for 'error/warn'、5-20% for 'info' on「嘈雜」的路徑。
綁定到traces-通過「trace_id」。Log字符串在Trace中→ 「pivot」,反之亦然。
10) Profailing在銷售
為CPU/heap/alloc/locks啟用連續分析(Pyroscope/Parca)。
將p99峰與熱堆棧相關聯;保存7-14天。
11) Alerting on SLO/預算錯誤
SLO-alerta:「錯誤的預算花費速度快於X%/小時」(預測Alerta)。
癥狀,不是原因:在客戶級別(RUM/edge或per-rout)上而不是在CPU上。
多窗口、多燃燒率:1小時2%,6小時5%-兩個條件。
計劃退化的沈默:菲奇旗/金絲雀的閾值變化。
12)成本和重置
數量配額:Trains ≤ N TB/mes,logi-熱3-7天,冷S3 30-90天,指標-downsampling(1分鐘→ 5分鐘→ 1小時)。
Tail-rules將體積降低× 10-× 100,同時保持錯誤/緩慢。
成本最低的信號是度量;最有價值的是「正確」的預告片和專業文件。
13)反模式
「100% treas」 →成本爆炸、噪音和剎車。
沒有密鑰/掩碼的免費格式的日誌。
具有無限標簽的度量(user_id/ip/full UA)。
沒有「traceparent」/「baggage」-無法進行聯合。
Alerts on CPU/heap而不是SLO-聊天「燃燒」沒有好處。
沒有錯誤/慢速優先級的「random 1%」采樣-失去了寶貴的案例。
14)dashbords的示例(骨架)
API綜述:RPS,按類別排列的error-rate,latency p95/p99(exemplars clickable),頂級路由。
Release/Canary: 比較舊版/新版,outlier-rate, open-circuits, retries.
PSP/KYC:提供商的成功率,後退和失敗,與付款錯誤相關。
Infra: USE按資源、排隊、網絡下降。
15) iGaming/財務細節
關鍵途徑(存款/結論):僅在事件或受限窗口中進行100%的跟蹤;在正常模式下-「一切都有錯誤/長期潛伏」。
區域/tenant:在baggage中添加「tenant」,「jurisdiction」,「brand」;根據管轄權構建SLO。
Antifrod/bot過濾器:Risk API (allow/deny/challenge)、challenge-pass-rate、velocity-hits解決方案指標和預告片。
審計/合規性:存儲最低要求,不含PII;不變的日誌-在單獨的輪廓中。
16)準備就緒支票清單
- 端到端宣傳(「traceparent」,「baggage」),博客/度量/跟蹤相關性。
- OTel Collector with tail-sampling (errors/slow/重要路由)+probabilistic default。
- RED/USE度量標準,顯式桶,exemplars →過渡到軌跡。
- SLO和差額預算(兩個時間尺度)。
- 遙測規章和預算;downsampling指標;用於登錄的冷庫。
- 標準化的JSON-log, redaction PII/secrets。
- Profailing包含在銷售中;事件中的「熱」堆棧。
- 金絲雀行車記錄和版本比較;沒有「盲點」的問題。
- Runbook:如何暫時提高事件中的采樣比例。
- 屬性/標簽的神經元文檔和禁止高堿性。
17) TL;DR
圍繞相關性構建可觀察性:RED/USE → exemplars度量→預告片→ 徽標/profyles。通過組合采樣管理成本:小頭數%+尾數規則(錯誤、慢速、重要路線/tenants)。Alerta-通過SLO和錯誤預算。保持謹慎和基本控制,使用OTel Collector作為「中樞神經系統」。對於支付/管轄途徑-優先遙測和嚴格的數據衛生。