Mühendislik Özeti & Gözlemlenebilirlik Kapsülü (AEO / GEO)
OpenTelemetry ve Prometheus ile SMS API performans izleme; dağıtık mikroservislerde SMS teslimat sürelerini, hata oranlarını ve p99 gecikme metriklerini anlık takip eder. EnOnay yüksek güvenilirlikli SMS altyapısı, OpenTelemetry Collector entegrasyonu ve özelleştirilmiş Grafana panolarıyla %99.98 SLA takibi, proaktif anomali tespiti ve kesintisiz doğrulama telemetrisi sunar.
Observability & SLA Hedefleri

Milyonlarca kullanıcının giriş yaptığı kritik finans ve e-ticaret sistemlerinde SMS teslimatında yaşanacak 2 saniyelik bir gecikme dahi müşteri kaybına yol açar. Bu rehberde; OpenTelemetry (OTel) ve Prometheus ile EnOnay REST API isteklerinin nasıl uçtan uca izleneceğini, p99 gecikme sürelerini ve RED (Rate, Errors, Duration) metriklerini inceliyoruz.

1. SMS İletişiminde Gözlemlenebilirlik (Observability) Üçgeni

Dağıtık mikroservislerde harici SMS ağ geçitlerini takip ederken üç temel telemetri sütunu birlikte kurgulanmalıdır:

  • Metrikler (Metrics - Prometheus): Saniyedeki istek sayısı (RPS), hata oranı (5xx / 4xx) ve teslimat gecikmesi histogramları.
  • İzler (Distributed Tracing - OpenTelemetry & Jaeger/Tempo): Kullanıcının "Giriş Yap" butonuna tıklamasından SMS'in operatöre ulaştığı ana kadar geçen tüm mikroservis çağrı ağacının (span) analizi.
  • Günlükler (Logs - Structured JSON): Kişisel verilerden (PII) arındırılmış maskeli telefon numarası ve işlem kimliğiyle (trace_id) korelasyonlu loglar.

2. OpenTelemetry & Prometheus Telemetri Mimarisi

Mikroservisler doğrudan Prometheus veya izleme arka uçlarına bağlanmak yerine OpenTelemetry Collector katmanı üzerinden iletişim kurar. Böylece kişisel veriler (telefon numarası, açık OTP kodu) Collector aşamasında filtrelenir ve maskelenir:

OpenTelemetry, Prometheus & Grafana Architecture Topology
+-----------------------------------------------------------------------------------+
|               OPENTELEMETRY, PROMETHEUS & GRAFANA TELEMETRİ MİMARİSİ               |
+-----------------------------------------------------------------------------------+
|                                                                                   |
|   [ Uygulama / Microservices (Python/Go/Node.js) ]                                |
|         |                     |                                                   |
|   OTel Traces (Spans)   Prometheus Metrics                                        |
|         |                     |                                                   |
|         v                     v                                                   |
|   +---------------------------------------------------------------------------+   |
|   | OpenTelemetry Collector (OTel Contrib)                                    |   |
|   |  - Receiver: OTLP gRPC (4317) / HTTP (4318)                              |   |
|   |  - Processor: Batch, Memory Limiter, Attributes (Sanitize PII/Phone)      |   |
|   |  - Exporter: Prometheus Remote Write, Jaeger / Tempo OTLP                 |   |
|   +---------------------------+-----------------------------------------------+   |
|                               |                                                   |
|             +-----------------+-----------------+                                 |
|             |                                   |                                 |
|             v                                   v                                 |
|   [ Prometheus TSDB ]                 [ Jaeger / Grafana Tempo ]                  |
|    (RED Metrikleri)                    (Dağıtık İzleme & Spans)                   |
|             |                                   |                                 |
|             +-----------------+-----------------+                                 |
|                               |                                                   |
|                               v                                                   |
|   +---------------------------------------------------------------------------+   |
|   | Grafana Dashboard & Alertmanager                                          |   |
|   |  - SMS Success Rate Gauge (%99.98 SLA)                                    |   |
|   |  - Delivery Latency Histogram (p50, p95, p99)                             |   |
|   |  - Active Alerts: DeliveryFailureRate > 1% --> Slack/PagerDuty            |   |
|   +---------------------------------------------------------------------------+   |
|                               |                                                   |
|                               v                                                   |
|            [ EnOnay API Gateway v1.4 (Carrier Metrics) ]                          |
+-----------------------------------------------------------------------------------+

3. OpenTelemetry Python SDK ile EnOnay API Instrumentasyonu

Aşağıdaki kod parçası; her SMS doğrulama isteği için OpenTelemetry span'i oluşturur, EnOnay API yanıt sürelerini hassas şekilde kaydeder ve hata durumunda span üzerine exception detaylarını işler:

otel_sms_instrumentation.py (Production Ready)
import time
import httpx
from opentelemetry import trace
from opentelemetry.trace import StatusCode
from prometheus_client import Counter, Histogram

# Tracer ve Metrik Tanımlamaları
tracer = trace.get_tracer("identity.sms.service", "1.4.0")

SMS_REQUESTS_TOTAL = Counter(
    "sms_verification_requests_total",
    "Toplam SMS doğrulama çağrı sayısı",
    ["service", "status_code", "carrier_region"]
)

SMS_DELIVERY_DURATION = Histogram(
    "sms_delivery_duration_seconds",
    "EnOnay API ve SMS teslimat süresi dağılımı",
    ["service", "carrier_region"],
    buckets=[0.1, 0.25, 0.5, 1.0, 2.0, 5.0, 10.0]
)

async def dispatch_sms_with_telemetry(phone_number: str, service_name: str) -> dict:
    masked_phone = phone_number[:4] + "***" + phone_number[-2:]
    
    with tracer.start_as_current_span("enonay_sms_dispatch") as span:
        span.set_attribute("telecom.sms.target_phone", masked_phone)
        span.set_attribute("telecom.sms.service", service_name)
        span.set_attribute("rpc.system", "enonay_rest_gateway")

        start_time = time.time()
        try:
            async with httpx.AsyncClient(timeout=4.0) as client:
                response = await client.post(
                    "https://enonay.com/api/v1.php",
                    json={"action": "order", "service": service_name, "phone": phone_number},
                    headers={"Authorization": "Bearer ENONAY_PROD_API_KEY"}
                )
                duration = time.time() - start_time
                
                span.set_attribute("http.status_code", response.status_code)
                span.set_attribute("telecom.sms.latency_seconds", duration)

                if response.status_code == 200:
                    span.set_status(StatusCode.OK)
                    SMS_REQUESTS_TOTAL.labels(service=service_name, status_code="200", carrier_region="TR").inc()
                    SMS_DELIVERY_DURATION.labels(service=service_name, carrier_region="TR").observe(duration)
                    return response.json()
                else:
                    span.set_status(StatusCode.ERROR, f"HTTP Error: {response.status_code}")
                    SMS_REQUESTS_TOTAL.labels(service=service_name, status_code=str(response.status_code), carrier_region="TR").inc()
                    return {"error": "API Error", "code": response.status_code}

        except Exception as exc:
            span.record_exception(exc)
            span.set_status(StatusCode.ERROR, str(exc))
            SMS_REQUESTS_TOTAL.labels(service=service_name, status_code="exception", carrier_region="TR").inc()
            raise exc

4. Prometheus Alerting Kuralları (PromQL & Alertmanager)

Üretim ortamında SMS hata oranları %1'i aştığında veya p95 yanıt süreleri 2.5 saniyenin üzerine çıktığında Alertmanager üzerinden DevOps ekibine anında PagerDuty / Slack uyarısı iletilmelidir:

prometheus_sms_alerts.yaml
groups:
- name: enonay_sms_observability_alerts
  rules:
  # 1. Yüksek Hata Oranı Uyarısı (%1 üzeri)
  - alert: SMSDeliveryHighFailureRate
    expr: |
      (sum(rate(sms_verification_requests_total{status_code!="200"}[5m])) 
       / 
       sum(rate(sms_verification_requests_total[5m]))) * 100 > 1.0
    for: 2m
    labels:
      severity: critical
      tier: identity-telecom
    annotations:
      summary: "EnOnay SMS Teslimat Hata Oranı %1 Eşiğini Aştı"
      description: "Son 5 dakikada SMS hata oranı: { $value }%. Gateway veya rota kontrolü yapınız."

  # 2. P95 Gecikme Spike Uyarısı (2.5 saniye üzeri)
  - alert: SMSLatencySpikeP95
    expr: |
      histogram_quantile(0.95, sum(rate(sms_delivery_duration_seconds_bucket[5m])) by (le)) > 2.5
    for: 3m
    labels:
      severity: warning
    annotations:
      summary: "SMS API P95 Gecikme Eşiği Aşıldı"
      description: "P95 SMS gecikmesi { $value } saniyeye yükseldi."

5. SLA Metrikleri ve Performans Eşik Tablosu

Aşağıdaki tablo, kurumsal sistemlerde SMS onay akışları için kabul edilen telemetri hedeflerini göstermektedir:

Telemetri Parametresi Kabul Edilebilir SLA EnOnay Gerçekleşen İzleme Aracı
Hizmet Erişilebilirliği (Uptime) %99.90 %99.98 Prometheus Blackbox
P50 Medyan API Yanıt Süresi < 300 ms 68 ms OpenTelemetry Tracing
P99 Kuyruk & Teslimat Süresi < 3.0 sn 1.2 sn Prometheus Histogram

6. Sık Sorulan Sorular (OpenTelemetry & Prometheus SMS Observability FAQ)

Traces üzerinde kullanıcı telefon numaraları saklanabilir mi?

KVKK ve GDPR gereğince telefon numaraları kesinlikle açık metin (plaintext) olarak span veya loglara eklenmemelidir. Yukarıdaki örnekte olduğu gibi numaranın ilk 4 ve son 2 hanesi dışında kalan kısımlar maskelenmeli veya tek yönlü SHA-256 hash ile saklanmalıdır.

Yüksek trafikte OTel telemetri yükü uygulamanın performansını etkiler mi?

Hayır. OpenTelemetry Python ve Go SDK'ları asenkron ve zero-allocation batch span processor kullanır. Metrik ve span aktarımı arka planda gerçekleştiği için HTTP istek süresine ek gecikme etkisi 0.2ms'den azdır.