Günlüğe kaydetme ve izleme olayları
Günlüğe kaydetme ve izleme olayları
1) Amaç ve çerçeve
Günlükler ve izler gözlemlenebilirliğin temelidir.
Günlükler'ne oldu've'ne bağlamı ile "yanıt verir.
İzler, dağıtılmış bir sorgu yolunda "nerede ve neden yavaş/hatalı'olarak yanıt verir.
- Varsayılan olarak yapılandırılmış (JSON); Trace-first: hot path üzerindeki her log 'trace _ id'/' span _ id'olarak bağlanır.
- Gürültü minimum, sinyal maksimum: seviyeler, örnekleme, anti-kardinalite.
- Güvenlik ve gizlilik: maskeleme, düzenleme, erişim kontrolü.
- Günlüklerin ve olayların düzenlenmiş diyagramları.
2) Olayların taksonomisi
Akışları ve dizinleri hedefe göre ayırın:1. Teknik günlükler (çalışma zamanı, hatalar, ağ zaman aşımları, geri yüklemeler).
2. Ticari etkinlikler (kayıt, depozito, oran, para çekme, KYC aşaması) - ürün analizleri ve "para" yollarındaki olaylar için uygundur.
3. Denetim (kim/ne zaman neyi değiştirdi: yapılandırır, erişir, bayraklar, sınırlar) değişmez bir dergidir.
4. Güvenlik (kimlik doğrulama, ayrıcalık yükseltme, yaptırım/PEP bayrakları).
5. Altyapı (K8s olaylar, otomatik ölçekleme, HPA/VPA, düğümler/disk/ağ).
Her akış için - tutma, dizinleme ve erişim için ayrı kurallar.
3) Yapısal kütük (JSON standardı)
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" }
}
Gereksinimler: düz şema + alana göre ekler, gerekli alanlar ('ts, seviye, servis, env, trace_id, msg'), sayısal değerler - sayılar, dizeler değil.
4) Seviyeler, kardinalite ve kapsam
Düzeyler: 'DEBUG' (satışta değil), 'INFO' (iş bilgileri), 'WARN' (anomaliler), 'ERROR' (hatalar), 'FATAL' (çökmeler).
Kardinalite: rastgele tuşlardan/dinamik etiketlerden kaçının. "Anahtar içinde kimlik" yok.
Örnekleme günlükleri: hız sınırı yinelenen mesajlar; 'DEBUG' özelliğini yalnızca kapsamlı ve zamanında etkinleştirin (özellik bayrağı).
Idempotency: Tüketiciler tarafından yinelenen olayları bastırmak için 'idempotency _ key' yazın.
5) Gizlilik ve güvenlik
Maske PII/ajanların sırları (Fluent Bit/Vector): anahtar maskeleme kartları ('e-posta ',' kart ',' belirteç ',' yetkilendirme ').
Hash 'user _ key', yalnızca gerekli bağlamı tutar (ülke, KYC düzeyi, VIP düzeyi).
Ayrı depolar: sıcak (çevrimiçi arama) ve soğuk (PII olmadan/soyulmuş bir bağlamla arşiv).
Denetim - yalnızca ekleme, WORM depolama, yalnızca en az ayrıcalık ilkesine erişim.
6) İzleme: standartlar ve bağlam
W3C Trace Bağlam: 'Traceparent'/' tracestate' başlıkları, artı güvenli anahtarlar için bagaj (örn. 'tenant _ id', 'bölge').
Bağlantı metrikleri ve izleri: Örnekler - histogramların örnekleme noktalarına 'trace _ id' iletin (RCA'yı hızlandırır).
Örnekleme: temel örnekleme 1-5 % + dynamic "on error/slow p95" problem sorguları için %100'e kadar.
Bağlantılar: Asenkron kuyruklar/sagalar için, bağlantı sadece 'üst'değil,' bağlantılar 'üzerinden yayılır.
7) Toplama ve yönlendirme
Ajan: Günlükler için Akıcı Bit/Vektör; OTLP, OpenTelemetry Collector'a dışa aktarılır.
Toplayıcı: merkezi ağ geçidi (toplu/dönüştürme/filtre/yönlendirme).
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 Toplayıcı (parça):
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) Enstrümantasyon: SDK örnekleri
8. 1 Düğüm. 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 - üstbilgi izleme
nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
9) Uyarılar ve otomatik işlemler için bir sinyal olarak günlükler
Hatalı desenler ('psp _ decline', 'fraud _ flag') toplanır ve SLO ile ilişkilidir.
Desen hızı ile ilgili uyarılar: "5xx by/withdraw> 0. 10 m başına %5", "fraud_flag spike> tabanın + %200'ü"
Otomatik eylemler: günlük 'withdrawals _ manual _ mode = true'ise, bayrak platformu üzerinden kill-switch'i etkinleştirin.
Örnek kural (sözde ifade):
rate(count_over_time({service="payments-api", level="ERROR", event="psp_decline"}[5m])) > 5
10) Tutma, endeksleme, depolama
Sıcak: 7-14 gün (operasyonel soruşturma).
Sıcak: 30-90 gün (eğilimler, RCA).
Soğuk: 180-365 + (arşiv, denetim) - sıkıştırma, ucuz sınıflar, muhtemelen tam metin arama olmadan.
İndeksleme: sabit anahtarlar ('service, env, level, event, trace_id, user. tenant_id'), "arka arkaya her şey" endeksinin yasaklanması.
Olay boyutu sınırları (örneğin, ≤ 32KB), trim/alt: "ekstra depolama MTTR düşmanıdır".
11) Denetim ve değişmezlik
Denetim olaylarını imzalar/hash'ler, sunucu zamanı,'kim/ne/ne/ne/neden ", bilete bir bağlantı içeren ayrı bir akışta yazın.
"Bonus bayrağını DE'ye %100 kim dahil etti?" - Cevap 1-2 istekte olmalıdır.
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) İş Etkinlikleri ve Veri Modeli
İş etkinlikleri "günlüklerde metin'değil, bir sözleşmedir:- 'event _ type', 'event _ id', 'occured _ at', 'actor', 'subject', 'amount', 'currency', 'status', 'idempotency _ key'.
- Idempotent tüketicilerle Outbox ve'en az bir kez "kullanın.
13) Kubernetes ve boru hattı günlükleri
Diske arabellekli Sidecar/DaemonSet aracıları (ağ kesintileri sırasında).
Yönlendirme için pedlerin ek açıklamaları ('log. ',' tutma yazın. katman ').
K8s denetleyicilerin günlüklerini ayrı ayrı toplayın (küme indeksi).
ini
[FILTER]
Name modify
Match
Remove authorization, password, card_number
14) Anti-desenler
Dize günlükleri "gerektiği gibi", 'trace _ id' yokluğu.
PII/günlüklerdeki sırlar, bütünüyle yük boşaltma.
Milyonlarca benzersiz anahtar - "patladı" indeksleme.
DEBUG 7/24 satışta.
Denetim, güvenlik ve teknoloji uzmanlarını bir endekste birleştirmek.
Saklama politikası ve yedekleme kurtarma testi yoktur.
15) Uygulama kontrol listesi (0-45 gün)
0-10 gün
Ağ geçidi/istemcilerde W3C İzleme Bağlamını etkinleştirin, başlıkları iletin.
Uygulama günlüklerini JSON'a çevirin, 'trace _ id'/' span _ id' ekleyin.
PII/sırları reddedin (ajan üzerinde maskeleme), alanların listesini onaylayın.
11-25 gün
Ayrı akışlar: teknoloji/biz/denetim/güvenlik/infra, set tutma ve ACL.
OTel Collector, kuyruk örnekleme hataları/yavaş sorguları etkinleştirin.
"Log Rate/Error by route" + Jump-to-trace (Exemplars) panoları.
26-45 gün
Olay modeli uyarıları ve SLO ile korelasyon.
Soğuk günlükler için Arşiv/geri yükleme (DR testi).
CI'da log diyagramlarının linter, iş etkinlikleri için sözleşme.
16) Olgunluk metrikleri
'Trace _ id' %95 ≥ kapsama alanı talep ediyor.
JSON günlüklerinin payı %99 ≥.
"Jump-to-trace" yoluyla bulunan olaylar <15 dakika (p50) çözüldü.
Günlüklerde 0 PII durumu (sızıntı tarayıcı).
Tutma, tüm akışlar için gözlemlenir (denetimi otomatik olarak kanıtlarız).
17) Uygulamalar: Mini Snippet'ler
W3C traceparent üretimi (sözde)
txt traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
PromQL - bir grup günlük ve SLO (örnek)
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 - korelasyon başlıkları
yaml components:
parameters:
Traceparent:
name: traceparent in: header required: false schema: { type: string }
18) Sonuç
Güçlü bir günlüğe kaydetme ve izleme devresi bir anlaşma + disiplindir: yapısal JSON günlükleri, tek bir 'trace _ id', güvenli PII işleme, akışlar üzerinde yönlendirme ve tutma, ayrıca SLO, uyarı ve geri dönüşlerle yakın bağlantı. "Metinlerin dökümü'nden olay sözleşmelerine ve izlerine geçiş yapın ve üretim olaylarının teşhisi hızlı, öngörülebilir ve doğrulanabilir hale gelecektir.