GH GambleHub

記錄和跟蹤事件

記錄和跟蹤事件

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控制器日誌單獨收集(群集索引)。

Fluent Bit(蒙版,片段):
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和回扣的緊密結合。從「文字垃圾填埋場」過渡到事件和軌道合同,並且程序事件的診斷將變得快速,可預測和可驗證。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。