Skip to content

Gözlemlenebilirlik Tasarımı (Observability Design)

  • Sahip: Simetri
  • Son Güncelleme: 2026-04-17
  • Durum: Kabul edildi (ADR-005). Implementasyon ilk prod deploy öncesinde yapılacak.
  • Tetikleyici (dosya güncellemesi): Yeni metrik / log alanı / trace span eklendiğinde; alerting eşiği değiştiğinde; observability stack değişikliğinde.

1. Neden Gerekli?

İki regülatif bağlayıcılık + bir operasyonel gereklilik:

  1. EU AI Act Art. 61 — Yüksek riskli AI sistemlerinin prod sonrası davranışı sürekli izlenmeli.
  2. NIST AI RMF MEASURE 4.1 — "Post-deployment monitoring" fonksiyonu.
  3. Operasyonel ihtiyaç — Model davranış bozulması (drift), latency spike, RLS ihlal denemesi gibi olaylar sessizce geçmemeli.

Audit trail (audit-trail.md) compliance denetimi içindir — immutable, append-only, uzun süreli saklama. Observability ise operasyonel farkındalık içindir — kısa retention, hızlı sorgulama, anlık alarm.

İkisi birbirini tamamlar, ikame etmez.


2. Stack ve Veri Akışı

Karar: OpenTelemetry (instrumentation) + Grafana Cloud Free (backend). Detay ve gerekçe: guides/architecture-decisions/005-observability-stack-selection.md.

┌─────────────────────────────────────────────────────────────────┐
│  Railway Pro (compute)                                          │
│                                                                 │
│  ┌──────────────┐    ┌──────────────────────┐                   │
│  │ api-gateway   │    │ psychometric-engine  │                   │
│  │ (NestJS)      │    │ (FastAPI)            │                   │
│  │               │    │                      │                   │
│  │ OTLP SDK ─────┼────┼── OTLP SDK ─────────┼──► Grafana Cloud │
│  │               │    │                      │    ┌────────────┐│
│  │ stdout/stderr─┼────┼── stdout/stderr ─────┼──► │ Loki (log) ││
│  └──────────────┘    └──────────────────────┘    │ Mimir (met)││
│                                                   │ Tempo (trc)││
│  Railway Dashboard ← infra metrics (CPU/RAM/Net)  └────────────┘│
└─────────────────────────────────────────────────────────────────┘

OTLP transport: HTTPS (gRPC yerine — Railway'de outbound gRPC'de port kısıtı olabilir).

Collector (opsiyonel): MVP'de SDK'lar doğrudan Grafana Cloud'a gönderir. Trafik arttığında veya PII redaction merkezi olacaksa OpenTelemetry Collector ayrı Railway servisine eklenir.


3. Metrik Taksonomisi

3.1. Sistem Sağlığı (Infrastructure + Application)

MetrikTipBirimAlarm eşiği
http_request_duration_secondsHistogramsaniyep99 > 2s → warn; p99 > 5s → critical
http_requests_totalCounter— (trend için)
http_error_rateGauge (5dk pencere)%> %5 → warn; > %15 → critical
db_query_duration_secondsHistogramsaniyep99 > 1s → warn
db_connection_pool_usageGauge%> %80 → warn
redis_queue_depthGaugeadet> 1000 → warn

Railway infra metrikleri (CPU / RAM / disk) Railway Dashboard'dan izlenir. Duplike edilmez.

3.2. Model Davranışı (AI / LLM — EU AI Act Art. 61 Odağı)

MetrikTipBirimAlarm eşiğiKaynak
llm_direction_accuracyGauge (günlük eval)%< %85 → criticalGolden dataset eval
llm_hallucination_rateGauge (günlük eval)%> %2 → criticalGolden dataset eval
llm_eval_driftGauge (7-gün hareketli ort. farkı)%delta
llm_token_usage_totalCountertoken— (maliyet için)LLM Orchestrator
llm_cost_per_requestHistogramUSD> $0.50 → warnLLM Orchestrator
llm_latency_secondsHistogramsaniyep99 > 10s → warnLLM Orchestrator
adversarial_rejection_rateGauge (CI eval)%< %95 → criticaladversarial-eval-suite

3.3. Güvenlik ve Uyum

MetrikTipAlarm eşiği
rls_violation_attemptsCounter> 0 → critical (anlık)
pii_redaction_eventsCounter— (trend izleme; azalma = pipeline bozuk?)
auth_failure_rateGauge (5dk)> %20 → critical
audit_write_failuresCounter> 0 → critical (audit trail yazılamıyorsa log kaybı)
consent_level_downgradesCounter— (kullanıcı izin kısıtlamaları; trend takibi)

3.4. İş Metrikleri (Opsiyonel — Dashboards)

MetrikAçıklama
active_sessionsAnlık aktif sohbet oturumu
context_room_distributionPRO / SOCIAL / DISCOVERY oda dağılımı
label_override_rateKullanıcı müdahale oranı (veri tutarlılığı göstergesi)

4. Log Hiyerarşisi

4.1. Format: Structured JSON

Tüm log çıktısı JSON lines formatında stdout'a yazılır. Railway + Grafana Loki ikisi de bu formatı native parse eder.

json
{
  "timestamp": "2026-04-17T10:30:00.123Z",
  "level": "INFO",
  "service": "psychometric-engine",
  "trace_id": "abc123def456",
  "span_id": "789ghi",
  "context_room_id": "cr_42",
  "message": "Scoring completed",
  "duration_ms": 145,
  "trait": "bigfive_openness",
  "shift": 1.2
}

4.2. Severity Seviyeleri

LevelNe zamanAlarm?
ERRORİstek başarısız; kullanıcı etkilendiHata oranı eşiğinde evet
WARNKötüleşme sinyali; henüz hata yokEşik aşımında evet
INFONormal akış log'u (request start/end, scoring completed)Hayır
DEBUGGeliştirme ortamı detayıProd'da kapalı (volume + PII riski)

4.3. PII Redaction Pipeline

Kritik: Log ve trace'ler kullanıcı metin parçaları içerebilir → PII sızıntısı riski (threat-model.md §3.5).

Redaction katmanları (defense in depth):

  1. Uygulama seviyesi — Logger wrapper, bilinen PII alanlarını (user_text, transcript_snippet) hash'ler veya maskeler (***). İlk ve en önemli hat.
  2. Collector seviyesi (ileride) — OpenTelemetry Collector'da transform processor ile regex-based PII pattern sweep (email, TC kimlik, telefon).
  3. Grafana Cloud seviyesi — Loki'de label filter; user_text label'ı asla Loki'ye gönderilmez.

Kural: Hiçbir log satırında ham kullanıcı metni olmamalı. vector-privacy.md sanitization pipeline'ı log katmanına da uygulanır.


5. Trace Modeli (Distributed Tracing)

5.1. Trace Context Propagation

Her HTTP request için OpenTelemetry trace context (W3C Trace Context header: traceparent) oluşturulur.

[B2C Mobile] → [api-gateway] → [Redis queue] → [psychometric-engine]
     │              │                                    │
     │         span: gateway      (async)          span: scoring
     │         ├─ auth                              ├─ sanitize
     │         ├─ consent-check                     ├─ llm-inference
     │         └─ route                             ├─ ema-calculate
     │                                              └─ vectorize

     trace_id: abc123 (tüm span'ler aynı trace altında)

5.2. Trace ID Korelasyonu

IDNerede üretilirNerede kullanılır
trace_idOpenTelemetry SDK (gateway giriş noktası)Tüm span'ler, tüm log satırları
context_room_idAuth middleware (JWT'den)Log + span attribute
audit_event_idAudit trail yazarkenSpan attribute → Grafana'da trace → audit event korelasyonu

Bu üçlü sayesinde bir Grafana sorgusu: trace_id → audit_event_id → immutable log kaydı zinciri kurulabilir. Denetçi için "hangi request hangi audit event'i tetikledi?" sorusu yanıtlanır.


6. Alerting ve Incident Bağlantısı

6.1. Alert Routing

Alarm SeverityAksiyonİlişkili incident sınıfı (incident-response.md §1)
CriticalSlack #humindx-incident + PagerDuty/emailS1-S5 (veri ihlali, RLS bypass, availability)
WarningSlack #humindx-ops— (henüz incident değil, izle)
InfoDashboard'da görünür, bildirim yok

6.2. Pre-configured Alert Rules (MVP)

  1. llm_direction_accuracy < 85 → critical → S6 (Model Behavior Regression)
  2. rls_violation_attempts > 0 → critical → S2 (RLS Bypass)
  3. http_error_rate > 15% (5dk pencere) → critical → S5 (Availability)
  4. audit_write_failures > 0 → critical → log kaybı riski, S1'e eşdeğer
  5. llm_eval_drift |delta| > 5 → warning → S6 ön uyarı
  6. http_request_duration_seconds p99 > 5s → critical → S5

Alert kuralları Grafana Cloud Alerting'de tanımlanır. Notification channel: Slack webhook + email.


7. Dashboard Tasarımı (Özet)

DashboardİçerikBirincil izleyici
System HealthLatency histogramları, error rate, throughput, DB connection pool, Redis queueOn-call / SRE
Model BehaviorDirection Accuracy trend, hallucination rate, eval drift, token costAI/ML mühendis
SecurityRLS violation attempts, PII redaction events, auth failure rate, audit write healthSecurity lead
Business (opsiyonel)Active sessions, context room distribution, label override rateProduct

Dashboard JSON template'leri infra/grafana/dashboards/ altında version-control'da tutulur (ileride).


8. Retention ve Veri Sınıflandırması

Veri tipiRetentionNeredeCompliance notu
Audit trail (immutable)Süresiz (veya GDPR DSAR'a kadar)PostgreSQL / Immutable Log StoreCompliance kaydı — audit-trail.md
Operational metrics14 gün (Grafana Cloud Free)Grafana MimirOperasyonel; compliance dışı
Operational logs14 günGrafana LokiPII redacted; operasyonel
Traces14 günGrafana TempoPII redacted; operasyonel

14 gün yeterli mi? Evet — compliance için uzun süreli kayıt audit-trail.md ile sağlanır. Observability verileri "son 2 hafta ne oldu?" sorusunu yanıtlar. Retention artışı gerekirse Grafana Cloud Pro'ya geçiş yeterli.


9. Implementasyon Fazları

FazNe yapılırTetikleyici
Faz 0 (bu doküman)Tasarım + ADR-005 kabulSIM-177 (şimdi)
Faz 1OTLP SDK entegrasyonu (api-gateway + psychometric-engine), stdout JSON logging, temel metriklerİlk endpoint'ler prod'a hazır olunca
Faz 2Grafana Cloud hesap açma, dashboard + alert rule kurulumu, Slack webhookFaz 1 ile paralel
Faz 3Model behavior metrikleri (golden dataset eval → metrik emit), eval drift alertingGolden dataset eval CI pipeline çalışır olunca
Faz 4 (opsiyonel)OpenTelemetry Collector (merkezi PII redaction + batching), Railway log drain → LokiTrafik artarsa veya collector-seviye redaction gerekirse

10. Referanslar

  • ADR-005: guides/architecture-decisions/005-observability-stack-selection.md
  • Audit trail (compliance logging): security/audit-trail.md
  • PII redaction: security/vector-privacy.md, security/threat-model.md §3.5
  • Incident response: guides/incident-response.md — §2.1 alarm kaynakları bu dosyaya linkler
  • EU AI Act Art. 61: security/eu-ai-act-compliance.md §6
  • NIST AI RMF MEASURE 4.1: security/nist-ai-rmf-mapping.md
  • Adversarial eval eşikleri: security/adversarial-eval-suite.md §7

Son Güncelleme: 2026-04-17 — İlk sürüm, SIM-177. Stack: OpenTelemetry + Grafana Cloud Free (ADR-005).

Simetri tarafından inşa ediliyor.