๐Examining the data of our Python application
Yukarฤฑdaki uygulama, Prometheus metriklerini kullanarak bir HTTP sunucusu baลlatan basit bir uygulamadฤฑr. Uygulamanฤฑn detaylarฤฑna inecek olursak;
ฤฐlk olarak, gerekli modรผller ve kรผtรผphaneler iรงe aktarฤฑlฤฑr:
http.server
: Bu modรผl, temel bir HTTP sunucusu oluลturmak iรงin kullanฤฑlฤฑr.prometheus_client
: Prometheus metriklerini yayฤฑnlamak iรงin kullanฤฑlan bir kรผtรผphanedir.
Ardฤฑndan, uygulama ve metrikler iรงin iki farklฤฑ port numarasฤฑ belirlenir:
APP_PORT
: Uygulamanฤฑn dinleyeceฤi port numarasฤฑ (8000).METRICS_PORT
: Prometheus metriklerinin yayฤฑnlanacaฤฤฑ port numarasฤฑ (8001).
HandleRequests
adฤฑnda bir sฤฑnฤฑf tanฤฑmlanฤฑr. Bu sฤฑnฤฑf,http.server.BaseHTTPRequestHandler
sฤฑnฤฑfฤฑndan tรผretilmiลtir ve gelen HTTP isteklerini iลlemek iรงin kullanฤฑlฤฑr. ลu anda sadeceGET
isteklerini ele alacak ลekilde tanฤฑmlanmฤฑลtฤฑr.do_GET
metodunda, sunucu, baลarฤฑlฤฑ bir yanฤฑt olarak200
durum kodunu gรถnderir. Daha sonra yanฤฑtฤฑn iรงeriฤine HTML metni ekler ve baฤlantฤฑyฤฑ kapatฤฑr. Bu HTML metni, kullanฤฑcฤฑya "Welcome to our first Prometheus-Python application." mesajฤฑnฤฑ gรถsterir.__main__
iรงinde, metrikleri toplamak ve yayฤฑnlamak iรงin Prometheus istemcisini baลlatฤฑrฤฑz:start_http_server(METRICS_PORT)
.Daha sonra, HTTP sunucusunu baลlatฤฑrฤฑz. Sunucunun IP adresi (
10.90.0.144
) ve uygulama portu (APP_PORT
) ilehttp.server.HTTPServer
sฤฑnฤฑfฤฑndan bir nesne oluลtururuz. Bu nesneye, istekleri iลlemek iรงinHandleRequests
sฤฑnฤฑfฤฑnฤฑ saฤlarฤฑz.Son olarak,
server.serve_forever()
ile sunucuyu sรผrekli รงalฤฑลฤฑr durumda tutarฤฑz. Bu sayede sunucu, gelen isteklere sรผrekli olarak yanฤฑt verebilir.
รzetle, bu uygulama, temel bir HTTP sunucusu baลlatฤฑr ve Prometheus istemcisi kullanarak metrikleri toplar ve yayฤฑnlar.
Uygulamamฤฑzฤฑ รงalฤฑลtฤฑrฤฑyoruz.
prometheus_client
paketi, uygulamalarฤฑmฤฑzda Prometheus metriklerini toplamamฤฑzฤฑ ve sunmamฤฑzฤฑ saฤlayan bir kรผtรผphanedir.
.
.
.
Ardฤฑndan python uygulamamฤฑzฤฑ, prometheus arayรผzรผnden metriklerini incelemek ve olasฤฑ problemleri tespit etmek iรงin, Uygulamamฤฑzฤฑn kodunda expose ettiฤimiz metrik portunu prometheus.yml dosyasฤฑna target olarak ekliyoruz.
Ardฤฑndan prometheus servisini yeniden baลlatฤฑp, arayรผzden verinin kontrolรผnรผ saฤlฤฑyoruz.
Counter Metrics
Kodumuza, gelen istekleri inceleyebilmek iรงin, bazฤฑ satฤฑrlarฤฑ ekliyoruz. Bu satฤฑrlarฤฑn aรงฤฑklamalarฤฑ ลu ลekilde,
random
modรผlรผ iรงe aktarฤฑldฤฑ. Bu modรผl, rastgele sayฤฑlar รผretmek iรงin kullanฤฑlฤฑr.Prometheus istemcisinden
Counter
metriฤi iรงe aktarฤฑldฤฑ. Counter, artan bir deฤeri temsil eden bir metrik tรผrรผdรผr.ฤฐki adet Counter metriฤi tanฤฑmlandฤฑ:
REQUEST_COUNT
: Uygulamanฤฑn aldฤฑฤฤฑ HTTP isteklerinin sayฤฑsฤฑnฤฑ takip eder. Bu metrik, 'app_name' ve 'endpoint' etiketleri ile etiketlendi.RANDOM_COUNT
: Rastgele bir deฤerle artฤฑrฤฑlan bir sayaรงtฤฑr.
do_GET
metodunda, iki metrik gรผncellenir:ฤฐlk olarak,
REQUEST_COUNT
metriฤi etiketlerle birlikte artฤฑrฤฑlฤฑr (inc()
fonksiyonu ile). Bu, uygulamanฤฑn adฤฑ ve istek yolu ile etiketlenmiล her HTTP isteฤi iรงin sayaรง deฤerini bir artฤฑrฤฑr.Daha sonra,
random.random()
fonksiyonu kullanฤฑlarak 0 ile 1 arasฤฑnda rastgele bir sayฤฑ รผretiliyor. Bu sayฤฑyฤฑ 10 ile รงarparak 0 ile 10 arasฤฑnda rastgele bir sayฤฑ elde ediyoruz. Bu deฤerrandom_val
adlฤฑ deฤiลkene atanฤฑyor.Ardฤฑndan,
RANDOM_COUNT.inc(random_val)
satฤฑrฤฑnda,RANDOM_COUNT
adฤฑnda bir Prometheus Counter nesnesi bulunuyor. Counter, artan sayฤฑlarฤฑ tutmak iรงin kullanฤฑlฤฑr ve genellikle bir uygulamada gerรงekleลen belirli olaylarฤฑn sayฤฑsฤฑnฤฑ izlemek iรงin kullanฤฑlฤฑr. Bu รถrnekte,RANDOM_COUNT
adlฤฑ Counter nesnesineinc()
fonksiyonu ilerandom_val
deฤiลkeninde tutulan rastgele deฤeri ekliyoruz. Bu, Counter nesnesinin deฤerinirandom_val
kadar artฤฑrฤฑr.
Yeni eklenen kod parรงalarฤฑ sayesinde, uygulamanฤฑn aldฤฑฤฤฑ HTTP istek sayฤฑsฤฑnฤฑ ve rastgele deฤerlerle artan bir sayacฤฑ takip etmek mรผmkรผn hale gelmiลtir. Bu metrikler, Prometheus tarafฤฑndan toplanarak uygulamanฤฑn performansฤฑ ve iลlem sayฤฑsฤฑ hakkฤฑnda daha fazla bilgi saฤlar.
Uygulamamฤฑza ilgili satฤฑrlarฤฑ ekledikten sonra tekrar start ediyoruz ve prometheus ara yรผzรผnde yeni verileri inceliyoruz.
Bรถylelikle uygulamamฤฑza yapฤฑlan isteklerin miktarฤฑnฤฑ gรถrebiliyoruz.
.
.
.
Gauge Metrics
Gauge metrikleri, bir deฤeri artฤฑrabilen, azaltabilen veya belirli bir deฤere ayarlayabilen metriklerdir. Bu kod parรงasฤฑnda iki Gauge metrik tanฤฑmlanmฤฑลtฤฑr:
REQUEST_INPROGRESS: Bu metrik, ลu anda iลlenmekte olan uygulama isteklerinin sayฤฑsฤฑnฤฑ temsil eder. 'app_requests_inprogress' adฤฑyla ve 'number of application requests in progress' aรงฤฑklamasฤฑyla tanฤฑmlanmฤฑลtฤฑr.
REQUEST_LAST_SERVED: Bu metrik, uygulamanฤฑn en son ne zaman hizmet verdiฤini gรถsterir. 'app_last_served' adฤฑyla ve 'Time the application was last served.' aรงฤฑklamasฤฑyla tanฤฑmlanmฤฑลtฤฑr.
ฤฐlk Gauge metriฤi, REQUEST_INPROGRESS
, do_GET
fonksiyonu iรงin bir dekoratรถr olarak kullanฤฑlฤฑr. Bu sayede, fonksiyonun baลฤฑnda ve sonunda otomatik olarak Gauge deฤeri gรผncellenir. Bu, iลlem sรผresi boyunca kaรง isteฤin olduฤunu takip etmeye yardฤฑmcฤฑ olur.
ฤฐkinci Gauge metriฤi, REQUEST_LAST_SERVED
, do_GET
fonksiyonunun sonunda kullanฤฑlฤฑr. Uygulamanฤฑn en son ne zaman hizmet verdiฤini belirlemek iรงin ลu anki zamanฤฑ bu metriฤe ayarlar.
Bu รถlรงรผmler sayesinde, uygulamanฤฑn performansฤฑnฤฑ ve kullanฤฑmฤฑnฤฑ daha iyi anlayabilir ve gerektiฤinde iyileลtirmeler yapabilirsiniz.
.
.
.
Summary Metrics
Yukarฤฑda summary metriฤini tanฤฑmladฤฑฤฤฑmฤฑz kod bloฤu mevcut. Uygulama kodumuza eklediฤimiz 2 farklฤฑ satฤฑr mevcut. Bu satฤฑrlarฤฑ aรงฤฑklamak gerekirse;
Summary
metriฤi tanฤฑmlama:
Bu satฤฑrda, Summary
tipinde bir metrik nesnesi oluลturuyoruz. Summary
metriฤi, gรถzlem sรผresi boyunca olaylarฤฑn sรผrelerinin veya boyutlarฤฑnฤฑn istatistiksel รถzetini saฤlar. Burada, app_response_latency_seconds
adฤฑnda bir metrik tanฤฑmlฤฑyoruz ve bu metriฤin aรงฤฑklamasฤฑ olarak "Response latency in seconds" kullanฤฑyoruz.
time()
dekoratรถrรผnรผ kullanma:
time()
dekoratรถrรผ, Python'daki dekoratรถrlerle ilgilidir. Dekoratรถrler, fonksiyonlarฤฑn veya sฤฑnฤฑf metotlarฤฑnฤฑn davranฤฑลฤฑnฤฑ deฤiลtirmek veya geniลletmek iรงin kullanฤฑlฤฑr. Bu รถrnekte, time()
dekoratรถrรผ do_GET
metodu รผzerinde kullanฤฑlarak, metot รงalฤฑลtฤฑฤฤฑnda sรผre รถlรงรผmรผ yapฤฑlฤฑr ve sonuรงlar REQUEST_RESPOND_TIME
metriฤine kaydedilir.
Dekoratรถrler, fonksiyonun veya metotun รผzerinde @
iลareti ile belirtilir. Bu sayede, dekoratรถrรผn arkasฤฑndaki fonksiyon veya metot, dekoratรถrรผn saฤladฤฑฤฤฑ ek รถzelliklerle รงalฤฑลฤฑr. Bu durumda, time()
dekoratรถrรผ do_GET
metodunun รงalฤฑลma sรผresini รถlรงer ve bu sรผreyi REQUEST_RESPOND_TIME
metriฤine ekler.
รzetle, REQUEST_RESPOND_TIME = Summary(...)
satฤฑrฤฑyla, sรผre รถlรงรผmlerini tutmak iรงin bir Summary
metriฤi tanฤฑmlฤฑyoruz. @REQUEST_RESPOND_TIME.time()
satฤฑrฤฑyla ise, bu metriฤi kullanarak do_GET
metodunun รงalฤฑลma sรผresini รถlรงรผyoruz. Bu sayede, uygulamanฤฑn yanฤฑt sรผresi hakkฤฑnda istatistiksel รถzetler elde ederiz.
@REQUEST_RESPOND_TIME.time()
kod parรงacฤฑฤฤฑ, asฤฑl olarak sรผre รถlรงรผmรผnรผ yapmak ve bu sรผreyi REQUEST_RESPOND_TIME
metriฤine kaydetmekle ilgilidir. Bu dekoratรถr, kodun รผzerine yerleลtirildiฤi do_GET
metodu รงalฤฑลtฤฑฤฤฑnda, metodu รงalฤฑลtฤฑran iลlemi otomatik olarak รถlรงer ve bu sรผreyi REQUEST_RESPOND_TIME
metriฤine ekler.
Sonuรง olarak, bu dekoratรถr sayesinde uygulamanฤฑn yanฤฑt sรผresi รถlรงรผmleri, Prometheus tarafฤฑndan toplanarak analiz edilebilir ve izlenebilir hale gelir
Kodumuza 6 saniye gecikmesi iรงin "sleep" eklediฤimiz iรงin, ilk isteฤin response sรผresi "6 sn" olarak gรถzรผkรผyor. Fakat bu deฤiลken sรผrekli toplanarak ilerlediฤi iรงin, ortalama response sรผresini incelememiz iรงin bize yardฤฑmcฤฑ olmaz.
Ortalama yanฤฑt sรผresini hesaplamak iรงin,
rate(app_response_latency_seconds_sum[5m])
: Son 5 dakika iรงindekiapp_response_latency_seconds_sum
metriฤinin deฤerinin artฤฑล hฤฑzฤฑnฤฑ hesaplar. Bu, son 5 dakika boyunca toplam sรผrelerin ne kadar hฤฑzla arttฤฑฤฤฑnฤฑ gรถsterir.rate(app_response_latency_seconds_count[5m])
: Son 5 dakika iรงindekiapp_response_latency_seconds_count
metriฤinin deฤerinin artฤฑล hฤฑzฤฑnฤฑ hesaplar. Bu, son 5 dakika boyunca toplam istek sayฤฑsฤฑnฤฑn ne kadar hฤฑzla arttฤฑฤฤฑnฤฑ gรถsterir.Son olarak, bu iki deฤeri bรถleriz.
Bu bรถlme iลlemi, son 5 dakika iรงindeki ortalama yanฤฑt sรผresini verir. Ortalama yanฤฑt sรผresi, toplam sรผrelerin artฤฑล hฤฑzฤฑnฤฑn, istek sayฤฑsฤฑnฤฑn artฤฑล hฤฑzฤฑna oranฤฑ olarak hesaplanฤฑr. Bu sayede, son 5 dakikada gerรงekleลen isteklerin ortalama sรผresini gรถrebilirsiniz.
rate
fonksiyonu ลu ลekilde รงalฤฑลฤฑr:
rate
fonksiyonu, belirtilen zaman aralฤฑฤฤฑ (รถrneฤin, son 5 dakika) boyunca metrik deฤerinin zaman serisindeki veri noktalarฤฑnฤฑ alฤฑr.ฤฐki ardฤฑลฤฑk veri noktasฤฑ arasฤฑndaki farkฤฑ alarak, her bir veri noktasฤฑ arasฤฑndaki deฤiลimi hesaplar.
Bu deฤiลimlerin toplamฤฑnฤฑ alฤฑr ve belirtilen zaman aralฤฑฤฤฑna bรถler (รถrneฤin, 5 dakika). Bu iลlem, zaman aralฤฑฤฤฑ boyunca metrik deฤerindeki ortalama deฤiลimi hesaplar.
รrneฤin, rate(app_response_latency_seconds_count[5m])
sorgusu iรงin:
Son 5 dakikadaki
app_response_latency_seconds_count
metriฤi iรงin veri noktalarฤฑnฤฑ alฤฑr.ฤฐki ardฤฑลฤฑk veri noktasฤฑ arasฤฑndaki farkฤฑ alarak, her bir veri noktasฤฑ arasฤฑndaki deฤiลimi hesaplar.
Bu deฤiลimlerin toplamฤฑnฤฑ alฤฑr ve 5 dakikaya bรถler. Bu iลlem, son 5 dakika iรงinde iลlenen istek sayฤฑsฤฑnฤฑn ortalama artฤฑล hฤฑzฤฑnฤฑ hesaplar.
Sonuรง olarak, rate(app_response_latency_seconds_count[5m])
sorgusu, son 5 dakika iรงinde iลlenen istek sayฤฑsฤฑnฤฑn ortalama artฤฑล hฤฑzฤฑnฤฑ dรถndรผrรผr.
.
.
.
Histogram Metrics
Yukarฤฑdaki kod parรงacฤฑฤฤฑ, Prometheus iรงin Histogram metrik tรผrรผ kullanarak uygulamanฤฑn HTTP isteklerine verdiฤi yanฤฑt sรผrelerini รถlรงmektedir. Histogram metrikleri, belirli bir deฤer aralฤฑฤฤฑnda meydana gelen olaylarฤฑn sayฤฑsฤฑnฤฑ รถlรงen ve bu olaylarฤฑ belirli "kova" (bucket) adฤฑ verilen aralฤฑklara gรถre gruplandฤฑran metriklerdir.
Kod parรงacฤฑฤฤฑnda, Histogram metriฤi ลu ลekilde tanฤฑmlanmaktadฤฑr:
app_response_latency_seconds
: Histogram metriฤinin adฤฑdฤฑr.'Response latency in seconds'
: Histogram metriฤinin aรงฤฑklamasฤฑdฤฑr.buckets=[0.1,0.5,1,2,3,4,5,10]
: Histogram iรงin tanฤฑmlanan kova sฤฑnฤฑrlarฤฑdฤฑr. Bu, yanฤฑt sรผrelerini ลu aralฤฑklara gรถre gruplandฤฑracaktฤฑr: <= 0.1s, <= 0.5s, <= 1s, <= 2s, <= 3s, <= 4s, <= 5s, <= 10s ve > 10s.
Histogram metriฤi kullanarak yanฤฑt sรผrelerini รถlรงmek iรงin, HandleRequests
sฤฑnฤฑfฤฑndaki do_GET
metodunda histogram metriฤini ลu ลekilde kullanฤฑlฤฑyor:
Bu dekoratรถr, do_GET
metodunun รงalฤฑลma sรผresini รถlรงer ve bu sรผreyi REQUEST_RESPOND_TIME
histogramฤฑna gรถre ilgili kovalara daฤฤฑtฤฑr.
Sonuรง olarak, bu kod parรงacฤฑฤฤฑ, bir web sunucusu baลlatฤฑr ve gelen HTTP isteklerine yanฤฑt verir. Aynฤฑ zamanda, Prometheus iรงin bir Histogram metrik tรผrรผ kullanarak yanฤฑt sรผrelerini รถlรงer ve bu sรผreleri belirli kova aralฤฑklarฤฑna gรถre gruplandฤฑrฤฑr. Bu sayede, uygulamanฤฑn yanฤฑt sรผrelerini daha iyi anlayabilir ve performansฤฑnฤฑ izleyebilirsiniz.
app_response_latency_seconds_bucket{le="+Inf"}
ifadesi, Prometheus tarafฤฑndan histogram metriฤi iรงin otomatik olarak oluลturulan รถzel bir kova (bucket) etiketini temsil eder. Bu รถzel kova, belirtilen kova sฤฑnฤฑrlarฤฑnฤฑn รผstรผnde olan tรผm รถlรงรผm deฤerlerini toplar.
le
etiketi "less than or equal to" (eลit veya kรผรงรผk) anlamฤฑna gelir ve +Inf
(artฤฑ sonsuz) deฤeri, bu kovanฤฑn belirtilen tรผm diฤer kova sฤฑnฤฑrlarฤฑnฤฑn รผstรผnde olan deฤerleri toplayacaฤฤฑnฤฑ gรถsterir.
รrneฤin, histogram metriฤi iรงin kova sฤฑnฤฑrlarฤฑ ลu ลekilde tanฤฑmlanmฤฑล olsaydฤฑ: buckets=[0.1,0.5,1,2,3,4,5,10]
, app_response_latency_seconds_bucket{le="+Inf"}
kovasฤฑ, 10 saniyeden fazla sรผren tรผm yanฤฑt sรผrelerini toplayacak.
Soru 1 => bรผtรผn bucket deฤerleri eลit ilerliyor. Tรผm istekler nasฤฑl aynฤฑ anda bรผtรผn bucketlara eลit oluyor?
Cevap => Bu durum, รถrnek uygulamanฤฑzdaki tรผm isteklerin 2.0 saniyeden daha kฤฑsa sรผrede tamamlandฤฑฤฤฑnฤฑ gรถstermektedir. Histogram metriฤinin รงalฤฑลma ลekli nedeniyle, herhangi bir istek sรผresi, o sรผreden daha bรผyรผk veya eลit olan tรผm le
deฤerlerine sahip bucket'lara dahil edilir.
รrneฤin, bir isteฤin sรผresi 1.5 saniye olsun. Bu durumda, histogram metriฤi ลu ลekilde gรผncellenir:
2.0 saniyeden daha kฤฑsa olduฤu iรงin
app_response_latency_seconds_bucket{le="2.0"}
deฤerini artฤฑrฤฑr.5.0 saniyeden daha kฤฑsa olduฤu iรงin
app_response_latency_seconds_bucket{le="5.0"}
deฤerini artฤฑrฤฑr.10.0 saniyeden daha kฤฑsa olduฤu iรงin
app_response_latency_seconds_bucket{le="10.0"}
deฤerini artฤฑrฤฑr.Sonsuz saniyeden daha kฤฑsa olduฤu iรงin
app_response_latency_seconds_bucket{le="+Inf"}
deฤerini artฤฑrฤฑr.
Eฤer tรผm istekler 2.0 saniyeden daha kฤฑsa sรผrede tamamlanฤฑrsa, bu durumda tรผm bu bucket'lar eลit deฤerlerle artacaktฤฑr. Bu, gรถzlemlediฤiniz durumdur. ฤฐstek sรผrelerinin daฤฤฑlฤฑmฤฑnฤฑ daha iyi gรถrmek iรงin, uygulamanฤฑzdaki time.sleep()
fonksiyonuyla rastgele bekleme sรผrelerini deฤiลtirebilirsiniz. รrneฤin, sรผreleri 0.1 ile 10 arasฤฑnda rastgele seรงerseniz, farklฤฑ bucket'larda farklฤฑ sayฤฑlar gรถrmeye baลlarsฤฑnฤฑz.
Last updated