Prometheus Windows Exporter ile Windows Sunuculardan Metrik Toplama
Windows sunucularını izlemek, Linux tarafına kıyasla her zaman biraz daha “zahmetli” hissettirmiştir bana. WMI sorguları, PowerShell scriptleri, Event Log karmaşası… Ama Prometheus ekosistemi bu işi ciddi ölçüde kolaylaştırdı. Windows Exporter’ı ilk kurduğumda “bu kadar basit olamaz” diye düşünmüştüm, yanılmışım – gerçekten bu kadar basit. Tabi bazı incelikleri bilmek şartıyla.
Windows Exporter Nedir ve Neden Kullanmalısınız?
Windows Exporter (eski adıyla WMI Exporter), Prometheus’un Windows sistemlerinden metrik toplaması için tasarlanmış bir agent’tır. HTTP endpoint üzerinden Prometheus formatında metrikler sunar ve Prometheus server bu endpoint’i scrape ederek verileri toplar.
Peki neden bu araç? Şöyle düşünün: Bir altyapıda 40-50 Windows sunucunuz var. Her birinde farklı monitoring agent’ları kurmak, lisans ödemek, farklı dashboard’lar yönetmek yerine tek bir ekosistem içinde kalabilirsiniz. Zaten Linux sunucularınız için Prometheus kullanıyorsanız, Windows tarafını da buraya dahil etmek operasyonel yükü ciddi ölçüde azaltıyor.
Windows Exporter şu metrikleri toplayabilir:
- CPU kullanımı: Çekirdek bazında, process bazında detay
- Bellek: RAM kullanımı, page file, cache
- Disk I/O: Read/write hızları, queue length, latency
- Network: Interface bazında trafik, hata sayaçları
- IIS: Request sayıları, connection pool durumu
- Windows Services: Servis durumları
- Event Log: Kritik olaylar
- MSSQL: SQL Server metrikleri
- Active Directory: Domain controller metrikleri
Kurulum: Hızlı Başlangıç
En pratik kurulum yöntemi MSI paketi üzerinden yapılıyor. GitHub releases sayfasından son versiyonu indirip command line üzerinden kurabilirsiniz.
# PowerShell ile MSI indirme ve sessiz kurulum
$version = "0.27.2"
$url = "https://github.com/prometheus-community/windows_exporter/releases/download/v$version/windows_exporter-$version-amd64.msi"
Invoke-WebRequest -Uri $url -OutFile "windows_exporter.msi"
msiexec /i windows_exporter.msi /quiet /l*v install.log
Kurulum tamamlandıktan sonra Windows Exporter otomatik olarak bir Windows servisi olarak başlatılır ve varsayılan olarak 9182 portunda dinlemeye başlar. Tarayıcıdan http://localhost:9182/metrics adresine gittiğinizde Prometheus formatında binlerce satır metrik göreceksiniz.
Servis durumunu kontrol etmek için:
# Servis durumu kontrolü
Get-Service -Name windows_exporter
# Servisin otomatik başlamasını doğrulama
Get-Service -Name windows_exporter | Select-Object Name, Status, StartType
Collector Seçimi: Her Şeyi Toplama
Varsayılan kurulumda Windows Exporter temel collector’ları etkinleştirir, ama dikkatli olun: Bazı collector’lar (özellikle process ve mssql) çok fazla metrik üretir ve bu Prometheus tarafında ciddi bir yük oluşturabilir.
Üretim ortamında kurulum yaparken hangi collector’ların aktif olacağını belirtmek iyi bir pratiktir:
# Sadece belirli collector'ları etkinleştirerek kurulum
msiexec /i windows_exporter.msi /quiet `
ENABLED_COLLECTORS="cpu,cs,logical_disk,memory,net,os,service,system,tcp"
Ya da kurulum sonrası servis parametrelerini değiştirmek isterseniz:
# Mevcut servisi collector listesiyle yeniden yapılandırma
$params = "--collectors.enabled=cpu,cs,logical_disk,memory,net,os,service,system,tcp"
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServiceswindows_exporter" `
-Name "ImagePath" `
-Value "C:Program Fileswindows_exporterwindows_exporter.exe $params"
Restart-Service windows_exporter
Sık kullandığım collector kombinasyonu:
- cpu: İşlemci kullanım istatistikleri
- cs: Sistem bilgileri (hostname, OS versiyonu)
- logical_disk: Disk kullanımı ve I/O
- memory: RAM ve sayfalama istatistikleri
- net: Network arayüzü istatistikleri
- os: İşletim sistemi metrikleri
- service: Windows servis durumları
- system: Uptime, thread sayısı
- tcp: TCP bağlantı durumları
Firewall Kuralı Ekleme
Ağ üzerindeki Prometheus sunucusunun bu endpoint’e erişebilmesi için firewall kuralı gerekiyor:
# Windows Firewall'a kural ekleme
New-NetFirewallRule `
-DisplayName "Prometheus Windows Exporter" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 9182 `
-Action Allow `
-Profile Domain,Private
# Kuralı doğrulama
Get-NetFirewallRule -DisplayName "Prometheus Windows Exporter"
Güvenlik açısından önemli bir not: Bu portu internete açmayın. Sadece Prometheus sunucunuzun IP adresinden gelen trafiğe izin verecek şekilde kısıtlayın. Kaynak IP filtrelemesini -RemoteAddress parametresiyle yapabilirsiniz.
Prometheus Tarafında Yapılandırma
Windows Exporter’ı kurduktan sonra Prometheus’un bu hedefi scrape etmesini sağlamanız gerekiyor. prometheus.yml dosyasına aşağıdaki gibi bir job eklemeniz yeterli:
# prometheus.yml
scrape_configs:
- job_name: 'windows_servers'
scrape_interval: 30s
scrape_timeout: 20s
static_configs:
- targets:
- 'winserver01.example.com:9182'
- 'winserver02.example.com:9182'
- 'winserver03.example.com:9182'
labels:
environment: 'production'
os: 'windows'
# Uzun süren collector'lar için timeout'u artırın
metric_relabel_configs:
- source_labels: [__name__]
regex: 'windows_process_.*'
action: drop # Process metriklerini Prometheus'a almıyorsak düşür
Büyük ortamlarda statik konfigürasyon yerine file-based service discovery kullanmak daha yönetilebilir:
# prometheus.yml - file_sd_configs kullanımı
scrape_configs:
- job_name: 'windows_servers'
scrape_interval: 30s
file_sd_configs:
- files:
- '/etc/prometheus/targets/windows_*.yml'
refresh_interval: 5m
# /etc/prometheus/targets/windows_production.yml
- targets:
- 'winserver01.example.com:9182'
- 'winserver02.example.com:9182'
labels:
environment: production
datacenter: istanbul
team: infrastructure
Gerçek Dünya Senaryosu: IIS Monitoring
Yönettiğim bir e-ticaret altyapısında birden fazla IIS sunucusu vardı ve her birinin performansını merkezi olarak görmek istiyorduk. IIS collector’ı devreye aldığımızda şu metrikleri elde ettik:
# IIS collector'ını etkinleştirerek yeniden başlatma
$params = "--collectors.enabled=cpu,logical_disk,memory,net,os,service,iis"
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServiceswindows_exporter" `
-Name "ImagePath" `
-Value "C:Program Fileswindows_exporterwindows_exporter.exe $params"
Restart-Service windows_exporter
# Metriklerin geldiğini doğrulama
Invoke-WebRequest -Uri "http://localhost:9182/metrics" |
Select-String "windows_iis_"
IIS collector’dan gelen temel metrikler:
- windows_iis_requests_total: Toplam istek sayısı (method bazında)
- windows_iis_current_connections: Anlık bağlantı sayısı
- windows_iis_received_bytes_total: Alınan veri miktarı
- windows_iis_sent_bytes_total: Gönderilen veri miktarı
- windows_iis_connection_errors_total: Bağlantı hataları
Bu metrikler üzerinden Grafana’da oluşturduğumuz dashboard ile hangi site’ın ne kadar trafik aldığını, error rate’ini ve response time dağılımını görebildik. Önceki durumda bu bilgilere ulaşmak için IIS loglarını parse etmek gerekiyordu, şimdi anlık görüyoruz.
Alerting: Kritik Metriklere Alarm Kurma
Metrik toplamak güzel, ama asıl değer alerting’de ortaya çıkıyor. İşte production’da kullandığım temel alarm kuralları:
# windows_alerts.yml
groups:
- name: windows_server_alerts
rules:
# CPU kullanımı 5 dakika boyunca %90 üzerinde
- alert: WindowsHighCPU
expr: |
100 - (avg by (instance) (rate(windows_cpu_time_total{mode="idle"}[5m])) * 100) > 90
for: 5m
labels:
severity: warning
annotations:
summary: "Yüksek CPU kullanımı: {{ $labels.instance }}"
description: "CPU kullanımı %{{ $value | humanize }} seviyesinde"
# Disk doluluk oranı %85 üzeri
- alert: WindowsDiskSpaceLow
expr: |
(1 - (windows_logical_disk_free_bytes / windows_logical_disk_size_bytes)) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "Disk dolmak üzere: {{ $labels.instance }} - {{ $labels.volume }}"
description: "{{ $labels.volume }} diski %{{ $value | humanize }} dolu"
# Kullanılabilir RAM %10'un altında
- alert: WindowsLowMemory
expr: |
(windows_os_physical_memory_free_bytes / windows_cs_physical_memory_bytes) * 100 < 10
for: 5m
labels:
severity: critical
annotations:
summary: "Kritik: Bellek yetersiz - {{ $labels.instance }}"
description: "Kullanılabilir RAM %{{ $value | humanize }}"
# Windows servisi çalışmıyor
- alert: WindowsServiceDown
expr: |
windows_service_status{status="running"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Servis durdu: {{ $labels.name }} - {{ $labels.instance }}"
Servis izleme özellikle kritik: IIS, SQL Server Agent, veya özel uygulama servislerinizden biri durduğunda anında haber almak, sorunları kullanıcı şikayeti gelmeden çözmenizi sağlıyor. Bu kuralı devreye aldıktan sonra bir SQL Server Agent’ın sessiz sedasız durduğunu ve iki saatlik bir veri akışı sorununu bu sayede erken fark ettiğimizi hatırlıyorum.
Büyük Ortamlar için Toplu Kurulum
50 sunucuda tek tek kurulum yapmak çılgınlık olur. Ansible veya PowerShell Remoting ile toplu kurulum yapabilirsiniz:
# PowerShell Remoting ile toplu kurulum
$sunucular = @(
"winserver01",
"winserver02",
"winserver03",
"winserver04"
)
$scriptBlock = {
param($version)
$url = "https://github.com/prometheus-community/windows_exporter/releases/download/v$version/windows_exporter-$version-amd64.msi"
$dest = "C:Tempwindows_exporter.msi"
# Klasörü oluştur
New-Item -ItemType Directory -Force -Path "C:Temp" | Out-Null
# İndir
Invoke-WebRequest -Uri $url -OutFile $dest
# Kur
$collectors = "cpu,cs,logical_disk,memory,net,os,service,system,tcp"
Start-Process msiexec -ArgumentList "/i $dest /quiet ENABLED_COLLECTORS=$collectors" -Wait
# Firewall kuralı
New-NetFirewallRule -DisplayName "Prometheus Windows Exporter" `
-Direction Inbound -Protocol TCP -LocalPort 9182 -Action Allow `
-Profile Domain -ErrorAction SilentlyContinue
Write-Output "Kurulum tamamlandi: $env:COMPUTERNAME"
}
foreach ($sunucu in $sunucular) {
Invoke-Command -ComputerName $sunucu -ScriptBlock $scriptBlock -ArgumentList "0.27.2"
}
Kurulum sonrası doğrulama da otomatik yapılabilir:
# Toplu sağlık kontrolü
$sunucular = @("winserver01", "winserver02", "winserver03")
foreach ($sunucu in $sunucular) {
try {
$response = Invoke-WebRequest -Uri "http://${sunucu}:9182/health" -TimeoutSec 5
if ($response.StatusCode -eq 200) {
Write-Host "OK: $sunucu" -ForegroundColor Green
}
} catch {
Write-Host "HATA: $sunucu - $($_.Exception.Message)" -ForegroundColor Red
}
}
Grafana Dashboard Hazırlama
Metrikleri topladıktan sonra görselleştirme için Grafana kullanıyorsanız, Grafana Labs’ın dashboard kütüphanesinde Windows Exporter için hazır dashboard’lar mevcut. Dashboard ID 10467 veya 14694 numaralı olanları import ederek hemen başlayabilirsiniz.
Özelleştirmek istediğinizde PromQL sorgularını bilmek gerekiyor. Sık kullandığım sorgular:
# CPU kullanım yüzdesi (instance bazında)
100 - (avg by (instance) (rate(windows_cpu_time_total{job="windows_servers",mode="idle"}[2m])) * 100)
# Disk I/O - okuma hızı (MB/s)
rate(windows_logical_disk_read_bytes_total{volume!="HarddiskVolume1"}[2m]) / 1024 / 1024
# Network trafik - gelen (Mbps)
rate(windows_net_bytes_received_total{nic!~".*isatap.*|.*Loopback.*"}[2m]) * 8 / 1024 / 1024
# En çok CPU tüketen top 10 process
topk(10, sum by (process) (rate(windows_process_cpu_time_total{job="windows_servers"}[5m])))
Sorun Giderme
Kurulum sonrası en sık karşılaştığım sorunlar ve çözümleri:
Metrikler gelmiyor: İlk kontrol noktası servis durumu. Get-Service windows_exporter çalışıyor mu? Değilse Event Viewer’da uygulama loglarına bakın.
Bazı metrikler eksik: Collector etkin değil olabilir. http://localhost:9182/ adresine gidin, hangi collector’ların aktif olduğunu görebilirsiniz.
Scrape timeout hatası: Bazı ortamlarda process collector’ı çok yavaş çalışıyor. Bu collector’ı devre dışı bırakın veya scrape_timeout değerini artırın.
WMI hataları: Nadiren WMI repository bozulabiliyor. Bu durumda:
# WMI repository onarımı
winmgmt /salvagerepository
winmgmt /resetrepository
# Ardından servisi yeniden başlatın
Restart-Service windows_exporter
Yüksek bellek kullanımı: Windows Exporter normalde minimal kaynak kullanır. Eğer bellek tüketimi artıyorsa, aktif collector sayısını azaltın ve scrape_interval değerini düşürün (30s yerine 60s gibi).
Güvenlik Konuları
Production ortamında göz ardı etmediğim birkaç güvenlik önlemi:
Endpoint’i TLS ile şifrelemek mümkün. Windows Exporter --web.config.file parametresiyle bir web config dosyasını kabul ediyor:
# web-config.yml
tls_server_config:
cert_file: C:certsexporter.crt
key_file: C:certsexporter.key
basic_auth_users:
prometheus: $2y$10$hashedpassword
# TLS ile başlatma
$params = "--collectors.enabled=cpu,memory,logical_disk,net,os,service --web.config.file=C:prometheusweb-config.yml"
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServiceswindows_exporter" `
-Name "ImagePath" `
-Value "C:Program Fileswindows_exporterwindows_exporter.exe $params"
Bunun yanında Windows Exporter servisini ayrı, düşük yetkili bir servis hesabıyla çalıştırmanızı öneririm. Bazı collector’lar (özellikle MSSQL ve AD) için bu hesabın ek izinlere ihtiyacı olabilir, ancak varsayılan collector’lar için local service hesabı yeterli.
Sonuç
Windows Exporter, dağınık Windows altyapısını merkezi Prometheus/Grafana ekosistemine dahil etmenin en temiz yolu. Kurulumu basit, yapılandırması esnek ve topluluk desteği güçlü. En kritik avantajı ise hem Linux hem Windows sunucularınızı tek bir monitoring stack’te yönetebilmeniz.
Başlangıç için öneri: Önce birkaç collector ile küçük başlayın, sistemin davranışını gözlemleyin, sonra ihtiyaca göre genişletin. Her şeyi aynı anda açmak, gereksiz metrik yükü oluşturur ve Prometheus storage’ınızı gereksiz şişirir.
Alert kurallarını kurmayı erteleyin demeyin. “Şimdi toplarım, alarm kurarım” diyerek bırakılan kurulumlar, kritik bir olay yaşanana kadar değerini kanıtlayamıyor ve zamanla unutuluyor. Kurulumla birlikte en az disk, CPU ve servis alarmaları mutlaka devreye alınmalı.
Son olarak, Windows Exporter sürümlerini düzenli takip edin. Özellikle Windows Server 2022 ve sonrası için performans iyileştirmeleri düzenli gliyor, eski versiyonlarda bazı collector’larda WMI kaynaklı performans sorunları yaşanabiliyor.
