GH GambleHub

Protokollierung und Verfolgung von Ereignissen

Protokollierung und Verfolgung von Ereignissen

1) Ziel und Rahmen

Logs und Traces sind die Grundlage der Beobachtbarkeit.
Die Protokolle antworten auf „was passiert ist“ und „mit welchem Kontext“.
Traces beantworten das „Wo und Warum langsam/falsch“ im verteilten Anfragepfad.

Die wichtigsten Grundsätze sind:
  • Structured by default (JSON); Trace-first: Jedes Log im Hot Path ist an 'trace _ id '/' span _ id' gebunden.
  • Minimales Rauschen, maximales Signal: Pegel, Sampling, Anti-Kardinalität.
  • Sicherheit und Privatsphäre: Maskieren, Bearbeiten, Abgrenzung des Zugangs.
  • Versionierte Protokoll- und Ereignisschemata.

2) Taxonomie der Ereignisse

Trennen Sie Threads und Indizes nach Verwendungszweck:

1. Technische Protokolle (Laufzeit, Fehler, Netzwerk-Timeouts, Retrays).

2. Geschäftsereignisse (Registrierung, Einzahlung, Wette, Auszahlung, KYC-Phase) - geeignet für Produktanalysen und Vorfälle auf „monetären“ Wegen.

3. Auditing (wer/wann hat was geändert: Configs, Zugriffe, Flags, Limits) ist ein unveränderliches Protokoll.

4. Sicherheit (Authentifizierung, Eskalationen von Privilegien, Sanktions-/PP-Flags).

5. Infrastruktur (K8s Events, Autoscaling, HPA/VPA, Knoten/Laufwerk/Netzwerk).

Für jeden Thread gibt es separate Regeln für Retenche, Indexierung und Zugriff.


3) Strukturprotokoll (JSON-Referenz)

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" }
}

Anforderungen: flaches Schema + Anhänge für Domänen, obligatorische Felder ('ts, level, service, env, trace_id, msg'), numerische Werte - Zahlen, nicht Zeilen.


4) Ebenen, Kardinalität und Umfang

Ebenen: 'DEBUG' (nicht in der Produktion), 'INFO' (geschäftliche Fakten), 'WARN' (Anomalien), 'ERROR' (Fehler), 'FATAL' (Abstürze).
Kardinalität: Vermeiden Sie beliebige Schlüssel/dynamische Labels. Kein „Id-in-Key“.
Log-Sampling: Rate-Limit-Nachrichten; Aktivieren Sie' DEBUG 'nur scoped und zeitlich (feature flag).
Idempotenz: Loggen Sie' idempotency _ key', um doppelte Ereignisse durch Verbraucher zu unterdrücken.


5) Privatsphäre und Sicherheit

Tarnen Sie PII/Geheimnisse auf Agenten (Fluent Bit/Vector): Schlüsselmaskierungskarten ('email', 'card', 'token', 'authorization').
Hash 'user _ key', halten Sie nur den gewünschten Kontext (Land, KYC-Level, VIP-Tier).
Trennen Sie die Speicher: warm (Online-Suche) und kalt (Archiv ohne PII/c durch den Kontext abgeschnitten).
Audit - nur Append, WORM-Speicher, Zugriff nur nach dem Prinzip des Least Privilege.


6) Tracing: Standards und Kontext

W3C Trace Context: Überschriften 'traceparent '/' tracestate', plus baggage für sichere Schlüssel (z.B. 'tenant _ id', 'region').
Verknüpfung von Metriken und Traces: Beispiele - Übergeben Sie' trace _ id 'an die Sample-Punkte der Histogramme (beschleunigt den RCA).
Sampling: Basis-Sampling 1-5% + dynamisch „auf Fehler/slow p95“ bis zu 100% für problematische Abfragen.
Links: Bei asynchronen Warteschlangen/Sagen verbinden Sie die Spans über 'links' und nicht nur über 'parent'.


7) Sammlung und Routing

Agenten: Fluent Bit/Vector für Protokolle; OTLP-Export nach OpenTelemetry Collector.
Collector: zentrales Gateway (batch/transform/filter/routing).

Empfohlene Pipeline:

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 (Fragment):
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) Instrumentierung: SDK-Beispiele

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. NGINX- 4 → Header-Tracing

nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;

9) Logs als Signal für Alerts und Auto-Aktionen

Fehlerhafte Muster ('psp _ decline', 'fraud _ flag') aggregieren und korrelieren mit dem SLO.
Alerts auf Muster-Rate: "5xx von/withdraw> 0. 5% für 10m", "fraud_flag spike> + 200% der Basis".
Auto-Aktionen: Mit dem Log 'withdrawals _ manual _ mode = true' aktivieren Sie den Kill-Switch über die Flag-Plattform.

Beispiel für eine Regel (Pseudo-Ausdruck):

rate(count_over_time({service="payments-api", level="ERROR", event="psp_decline"}[5m])) > 5

10) Retention, Indexierung, Lagerung

Heiß: 7-14 Tage (operative Untersuchung).
Warm: 30-90 Tage (Trends, RCA).
Kalt: 180-365 + (Archiv, Audit) - Komprimierung, günstige Klassen, eventuell ohne Volltextsuche.
Indizierung: feste Schlüssel ('service, env, level, event, trace_id, user. tenant_id') Verbot des Index „nur in Folge“.
Limits für Event-Größe (z.B. ≤ 32KB), Trim/Bottom: „Extra in Storage - Feind von MTTR“.


11) Audit und Unveränderlichkeit

Audit-Ereignisse schreiben Sie in einem separaten Thread mit Signaturen/Hashes, Serverzeit, 'who/what/when/why', Link zum Ticket.
„Wer hat die Bonus-Flagge zu 100% in DE aufgenommen?“ - die Antwort sollte in 1-2 Anfragen sein.

Beispiel für ein Audit:
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) Geschäftsereignisse und Datenmodell

Business Events sind kein "Text in Logs', sondern ein Vertrag:
  • `event_type`, `event_id`, `occurred_at`, `actor`, `subject`, `amount`, `currency`, `status`, `idempotency_key`.
  • Verwenden Sie Outbox und „at-least-once“ mit idempotenten Verbrauchern.

13) Kubernetes und Pipeline-Logs

Sidecar/DaemonSet-Agenten mit Puffer auf Festplatte (bei Netzwerkunterbrechungen).
Anmerkungen der Pods für das Routing ('log. type`, `retention. tier`).
Sammeln Sie die Protokolle der K8s-Controller separat (Cluster-Index).

Fluent Bit (Maskierung, Fragment):
ini
[FILTER]
Name     modify
Match
Remove    authorization, password, card_number

14) Anti-Muster

String-Protokolle „wie Sie müssen“, das Fehlen von 'trace _ id'.
PII/Geheimnisse in den Protokollen, Payload-Dumps in ihrer Gesamtheit.
Millionen von einzigartigen Schlüsseln → „explodierte“ Indizierung.
DEBUG in der Produktion 24/7.
Mischen Sie Audit, Sicherheit und Techlogs in einem Index.
Es gibt keine Retention-Richtlinie und keinen Wiederherstellungstest aus dem Archiv.


15) Implementierung Checkliste (0-45 Tage)

0-10 Tage

Aktivieren Sie W3C Trace Context in Gateway/Clients, Überschriftenumbruch.
Anwendungsprotokolle in JSON übersetzen, 'trace _ id '/' span _ id' hinzufügen.
PII/Secrets verbieten (Maskierung am Agenten), Feldliste genehmigen.

11-25 Tage

Threads auflösen: tech/biz/audit/security/infra, retention und ACL einstellen.
Aktivieren Sie OTel Collector, machen Sie tail-sampling Fehler/langsame Anfragen.
Dashboards „Log Rate/Error by route“ + Jump-to-trace (Beispiele).

26-45 Tage

Alerts durch Ereignismuster und Korrelation mit SLO.
Archiv/Wiederherstellung (DR-Test) für kalte Protokolle.
Linter Logdiagramme in CI, Vertrag für Business-Events.


16) Reifegradkennzahlen

Die Abdeckung der Anfragen „trace _ id“ ≥ 95%.
Der Anteil der JSON-Logs ≥ 99%.
Die über „jump-to-trace“ gefundenen Vorfälle wurden <15 min gelöst (p50).
0 PII-Fälle in den Protokollen (Leck-Scanner).
Die Retention wird bei allen Streams eingehalten (Audit wird automatisch nachgewiesen).


17) Anwendungen: Mini-Schnipsel

W3C traceparent Erzeugung (Pseudo)

txt traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01

PromQL - Logbündel und SLO (Beispiel)


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 - Korrelative Header

yaml components:
parameters:
Traceparent:
name: traceparent in: header required: false schema: { type: string }

18) Schlussfolgerung

Eine starke Log- und Trace-Schleife ist Konventionen + Disziplin: strukturelle JSON-Logs, eine einzige' trace _ id', sichere PII-Verarbeitung, Routing und Retention nach Threads sowie eine enge Verknüpfung mit SLO, Alerting und Pullbacks. Machen Sie den Übergang von der „Deponie von Texten“ zu Ereignis- und Trassenverträgen und die Diagnose von Prod-Vorfällen wird schnell, vorhersehbar und überprüfbar.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.