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 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:
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:
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.