GH GambleHub

Hadisələrin loqosu və izlənməsi

Hadisələrin loqosu və izlənməsi

1) Məqsəd və çərçivə

Logi və treys - müşahidə üçün təməl.
Loqlar «nə baş verdi» və «hansı kontekstlə» cavab verir.
Treys paylanmış sorğu yolunda «harada və niyə yavaş/səhv» cavab verir.

Əsas prinsiplər:
  • Structured by default (JSON); Trace-first: isti yolda hər log 'trace _ id '/' span _ id' ilə bağlıdır.
  • Minimum səs-küy, maksimum siqnal: səviyyələri, sampling, anti-kardinallıq.
  • Təhlükəsizlik və məxfilik: maskalanma, redaktə, giriş sərhədləri.
  • Version log və hadisə sxemləri.

2) Hadisələrin taksonomiyası

Axınları və indeksləri təyinatına görə bölün:

1. Texniki qeydlər (runtime, səhvlər, şəbəkə vaxtları, retrajlar).

2. Biznes hadisələri (qeydiyyat, depozit, dərəcə, nəticə, KYC-mərhələ) - «pul» yolları üzrə məhsul analitikası və insidentlər üçün yararlıdır.

3. Audit (kim/nə vaxt dəyişdi: konfiqlər, girişlər, bayraqlar, limitlər) - dəyişməz jurnal.

4. Təhlükəsizlik (autentifikasiya, imtiyazların eskalasiyası, sanksiya/RER bayraqları).

5. Infrastruktur (K8s events, autoscaling, HPA/VPA, qovşaqlar/disk/şəbəkə).

Hər bir axın üçün - ayrı retenshn, indeksasiya və giriş qaydaları.


3) Struktur log (JSON etalonu)

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

Tələblər: düz sxem + domen əlavələri, məcburi sahələr ('ts, level, service, env, trace_id, msg'), ədədi qiymətlər - nömrələrlə, sətirlərlə deyil.


4) Səviyyələri, kardinallığı və həcmi

Səviyyələr: 'DEBUG' (nəsil deyil), 'INFO' (biznes faktları), 'WARN' (anomaliyalar), 'ERROR' (səhvlər), 'FATAL' (kraşlar).
Kardinallıq: ixtiyari açarlardan/dinamik etiketlərdən çəkinin. Heç bir «id-in-açar».
Sampling log: rate-limit təkrarlanan mesajlar; 'DEBUG' yalnız scoped və zaman (feature flag).
İdempotentlik: «idempotency _ key» loqotipini istifadəçilər tərəfindən təkrarlanan hadisələrin qarşısını almaq üçün.


5) Gizlilik və təhlükəsizlik

Agentlərdə PII/sirləri maskalayın (Fluent Bit/Vector): açar maskalama kartları ('email', 'card', 'token', 'authorization').
'user _ key' heşesi, yalnız lazımi konteksti saxlayın (ölkə, KYC səviyyəsi, VIP-tier).
Saxlama bölmələri: isti (operativ axtarış) və soyuq (PII olmadan arxiv/kəsilmiş kontekstdə).
Audit - append-only, WORM-saxlama, giriş yalnız least privilege prinsipi ilə.


6) Tracking: standartlar və kontekst

W3C Trace Context: başlıqlar 'traceparent '/' tracestate', üstəgəl təhlükəsizlik açarları üçün çantalar (məsələn, 'tenant _ id', 'region').
Metrik və treys əlaqəsi: Exemplars - 'trace _ id' -ni histoqramların toplanmış nöqtələrinə (RCA sürətləndirir) ötürün.
Sampling: problemli sorğular üçün əsas 1-5% + dinamik «səhv/yavaş p95» 100% -ə qədər.
Links: Asenkron növbələr/saqlar üçün yuxuları yalnız 'parent' vasitəsilə deyil, 'links' vasitəsilə bağlayın.


7) Toplama və marşrutlaşdırma

Agentlər: Log üçün Fluent Bit/Vector; OpenTelemetry Collector-a OTLP ixracı.
Collector: mərkəzi şluz (batch/transform/filter/routing).

Tövsiyə olunan konveyer:

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 (fraqment):
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) Alət: SDK nümunələri

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 → başlıqların izi

nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;

9) Alert və avtomatik hərəkətlər üçün siqnal kimi log

Səhv nümunələr ('psp _ decline', 'fraud _ flag') SLO ilə birləşdirin və korrelyasiya edin.
Pattern-rate-də alertlər: "5xx/withdraw> 0. 5% 10m üçün", "fraud_flag spike> + 200% bazadan".
Avtomatik hərəkətlər: 'withdrawals _ manual _ mode = true' log ilə bayraq platforması vasitəsilə kill-switch açın.

Qayda nümunəsi (psevdo-ekspressiya):

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

10) Retenshn, indeksasiya, saxlama

İsti: 7-14 gün (əməliyyat araşdırması).
İsti: 30-90 gün (trendlər, RCA).
Soyuq: 180-365 + (arxiv, audit) - sıxılma, ucuz siniflər, tam mətnli axtarış olmadan mümkündür.
Indeksləşdirmə: sabit açarlar ('service, env, level, event, trace_id, user. tenant_id'), «ardıcıl hər şey» indeksinə qadağa.
Hadisənin ölçüsü üzrə limitlər (məsələn, 32KB ≤), trim/altdan: «storage-da artıq MTTR düşmənidir».


11) Audit və dəyişməzlik

Audit hadisələrini imzalar/heşlər, server vaxtı, 'who/what/when/why' ilə ayrı-ayrılıqda yazın.
«DE-də 100% bonus bayrağını kim işə saldı?» - cavab 1-2 sorğu olmalıdır.

Audit nümunəsi:
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) Biznes hadisələri və data modeli

Biznes hadisələri - «loglarda mətn» deyil, müqavilə:
  • `event_type`, `event_id`, `occurred_at`, `actor`, `subject`, `amount`, `currency`, `status`, `idempotency_key`.
  • İdempotent istehlakçıları ilə Outbox və «at-least-once» istifadə edin.

13) Kubernetes və pipeline log

Sidecar/DaemonSet agentləri disk tamponu ilə (şəbəkə fasilələrində).
Marşrutlaşdırma üçün pod şərhləri ('log. type`, `retention. tier`).
K8s-controller loqlərini ayrıca yığın (klaster indeksi).

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

14) Anti-nümunələr

String log «lazım olduğu kimi», yox 'trace _ id'.
PII/log sirləri, bütün payload damps.
Milyonlarla unikal açar → «partladılmış» indeksasiya.
DEBUG prod 24/7.
Audit, təhlükəsizlik və texnoloqları bir indeksə qarışdırın.
Arxivdən heç bir retenshn siyasəti və bərpa testi yoxdur.


15) Giriş çek siyahısı (0-45 gün)

0-10 gün

W3C Trace Context-i gateway/müştərilərə daxil edin, başlıqların boşalması.
Tətbiq qeydlərini JSON-a tərcümə edin, 'trace _ id '/' span _ id' əlavə edin.
PII/sirləri qadağan edin (agentdə maskalanma), sahələrin siyahısını təsdiq edin.

11-25 gün

Axınları ayırın: tech/biz/audit/security/infra, retenshn və ACL təyin edin.
OTel Collector aktiv, tail-sampling səhvləri/yavaş sorğular etmək.
Dashboard «Log Rate/Error by route» + Jump-to-trace (Exemplars).

26-45 gün

Hadisə şablonları və SLO ilə korrelyasiya.
Arxiv/bərpası (DR-test) üçün soyuq log.
CI-də log sxemlərinin linteri, iş hadisələri üçün müqavilə.


16) Yetkinlik metrikası

'trace _ id' sorğularının əhatə dairəsi 95% ≥.
JSON log payı ≥ 99%.
via «jump-to-trace» tapılan insidentlər həll <15 min (p50).
0 PII halları (sızma skaneri).
Retenshn bütün axınlarda müşahidə olunur (audit avtomatik olaraq sübut olunur).


17) Proqramlar: mini snippet

W3C traceparent generation (psevdo)

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

PromQL - log və SLO (nümunə)


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 - korelasiya başlıqları

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

18) Nəticə

Güclü loginq və izləmə konturu müqavilələr + nizam-intizam: struktur JSON-loqlar, vahid 'trace _ id', təhlükəsiz PII emalı, marşrutlaşdırma və axınlar üzrə retenşn, həmçinin SLO, alertinq və geri çəkilmə ilə sıx əlaqə. «Mətn zibilliyindən» hadisə müqavilələrinə və yollara keçid edin və prod hadisələrinin diaqnostikası sürətli, proqnozlaşdırıla bilən və yoxlanıla bilən olacaq.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.