記錄和跟蹤事件
記錄和跟蹤事件
1)目標和框架
徽標和跟蹤是可觀察性的基礎。
Logi回答「發生了什麼」和「上下文是什麼」。
Traces在分布式查詢路徑中響應「慢速/錯誤的地點和原因」。
- Structured by default (JSON);跟蹤第一:熱路徑中的每個日誌都綁定到「trace_id」/「span_id」。
- 噪聲最小,信號最大:水平,采樣,反基數。
- 安全和隱私:掩蓋、編輯、劃分訪問權限。
- 測試的日誌和事件方案。
2)事件分類
按目的劃分線程和索引:1.技術記錄(運行時,錯誤,網絡計時器,retrai)。
2.業務活動(註冊,存款,利率,提取,KYC階段)-適用於食品分析和「現金」路徑事件。
3.審計(誰/何時更改:configs,訪問,標誌,限制)是不可更改的日誌。
4.安全(身份驗證,特權升級,制裁/RER標誌)。
5.基礎架構(K8s活動,自動緩解,HPA/VPA,節點/驅動器/網絡)。
對於每個線程,分別是還原,索引和訪問規則。
3)結構原理(JSON基準)
json
{
"ts": "2025-11-03T14:28:15.123Z",
"level": "ERROR",
"service": "payments-api",
"env": "prod",
"region": "eu-central-1",
"trace_id": "8a4f0c2e9b1f42d7",
"span_id": "c7d1f3a4b8b6e912",
"parent_span_id": "a1b2c3d4e5f60789",
"logger": "withdraw.handler",
"event": "psp_decline",
"msg": "PSP declined transaction",
"http": { "method": "POST", "route": "/withdraw", "status": 502, "latency_ms": 842 },
"user": { "tenant_id": "t_9f2", "user_key": "hash_0a7c", "vip_tier": 3 },
"payment": { "psp": "acme", "amount": 120.50, "currency": "EUR", "idempotency_key": "u123:wd:7845" },
"safe": true, // пройдена проверка на секреты
"version": "1.14.2", // версия сервиса (SemVer)
"build": "sha-1f2a3b4",
"kubernetes": { "pod": "payments-7cbdf", "node": "ip-10-0-2-41" }
}
要求:平面方案+域附件,必填字段('ts,level,service,env,trace_id,msg'),數值是數字,不是字符串。
4)水平,基數和體積
級別:「DEBUG」(不銷售),「INFO」(業務事實),「WARN」(異常),「ERROR」(錯誤),「FATAL」(碰撞)。
基數:避免任意鍵/動態標簽。沒有「id in key」。
Sampling logs:限量版重復消息;僅包括「DEBUG」 scoped和時間(功能旗)。
相似性:構造「idempotency_key」以抑制重復的消費者事件。
5)隱私和安全
在座席上偽裝PII/秘密 (Fluent Bit/Vector):按密鑰偽裝卡(「電子郵件」,「card」、「token」、「授權」)。
散列「user_key」,僅保留所需的上下文(國家/地區,KYC級別,VIP級)。
分隔存儲:溫暖(操作搜索)和寒冷(存檔沒有PII/c簡化上下文)。
審計-僅限應用程序,WORM存儲,僅可通過least privilege原則訪問。
6)跟蹤: 標準和上下文
W3C Trace Context:標題「traceparent」/「tracestate」,以及用於安全密鑰的baggage(例如「tenant_id」,「region」)。
指標和跟蹤關聯:Exemplars-將「trace_id」傳輸到直方圖的采樣點(加速RCA)。
采樣:對於有問題的查詢,基本采樣1-5%+動態「在錯誤/緩慢p95上」高達100%。
Links:對於異步隊列/sag,請通過「links」(不僅僅通過「母公司」)鏈接睡眠。
7)收集和路由
代理商:用於日誌的Fluent Bit/Vector;OTLP導出到OpenTelemetry Collector。
集合:中央網關(batch/transform/filter/routing)。
App → (OTLP logs/traces/metrics) → OTel Collector
→ logs: redact → route(security audit tech biz) → hot index / cold archive
→ traces: tail_sampling(errors p95>threshold) → APM backend
→ metrics: Prometheus exporter (for SLO/alerts)
OTel Collector(片段):
yaml processors:
batch: {}
attributes:
actions:
- key: env value: prod action: insert filter/logs:
logs:
include:
match_type: strict resource_attributes:
- key: service.name value: payments-api exporters:
otlp/traces: { endpoint: "apm:4317", tls: { insecure: true } }
loki: { endpoint: "http://loki:3100/loki/api/v1/push" }
prometheus: {}
service:
pipelines:
logs: { receivers: [otlp], processors: [attributes,batch], exporters: [loki] }
traces: { receivers: [otlp], processors: [batch], exporters: [otlp/traces] }
metrics: { receivers: [otlp], processors: [batch], exporters: [prometheus] }
8)指導: SDK示例
8.1 Node.js (Pino + OTel)
js import pino from "pino";
import { context, trace } from "@opentelemetry/api";
const logger = pino({ level: process.env.LOG_LEVEL "info" });
function log(info) {
const span = trace.getSpan(context.active());
const base = span? { trace_id: span.spanContext().traceId, span_id: span.spanContext().spanId }: {};
logger.info({...base,...info });
}
// пример log({ event: "deposit.created", amount: 50, currency: "EUR", user: { user_key: "hash_0a7c" } });
8.2 Java (SLF4J + OTel)
java
MDC.put("trace_id", Span.current().getSpanContext().getTraceId());
MDC.put("span_id", Span.current().getSpanContext().getSpanId());
log.info("psp_response status={} latency_ms={}", status, latency);
8.3 Python (structlog + OTel)
python import structlog from opentelemetry import trace log = structlog.get_logger()
def log_json(event, kwargs):
span = trace.get_current_span()
ctx = {}
if span and span.get_span_context().is_valid:
ctx = {"trace_id": span.get_span_context().trace_id, "span_id": span.get_span_context().span_id}
log.msg(event=event, ctx, kwargs)
8.4個NGINX →標題跟蹤
nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
9)Logi作為警報和自動動作信號
有缺陷的模式(「psp_decline」,「fraud_flag」)匯總並與SLO相關聯。
Alerts on pattern-rate:"5xx by/withdraw> 0.5%為10m","fraud_flag spike>+200%為基本"。
自動操作:在log'withdrawals_manual_mode=true'中,通過標誌平臺啟用殺手開關。
rate(count_over_time({service="payments-api", level="ERROR", event="psp_decline"}[5m])) > 5
10)重建,索引,存儲
熱:7-14天(快速調查)。
溫暖:30-90天(趨勢,RCA)。
冷: 180-365+(存檔,審核)-壓縮,廉價類,可能沒有全文搜索.
索引:固定鍵('service, env, level, event, trace_id, user.tenant_id'),指數禁令「一連串」。
事件大小限制(例如≤ 32KB),trim/底部:「在存儲中多余的是MTTR敵人」。
11)審核和不變性
使用字幕/哈希、服務器時間、「who/what/when/why」和字幕鏈接單獨編寫審核事件。
「誰在DE中打開了100%的獎金旗幟?」-答案必須在1-2請求中。
json
{
"ts": "2025-11-03T14:00:00.000Z",
"actor": "alice@company",
"action": "feature_flag.update",
"target": "bonus.enable_vip",
"old": {"rollout": 10},
"new": {"rollout": 100},
"reason": "campaign_2311",
"ticket": "OPS-3481",
"trace_id": "cf12ab.."
}
12)業務事件和數據模型
業務事件不是「日誌中的文本」,而是合同:- `event_type`, `event_id`, `occurred_at`, `actor`, `subject`, `amount`, `currency`, `status`, `idempotency_key`.
- 與相等的消費者一起使用Outbox和「at-least-once」。
13) Kubernetes和pipeline logs
用於路由的pod註釋('log。type`, `retention.tier`).
Sidecar/DaemonSet代理具有磁盤緩沖區(網絡中斷時)。
K8s控制器日誌單獨收集(群集索引)。
ini
[FILTER]
Name modify
Match
Remove authorization, password, card_number
14)反模式
字符串邏輯「必須」,不存在「trace_id」。
PII/Logs中的秘密,payload的整個轉儲。
數以百萬計的獨特密鑰→「爆炸」索引。
DEBUG全天候銷售。
將審計,安全性和技術人員混合為一個索引。
從存檔中沒有還原策略和恢復測試。
15)實施清單(0-45天)
0-10天
在gateway/客戶端中啟用 W3C Trace Context (W3C Trace Context)。
將應用日誌翻譯為JSON,添加「trace_id」/「span_id」。
禁止PII/秘密(掩蓋代理),批準字段列表。
11-25天
分離線程:tech/biz/audit/securit/infra,設置還原和ACL。
啟用OTel Collector,進行錯誤采樣/慢速查詢。
「Log Rate/Error by route」+Jump-to-trace(Exemplars)的行車記錄板。
26-45天
Alerta按事件模式和與SLO的相關性。
冷日誌歸檔/恢復(DR測試)。
Linter Log Scheme in CI,商業活動合同。
16)成熟度量
「trace_id」查詢覆蓋率≥ 95%。
JSON Logs的份額≥ 99%。
通過「jump-to-trace」發現的事件由<15 min(p50)解決。
0例PII在日誌中(泄漏掃描儀)。
在所有線程上都遵循重構(我們自動證明審計)。
17)附錄: 迷你嗅覺
W3C traceparent生成(偽)
txt traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
PromQL-一組日誌和SLO(示例)
high_error_logs = rate(log_events_total{service="payments-api",level="ERROR"}[5m])
5xx_rate = sum(rate(http_requests_total{service="payments-api",status=~"5.."}[5m])) / sum(rate(http_requests_total{service="payments-api"}[5m]))
alert if high_error_logs > 10 and 5xx_rate > 0.005
OpenAPI-韓語標題
yaml components:
parameters:
Traceparent:
name: traceparent in: header required: false schema: { type: string }
18)結論
強大的邏輯和跟蹤回路是約定+學科:結構JSON邏輯,單個「trace_id」,安全的PII處理,流路和重新連接,以及與SLO,Alerting和回扣的緊密結合。從「文字垃圾填埋場」過渡到事件和軌道合同,並且程序事件的診斷將變得快速,可預測和可驗證。