GH GambleHub

Evenimente de logare și urmărire

Evenimente de logare și urmărire

1) Scop și cadru

Jurnalele și traseele sunt baza observabilității.
Jurnalele răspund la „ce sa întâmplat” și „cu ce context”.
Urmele răspund la „unde și de ce încet/eronat” într-o cale de interogare distribuită.

Principii cheie:
  • Structurat în mod implicit (JSON); Trace-first: fiecare jurnal de pe calea fierbinte este legat de 'trace _ id'/' span _ id'.
  • Zgomot minim, semnal maxim: niveluri, prelevare de probe, anti-cardinalitate.
  • Securitate și confidențialitate: mascare, editare, control acces.
  • Diagrame versionate de busteni si evenimente.

2) Taxonomia evenimentelor

Fluxuri și indici separați după destinație:

1. Jurnale tehnice (runtime, erori, timeout-uri de rețea, retroys).

2. Evenimente de afaceri (înregistrare, depozit, rată, retragere, etapa KYC) - potrivite pentru analiza produselor și incidente de-a lungul căilor „bani”.

3. Auditul (cine/când a schimbat ce: configurații, accesări, steaguri, limite) este un jurnal neschimbabil.

4. Securitate (autentificare, escaladare privilegiu, sancțiune/steaguri PEP).

5. Infrastructură (evenimente K8s, autoscaling, HPA/VPA, noduri/disc/rețea).

Pentru fiecare flux - reguli separate pentru retenție, indexare și acces.


3) Jurnal structural (standard 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" }
}

Cerințe: sistem plat + atașamente pe domenii, câmpuri obligatorii ('ts, level, service, env, trace_id, msg'), valori numerice - numere, nu șiruri.


4) Niveluri, cardinalitate și domeniul de aplicare

Niveluri: „DEPANARE” (nu în vânzări), „INFO” (fapte de afaceri), „AVERTIZARE” (anomalii), „EROARE” (erori), „FATAL” (accidente).
Cardinalitate: evitați cheile arbitrare/etichetele dinamice. Nu „id-in-cheie”.
Jurnalele de eșantionare: mesaje repetate cu limită de rată; activați „DEPANARE” numai scoped și în timp (feature flag).
Idempotency: Log 'idempotency _ key' pentru a suprima evenimentele duplicate de către consumatori.


5) Confidențialitate și securitate

Masca PII/secrete pe agenți (Fluent Bit/Vector): carduri de mascare cheie ("e-mail", "card'," token "," autorizare ").
Hash 'user _ key', țineți doar contextul necesar (țară, nivel KYC, nivel VIP).
Depozite separate: cald (căutare online) și rece (arhivă fără PII/cu un context dezbrăcat).
Audit - numai adăugați, stocare WORM, acces numai pe principiul celui mai mic privilegiu.


6) Urmărirea: standarde și context

Context de urmărire W3C: anteturi „traceparente ”/„ tracestate”, plus bagaje pentru chei securizate (de ex. 'tenant _ id',' regiune ').
Link metrics and traces: Exemplars - pass' trace _ id' to the sampling points of the histograms (accelerează RCA).
Eșantionare: eșantionare de bază 1-5% + dinamică „pe eroare/lent p95” până la 100% pentru interogări de probleme.
Link-uri: Pentru cozi asincrone/sagas, link-ul se întinde prin „link-uri”, nu doar prin „părinte”.


7) Colectarea și rutarea

Agent: Fluent Bit/Vector pentru busteni; Exportul OTLP către OpenTelemetry Collector.
Colector: gateway central (lot/transforma/filtru/rutare).

Transportor recomandat:

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)
Colector OTel (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) Instrumentație: exemple SDK

8. 1 Nod. 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 → urmărirea antetului

nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;

9) Jurnalele ca semnal pentru alerte și auto-acțiuni

Modelele eronate ('psp _ decline', 'fraud _ flag') se agregă și se corelează cu SLO.

Alerte privind rata de tipar: "5xx prin/retragere> 0. 5% pe 10m", "fraud_flag spike> + 200% din bază"

Auto-acțiuni: dacă jurnalul este 'withdrawals _ manual _ mode = true', activați kill-switch prin platforma de pavilion.

Exemplu de regulă (pseudo-expresie):

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

10) Retenție, indexare, stocare

Fierbinte: 7-14 zile (investigație operațională).
Cald: 30-90 zile (tendințe, RCA).
Rece: 180-365 + (arhivă, audit) - compresie, clase ieftine, eventual fără căutare full-text.
Indexare: chei fixe ('service, env, level, event, trace_id, user. tenant_id'), interzicerea indicelui „totul la rând”.
Limitele dimensiunii evenimentului (de exemplu, ≤ 32KB), tăiați/jos: „extra în depozitare este inamicul MTTR”.


11) Audit și imutabilitate

Scrieți evenimente de audit într-un flux separat cu semnături/hashes, timpul serverului, „cine/ce/când/de ce”, un link către bilet.
„Cine a inclus steagul bonus 100% în DE?” - răspunsul trebuie să fie în 1-2 cereri.

Exemplu de 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) Evenimente de afaceri și modelul de date

Evenimentele de afaceri nu sunt „text în jurnale”, ci un contract:
  • 'event _ type', 'event _ id',' happened _ at ',' actor ',' subject ',' cuantum ',' valute ',' status ',' idempotency _ key '.
  • Utilizați Outbox și „cel puțin o dată” cu consumatori idempotenți.

13) Kubernete și jurnalele de conducte

Agenți Sidecar/DaemonSet cu tampon pe disc (în timpul întreruperilor de rețea).
Adnotări de tampoane pentru rutare ('log. tip ',' retenţie. nivelul ").
Colecta jurnalele de controlere K8s separat (cluster index).

Fluent Bit:
ini
[FILTER]
Name     modify
Match
Remove    authorization, password, card_number

14) Anti-modele

Jurnalele de coarde „după cum este necesar”, absența 'trace _ id'.
PII/secrete în jurnalele, haldele de sarcină utilă în întregime.
Milioane de chei unice → „explodat” indexarea.
DEPANARE în vânzare 24/7.
Amestecarea auditului, securității și tehnologilor într-un singur index.
Nu există nici o politică de retenție și nici un test de recuperare de rezervă.


15) Lista de verificare a implementării (0-45 zile)

0-10 zile

Activați contextul de urmărire W3C pe gateway/clienți, anteturi de redirecționare.
Traduceți jurnalele de aplicații în JSON, adăugați 'trace _ id'/' span _ id'.
Refuzați PII/secretele (mascarea pe agent), aprobați lista câmpurilor.

11-25 zile

Fluxuri separate: tech/biz/audit/securitate/infra, retenție set și ACL.
Activați OTel Collector, erori de eșantionare a cozii/interogări lente.
Tablouri de bord „Log Rate/Eroare pe rută” + Jump-to-trace (Exemplare).

26-45 zile

Alerte de model eveniment și corelație cu SLO.
Arhivă/restaurare (test DR) pentru jurnalele reci.
Linter de diagrame jurnal în CI, contract pentru evenimente de afaceri.


16) Valorile maturității

'Acoperire trace _ id' request ≥ 95%.
Ponderea jurnalelor JSON ≥ de 99%.
Incidentele constatate prin „salt-to-trace” s-au rezolvat <15 min (p50).
0 cazuri PII în jurnale (scaner de scurgeri).
Retenția este observată pentru toate fluxurile (dovedim auditul automat).


17) Aplicații: Mini fragmente

Generație traceparentă W3C (pseudo)

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

PromQL - o grămadă de jurnale și SLO (exemplu)


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 - anteturi de corelare

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

18) Concluzie

Un circuit puternic de logare și urmărire este un acord + disciplină: jurnale structurale JSON, o singură "trace _ id', procesare PII sigură, rutare și păstrare peste fluxuri, precum și o legătură strânsă cu SLO, alertă și rollback-uri. Faceți trecerea de la „groapa de texte” la contracte de evenimente și piese, iar diagnosticul incidentelor de producție va deveni rapid, previzibil și verificabil.

Contact

Contactați-ne

Scrieți-ne pentru orice întrebare sau solicitare de suport.Suntem mereu gata să ajutăm!

Pornește integrarea

Email-ul este obligatoriu. Telegram sau WhatsApp sunt opționale.

Numele dumneavoastră opțional
Email opțional
Subiect opțional
Mesaj opțional
Telegram opțional
@
Dacă indicați Telegram — vă vom răspunde și acolo, pe lângă Email.
WhatsApp opțional
Format: cod de țară și număr (de exemplu, +40XXXXXXXXX).

Apăsând butonul, sunteți de acord cu prelucrarea datelor dumneavoastră.