Monitoring ve Bakım
Cron Görevleri
| Sıklık | Script | Açıklama |
|---|---|---|
| Her 5dk | health-check.sh | RAM, swap, disk, API yanıt süresi |
| Her 15dk | container-monitor.sh | Container sağlık, TimescaleDB job'ları, Redis bellek |
| Günlük 00:00 | cleanup-docker.sh | Dangling image, build cache, volume temizliği |
| Günlük 00:05 | pg-slow-query-snapshot.sh | PostgreSQL yavaş sorgu raporu |
| Günlük 06:00 | Log rotation | 10MB üstü log dosyalarını kırp |
Yardımcı Script'ler
| Script | Açıklama |
|---|---|
setup-ssl.sh | Let's Encrypt SSL kurulumu (certbot + cron) |
generate-emqx-certs.sh | Self-signed sertifika (development) |
generate_firmware_signing_key.py | ECDSA P-256 firmware imzalama anahtarı |
quick-backend-deploy.sh | Rebuild olmadan hızlı backend deploy |
init_minio.py | MinIO bucket init (zeus-firmwares, versioning, 90 gün lifecycle) |
cleanup-docker.sh | Docker disk temizliği |
Telegram Alert
.env dosyasına TELEGRAM_BOT_TOKEN ve TELEGRAM_CHAT_ID ekleyerek alert'leri otomatik alabilirsiniz.
Host-level İzleme Script'leri (Issue #261)
scripts/monitoring/checks/ altında, host seviyesinde derinlemesine kaynak ve veritabanı izleme yapan 4 yardımcı script bulunur. Bu script'ler Linux PSI, OOM event'leri, PostgreSQL temp file kullanımı ve TimescaleDB hypertable chunk büyümesini takip eder. Her biri tek başına cron ile periyodik olarak çalıştırılabilir; çıktısı log dosyasına yazılır ve eşik aşıldığında Telegram alert tetiklenir.
| Script | Amaç | Kaynak | Önerilen Cron |
|---|---|---|---|
temp-files-check.sh | PostgreSQL temp file kullanımı | pg_stat_database (temp_files, temp_bytes) | Her 30 dk |
chunk-count-snapshot.sh | TimescaleDB hypertable chunk sayımı | timescaledb_information.chunks | Günlük 02:00 |
host-psi-monitor.sh | Linux memory pressure (PSI) | /proc/pressure/memory | Her 5 dk |
oom-killer-monitor.sh | OOM killer event sayımı | dmesg | grep -i oom | Her 15 dk |
Script Davranışları
temp-files-check.sh—device_measurements,daily_energy_summariesgibi büyük tablolarda spill-to-disk olup olmadığını izler. Ardışık iki snapshot arasındaki delta'yı raporlar. Yüksek temp file artışıwork_memayarının yetersiz olduğuna işaret eder.chunk-count-snapshot.sh— Kritik hypertable'ların chunk sayısını günlük olarak kaydeder:ocpp_meter_samples,device_measurements,daily_energy_summaries. Beklenmedik chunk patlamasında compression veya retention policy gözden geçirilir.host-psi-monitor.sh—some avg10vefull avg10değerlerini okur.some > 10%veyafull > 5%durumunda warning,full > 15%durumunda critical alert gönderir. Container OOM kill öncesi erken uyarı sağlar.oom-killer-monitor.sh— Son 15 dakika içindeOut of memory: Killed processevent'lerini sayar.>0her durumda critical alert.
Cron Örneği
*/5 * * * * /opt/zeus/scripts/monitoring/checks/host-psi-monitor.sh
*/15 * * * * /opt/zeus/scripts/monitoring/checks/oom-killer-monitor.sh
*/30 * * * * /opt/zeus/scripts/monitoring/checks/temp-files-check.sh
0 2 * * * /opt/zeus/scripts/monitoring/checks/chunk-count-snapshot.sh
SQLAlchemy Pool Prometheus Metrikleri (Issue #261)
backend/app/core/observability/db_pool_metrics.py modülü, asyncpg connection pool durumunu Prometheus'a periyodik olarak yansıtır. Connection exhaustion ve dead connection senaryolarını proaktif yakalamak için kritik metrik setidir.
| Metrik | Tip | Açıklama |
|---|---|---|
zeus_db_pool_size | Gauge | Pool boyutu (yapılandırılmış kapasite) |
zeus_db_pool_checked_out | Gauge | Aktif kullanımdaki bağlantı sayısı |
zeus_db_pool_overflow | Gauge | Pool kapasitesini aşan ek bağlantı sayısı |
zeus_db_pool_utilization | Gauge | checked_out / size (0.0–1.0 arası, hesaplanmış) |
Önerilen Alarm Eşikleri
| Metrik | Warning | Critical | Aksiyon |
|---|---|---|---|
zeus_db_pool_utilization | > 0.8 | > 0.9 | Backend worker sayısı veya pool size yeniden değerlendirilmeli |
zeus_db_pool_overflow | > 0 | > 5 | max_overflow yetersiz, kalıcı yük artışı işareti |
zeus_db_pool_checked_out (sabit) | 5 dk sabit | 15 dk sabit | Connection leak şüphesi (commit/close eksik) |
Bu metrikler Prometheus scrape config'inde backend job altında otomatik toplanır; ek scrape tanımı gerekmez.
Backend (FastAPI)
- Endpoint:
/metrics - Kütüphane:
prometheus_clientASGI app olarak mount edilmiştir - Toplanan metrikler:
- HTTP istek sayısı ve süresi — endpoint, method ve status code bazında
- Aktif bağlantı sayısı — eşzamanlı istek takibi
- Python GC istatistikleri — garbage collection döngü sayıları ve süreleri
- İşlem bilgileri — CPU kullanımı, bellek (RSS/VMS), açık dosya tanımlayıcı sayısı
Modbus Poller
- Endpoint:
http://localhost:8085/metrics - Port: 8085
- Toplanan metrikler:
- Polling döngü sayısı ve süresi — cihaz ve grup bazında
- Modbus hata sayısı — timeout, CRC hatası, slave hatası ayrımı
- MQTT publish sayısı ve süresi — başarılı/başarısız ayrımı
- Kuyruk doluluk oranı — TelemetryQueue backpressure izleme
Scrape Yapılandırması (Prometheus)
# prometheus.yml
scrape_configs:
- job_name: 'zeus-backend'
metrics_path: /metrics
static_configs:
- targets: ['backend:8000']
- job_name: 'zeus-modbus-poller'
metrics_path: /metrics
static_configs:
- targets: ['modbus-poller:8085']
Alert Eşik Değerleri Önerisi
Aşağıdaki tabloda altyapı ve uygulama metrikleri için önerilen warning ve critical eşik değerleri yer almaktadır. Bu değerler Telegram alert sistemi veya Prometheus Alertmanager ile entegre edilebilir.
| Metrik | Warning | Critical | Açıklama |
|---|---|---|---|
| RAM kullanımı | >%80 | >%95 | Sistem bellek doluluk oranı |
| Disk kullanımı | >%80 | >%95 | Kök ve veri bölümü disk doluluk oranı |
| API yanıt süresi (p95) | >2s | >10s | Backend endpoint yanıt süresi |
| MQTT queue boyutu | >1000 mesaj | >5000 mesaj | EMQX broker mesaj kuyruğu |
| Celery queue bekleme | >50 task | >200 task | Redis'teki bekleyen Celery görevleri |
| TimescaleDB chunk boyutu | >5GB | >10GB | Tek bir hypertable chunk'ının disk boyutu |
| Container restart sayısı | >2/saat | >5/saat | Docker container beklenmeyen yeniden başlatma |
| PostgreSQL bağlantı havuzu | >%80 dolu | >%95 dolu | asyncpg connection pool doluluk oranı |
| MQTT client disconnect oranı | >%10/dk | >%30/dk | Gateway bağlantı kopma oranı |
Alert Konfigürasyon Örneği
# health-check.sh içinde Telegram alert tetikleme
RAM_USAGE=$(free | awk '/Mem/ {printf "%.0f", $3/$2 * 100}')
if [ "$RAM_USAGE" -gt 95 ]; then
send_telegram "CRITICAL: RAM kullanımı %${RAM_USAGE}"
elif [ "$RAM_USAGE" -gt 80 ]; then
send_telegram "WARNING: RAM kullanımı %${RAM_USAGE}"
fi
OCPP Charger Fleet Observability (Faz 7-B)
OCPP 1.6J / 2.0.1 entegrasyonu için ayrı bir Prometheus alert rules grubu ve Grafana dashboard'u hazırlanmıştır.
| Dosya | Açıklama |
|---|---|
prometheus/rules/ocpp.yml | 5 alert kuralı (fleet drop, auth failure spike, command timeout, bootstrap slow, no active sessions). Backend metric kaynağı: backend/app/core/observability/ocpp_metrics.py. |
grafana/dashboards/ocpp-fleet.json | 10 panel: bağlı charger, aktif session, charging profile success rate, heartbeat age p50/p95/p99, komut latency p95 (action breakdown), komut status rate, auth failures by reason, WS event push rate, top 10 slowest commands. |
grafana/provisioning/dashboards/ocpp.yml | Grafana file-based provisioner config (folder: OCPP). |
Detay tasarım dokümantasyonu: docs-site/docs/device-integrations/ocpp/faz7-production-deployment.md (Bölüm 4).
Not: Fleet offline ratio alarmı şu anda absolute connection drop tabanlıdır. Backend tarafında zeus_ocpp_chargers_total envanter metric'i eklendiğinde OcppFleetOfflineDrop kuralı oran tabanlı (active / total < 0.7) ifadeye güncellenmelidir.
Prometheus Scrape (OCPP)
OCPP metric'leri backend /metrics endpoint'inde yayınlanır — ayrı scrape job'a gerek yoktur, mevcut zeus-backend job'u tüm ocpp_* metric'lerini toplar.
Alert Doğrulama
# Lokal promtool ile syntax kontrol
docker run --rm \
-v $(pwd)/prometheus/rules:/rules \
prom/prometheus:latest \
promtool check rules /rules/ocpp.yml