Prometheus ile Metrik Toplamak
Prometheus
Prometheus açık kaynak bir izleme çözümü. Bir CNCF projesi (Kubernetes ile aynı vakıf altında) ve eksiksiz bir izleme bileşenleri takımı barındırıyor.
Kaynaklar
- Prometheus dökümantasyonu
- İndirme ve kurulum ayrıntıları
- Yapılandırma ve servis keşfi
- Prometheus HTTP API dökümantasyonu
Prometheus'u çalıştırmak
Prometheus'u bir Docker container'ında çalıştıracağız:
- prometheus.yml — container kurulumu, 9090 portunu
yayınlıyor
- config/prometheus.yml — Prometheus yapılandırma
dosyası
Container'ı başlatın:
docker compose -f labs/prometheus/prometheus.yml up -dPrometheus arayüzünü http://localhost:9090 adresinde açın
Varsayılan sayfa metrik sorgulamanıza imkân veriyor — biraz sonra bunu yapacağız. Önce birkaç başka sayfaya bakın:
- http://localhost:9090/config (Status...Configuration menüsünden) —
Prometheus'un kullandığı yapılandırmayı gösteriyor
- http://localhost:9090/targets (Status...Targets menüsünden) — veri
toplama (scrape) hedeflerinin durumunu gösteriyor
İzlemek istediğimiz hedeflerin hiçbiri çalışmıyor ama Prometheus onları bulmaya çalışmaya devam edecek.
Şu Docker Compose dosyası (apps.yml) metrik yayınlayan birkaç örnek uygulama başlatıyor. Container'lar Prometheus ile aynı Docker ağına bağlanacak ve Prometheus'un bulmayı beklediği DNS adlarını kullanacaklar.
Uygulamaları çalıştırın:
docker compose -f labs/prometheus/apps.yml up -dhttp://localhost:9090/targets durum sayfasını yenileyin, hedeflerin devreye girdiğini göreceksiniz
Prometheus arayüzündeki Query sayfasını açın (http://localhost:9090 adresindeki varsayılan sayfa). İfade kutusunun yanındaki metrik seçici toplanan tüm metrikleri listeliyor.
Bu lab'ın eski sürümü
/classic/graphadresine bağlanıyordu. Prometheus 3 arayüzü değiştirdi ve klasik arayüz artık açılışta--enable-feature=old-uigerektiriyor; dolayısıyla o adres 404 veriyor.
En basit sorgu için yalnızca metrik adı yeterli.
📋 process_cpu_seconds_total ve app_info sorgularını çalıştırdığınızda ne
görüyorsunuz?
Biraz yardım lazım mı?
Sorgu ifadesine process_cpu_seconds_total yazıp Execute tıklayın.
Çıktıda iki metrik değeri göreceksiniz:
Table sekmesi her seri için bir satır gösterir: metrik adı, etiketleri ve güncel değer.
Bu, node exporter'ın ve döküman işleyicinin ne kadar CPU zamanı kullandığını söylüyor.
app_info sorgulayın; şuna benzer bir çıktı göreceksiniz (sürüm numaraları
sizde farklı olacak, bu imajlar zaman içinde yeniden derleniyor):
| Element | Value |
|---|---|
app_info{app_version="1.3.1",assembly_name="Fulfilment.Processor",dotnet_version="3.1.16",instance="fulfilment-processor:9110",job="fulfilment-processor"} | 1 |
app_info{instance="fulfilment-api",java_version="11-jre",job="fulfilment-api",version="0.3.0"} | 1 |
Bunlar bilgilendirme amaçlı metrikler; döküman işleyici ve REST API için uygulama ve çalışma ortamı sürüm numaralarını gösteriyorlar.
Prometheus bir hedeften veri toplarken her metriğe iki etiket ekliyor:
job— yapılandırılmış job'ın adı, genellikle tek bir bileşeni belirtmekiçin kullanılır, örneğin döküman işleyici
instance— hedefin belirli örneği, genellikle bir sunucu veya bircontainer; örneğin
fulfilment-processor:9110işleyici hedefinin DNS adı ve portu
Prometheus her metrik için bir zaman damgası da kaydediyor; yani her veri parçası için nereden geldiğini ve ne zaman toplandığını biliyorsunuz.
Zaman serisi verisi
Table sekmesi yalnızca en güncel metrik değerini gösteriyor. Prometheus şu anda her hedeften 30 saniyede bir veri toplayıp tüm metrikleri zaman serisi veritabanına kaydediyor.
Bu veriyi keşfetmek için Graph sayfasını kullanabilirsiniz.
📋 fulfilment_requests_total metriğini sorgulayın, sonra sorguyu yalnızca
processed etiketinin değerini gösterecek şekilde değiştirin.
Biraz yardım lazım mı?
fulfilment_requests_total için bir sorgu çalıştırın; şuna benzer bir çıktı
göreceksiniz:
| Element | Value |
|---|---|
fulfilment_requests_total{instance="fulfilment-processor:9110",job="fulfilment-processor",status="failed"} | 777 |
fulfilment_requests_total{instance="fulfilment-processor:9110",job="fulfilment-processor",status="processed"} | 17701 |
Etiketler süslü parantez içinde gösterilen anahtar-değer çiftleridir ve aynı sözdizimini sorguda da kullanarak etiketle eşleşen metrikleri gösterebilirsiniz.
fulfilment_requests_total{status="processed"} sorgusu yalnızca işlenmiş
sayısını gösteriyor.
Prometheus bu sonuca instant vector (anlık vektör) diyor; çünkü yalnızca tek bir an için veriyi gösteriyor — toplanan en güncel değeri.
Graph sekmesine geçin; sonuçları bir zaman aralığı boyunca, zaman aralığını seçebileceğiniz bir grafikte göreceksiniz:
Graph sekmesi her seri için bir çizgi çizer. Bir counter (sayaç) ile çizgi yalnızca yükselir —
rate()fonksiyonunu faydalı kılan şey de budur.
Bu metrik bir counter, dolayısıyla grafik sürekli artıyor.
📋 fulfilment_in_flight_total metriği için bir grafik, bir de (etiket
seçicisi olmadan) fulfilment_requests_total metriği için bir grafik
oluşturun. Nasıl karşılaştırılıyorlar?
Biraz yardım lazım mı?
fulfilment_in_flight_total bir gauge metriği, dolayısıyla grafik yukarı ve
aşağı giden değerler gösterecek:
Gauge yukarı ve aşağı gider, bu yüzden grafiği merdiven değil testere dişi gibi görünür.
fulfilment_requests_total farklı status etiketleri için birden fazla
metrik içeriyor; Prometheus her metrik için bir çizgi çiziyor:
Her etiket kombinasyonu kendi çizgisi olur ve grafiğin altındaki açıklama onları isimlendirir.
Prometheus arayüzü veriyi keşfetmek ve basit sorgular kurmak için iyi, ama onunla tam bir dashboard oluşturamazsınız. Onun için Prometheus HTTP API'sine sorgu gönderen Grafana'yı kullanacaksınız.
## Sorgu API'si
Genellikle sorgu API'siyle doğrudan çalışmazsınız, ama sorgu sonuçlarının ham verisini görmek için iyi bir kaynak.
curl ile çağırabileceğiniz basit bir HTTP API'si.
_Windows kullanıyorsanız doğru curl komutunu kullanmak için şu script'i çalıştırın:_
# once script'lere izin verin:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
# sonra calistirin:
. ./scripts/windows-tools.ps1İşlemde olan döküman metriği için bir sorgu yapın:
curl 'localhost:9090/api/v1/query?query=fulfilment_in_flight_total'JSON biçiminde, şuna benzer bir çıktı göreceksiniz (ama bu kadar düzgün biçimlendirilmemiş):
{
"status": "success",
"data": {
"resultType": "vector",
"result": [
{
"metric": {
"__name__": "fulfilment_in_flight_total",
"instance": "fulfilment-processor:9110",
"job": "fulfilment-processor"
},
"value": [
1626510033.385,
"71"
]
}
]
}
}Bu bir anlık vektör. Gerçek değer bir metin olarak dönüyor — bu örnekte 71 —
ve değerin kaydedildiği zaman damgasını da içeriyor (Linux epoch olarak;
1626510033.385, 17 Temmuz 2021 Cumartesi 08:20:33.385).
📋 API'yi kullanarak up metriğini sorgulayın. Yanıt size ne söylüyor?
Biraz yardım lazım mı?
Sorgu yalnızca metrik adını kullanabilir:
curl 'localhost:9090/api/v1/query?query=up'Şuna benzer bir yanıt alacaksınız; sonuçta birden fazla metrik var — her veri toplama hedefi için bir tane:
{
"status": "success",
"data": {
"resultType": "vector",
"result": [
{
"metric": {
"__name__": "up",
"instance": "fulfilment-api",
"job": "fulfilment-api"
},
"value": [
1626510366.389,
"1"
]
},
{
"metric": {
"__name__": "up",
"instance": "fulfilment-processor:9110",
"job": "fulfilment-processor"
},
"value": [
1626510366.389,
"1"
]
},
{
"metric": {
"__name__": "up",
"instance": "node-exporter:9100",
"job": "node-exporter"
},
"value": [
1626510366.389,
"1"
]
}
]
}
}up metriği bir gauge. Prometheus metrikleri herhangi bir ondalık değer
olabilir ama bu metrik yalnızca ikisini kullanıyor: 1 hedefin ayakta
olduğunu ve veri toplandığını, 0 ise hedefin kapalı olduğunu ve veri
toplanamadığını gösteriyor.
API yanıtı her metrik için zaman damgasını, instance ve job etiketleriyle
birlikte gösteriyor. Metrik adı da aslında bir etiket olarak saklanıyor:
__name__.
Lab
Bazen güncel metrik değerini görmek istersiniz, ama genellikle zaman içinde değişen değerleri görmek isteriz.
API'yi kullanarak fulfilment_in_flight_total metriğinin son bir saatlik
değerlerini sorgulayın.
Takıldınız mı? İpuçlarına bakın veya çözümü inceleyin.
Temizlik
Bu lab'ın container'larını kaldırın:
docker compose -f labs/prometheus/prometheus.yml down
docker compose -f labs/prometheus/apps.yml downBu komut yalnızca bu lab'in baslattigi container'lari kaldırır. Tamamen temiz bir başlangıç istiyorsanız
docker psile hâlâ çalışan varsa görebilirsiniz.