๐ŸExamining the data of our Python application

import http.server
from prometheus_client import start_http_server # For Prometheus

APP_PORT = 8000
METRICS_PORT = 8001 # For Prometheus

class HandleRequests(http.server.BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>First Application</title></head><body style='color: #333; margin-top: 30px;'><center><h2>Welcome to our first Prometheus-Python application.</center></h2></body></html>", "utf-8"))
        self.wfile.close()

if __name__ == "__main__":
    start_http_server(METRICS_PORT) # For Prometheus
    server = http.server.HTTPServer(('10.90.0.144', APP_PORT), HandleRequests)
    server.serve_forever()

Yukarฤฑdaki uygulama, Prometheus metriklerini kullanarak bir HTTP sunucusu baลŸlatan basit bir uygulamadฤฑr. Uygulamanฤฑn detaylarฤฑna inecek olursak;

  1. ฤฐ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.

  2. 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).

  3. 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 sadece GET isteklerini ele alacak ลŸekilde tanฤฑmlanmฤฑลŸtฤฑr.

  4. do_GET metodunda, sunucu, baลŸarฤฑlฤฑ bir yanฤฑt olarak 200 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.

  5. __main__ iรงinde, metrikleri toplamak ve yayฤฑnlamak iรงin Prometheus istemcisini baลŸlatฤฑrฤฑz: start_http_server(METRICS_PORT).

  6. Daha sonra, HTTP sunucusunu baลŸlatฤฑrฤฑz. Sunucunun IP adresi (10.90.0.144) ve uygulama portu (APP_PORT) ile http.server.HTTPServer sฤฑnฤฑfฤฑndan bir nesne oluลŸtururuz. Bu nesneye, istekleri iลŸlemek iรงin HandleRequests sฤฑnฤฑfฤฑnฤฑ saฤŸlarฤฑz.

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

/usr/bin/python3 app.py

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.

  - job_name: "prom_python_app"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ["10.90.0.144:8001"]

Ardฤฑndan prometheus servisini yeniden baลŸlatฤฑp, arayรผzden verinin kontrolรผnรผ saฤŸlฤฑyoruz.

Counter Metrics

import http.server
import random
from prometheus_client import start_http_server, Counter # For prometheus and counter metrics

REQUEST_COUNT = Counter('app_requests_count_istekler', 'total app http request count',['app_name', 'endpoint']) # Prometheus for counter metrics
RANDOM_COUNT = Counter('app_rastgele_count','increment counter by random value') # Prometheus for counter metrics

APP_PORT = 8000
METRICS_PORT = 8001 # for Prometheus

class HandleRequests(http.server.BaseHTTPRequestHandler):

    def do_GET(self):
        REQUEST_COUNT.labels('prom_python_app', self.path).inc() # Prometheus for counter metrics
        random_val = random.random()*10 # Prometheus for counter metrics
        RANDOM_COUNT.inc(random_val) # Prometheus for counter metrics

        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>First Application</title></head><body style='color: #333; margin-top: 30px;'><center><h2>Welcome to our first Prometheus-Python application.</center></h2></body></html>", "utf-8"))
        self.wfile.close()

if __name__ == "__main__":
    start_http_server(METRICS_PORT)  # for Prometheus
    server = http.server.HTTPServer(('10.90.0.144', APP_PORT), HandleRequests)
    server.serve_forever()

Kodumuza, gelen istekleri inceleyebilmek iรงin, bazฤฑ satฤฑrlarฤฑ ekliyoruz. Bu satฤฑrlarฤฑn aรงฤฑklamalarฤฑ ลŸu ลŸekilde,

  1. random modรผlรผ iรงe aktarฤฑldฤฑ. Bu modรผl, rastgele sayฤฑlar รผretmek iรงin kullanฤฑlฤฑr.

  2. Prometheus istemcisinden Counter metriฤŸi iรงe aktarฤฑldฤฑ. Counter, artan bir deฤŸeri temsil eden bir metrik tรผrรผdรผr.

  3. ฤฐ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.

  4. 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ฤŸer random_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 nesnesine inc() fonksiyonu ile random_val deฤŸiลŸkeninde tutulan rastgele deฤŸeri ekliyoruz. Bu, Counter nesnesinin deฤŸerini random_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

import http.server
import random
import time
from prometheus_client import start_http_server, Gauge

REQUEST_INPROGRESS = Gauge('app_requests_inprogress','number of application requests in progress')
REQUEST_LAST_SERVED = Gauge('app_last_served', 'Time the application was last served.')

APP_PORT = 8000
METRICS_PORT = 8001

class HandleRequests(http.server.BaseHTTPRequestHandler):

    @REQUEST_INPROGRESS.track_inprogress()
    # track_inprogress() yรถntemi, Prometheus'un Gauge sฤฑnฤฑfฤฑnฤฑn bir yรถntemidir.
    # Bu, her seferinde bir istek alฤฑndฤฑฤŸฤฑnda ve do_GET fonksiyonu รงalฤฑลŸtฤฑrฤฑldฤฑฤŸฤฑnda, REQUEST_INPROGRESS Gauge metriฤŸinin deฤŸeri otomatik olarak artฤฑrฤฑlฤฑr. 
    # ฤฐลŸlem tamamlandฤฑฤŸฤฑnda ve fonksiyon sona erdiฤŸinde ise deฤŸer otomatik olarak azaltฤฑlฤฑr. 
    # Bu, ลŸu anda iลŸlenmekte olan isteklerin sayฤฑsฤฑnฤฑ takip etmeye ve uygulamanฤฑn ne kadar yรผk altฤฑnda olduฤŸunu anlamaya yardฤฑmcฤฑ olur.
    def do_GET(self):
        time.sleep(5)
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>First Application</title></head><body style='color: #333; margin-top: 30px;'><center><h2>Welcome to our first Prometheus-Python application.</center></h2></body></html>", "utf-8"))
        self.wfile.close()
        REQUEST_LAST_SERVED.set_to_current_time()
        # set_to_current_time() fonksiyonu, Prometheus'un Gauge sฤฑnฤฑfฤฑnฤฑn bir yรถntemidir. 
        # Bu yรถntem, Gauge metriฤŸini otomatik olarak mevcut zamanla gรผnceller (Unix epoch formatฤฑnda, saniye cinsinden). 
        # Bu sayede, uygulama sรผresince en son iลŸlenen isteฤŸin zamanฤฑnฤฑ takip edebilir ve uygulamanฤฑn ne kadar sรผreyle aktif olduฤŸunu gรถrebilirsiniz.

if __name__ == "__main__":
    start_http_server(METRICS_PORT)
    server = http.server.HTTPServer(('10.90.0.144', APP_PORT), HandleRequests)
    server.serve_forever()

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:

  1. 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_INPROGRESS = Gauge('app_requests_inprogress','number of application requests in progress')
  1. 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.

REQUEST_LAST_SERVED = Gauge('app_last_served', 'Time the application was last served.')

ฤฐ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.

@REQUEST_INPROGRESS.track_inprogress()
def do_GET(self):
    ...

ฤฐ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.

REQUEST_LAST_SERVED.set_to_current_time()

Bu รถlรงรผmler sayesinde, uygulamanฤฑn performansฤฑnฤฑ ve kullanฤฑmฤฑnฤฑ daha iyi anlayabilir ve gerektiฤŸinde iyileลŸtirmeler yapabilirsiniz.

.

.

.

Summary Metrics

import http.server
import time
from prometheus_client import start_http_server, Summary

REQUEST_RESPOND_TIME = Summary('app_response_latency_seconds', 'Response latency in seconds')

APP_PORT = 8000
METRICS_PORT = 8001

class HandleRequests(http.server.BaseHTTPRequestHandler):

    @REQUEST_RESPOND_TIME.time()
    def do_GET(self):
        time.sleep(6)
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>First Application</title></head><body style='color: #333; margin-top: 30px;'><center><h2>Welcome to our first Prometheus-Python application.</center></h2></body></html>", "utf-8"))
        self.wfile.close()


if __name__ == "__main__":
    start_http_server(METRICS_PORT)
    server = http.server.HTTPServer(('10.90.0.144', APP_PORT), HandleRequests)
    server.serve_forever()

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;

  1. Summary metriฤŸi tanฤฑmlama:

REQUEST_RESPOND_TIME = Summary('app_response_latency_seconds', 'Response latency in seconds')

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.

  1. time() dekoratรถrรผnรผ kullanma:

@REQUEST_RESPOND_TIME.time()

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.

    @REQUEST_RESPOND_TIME.time()
    def do_GET(self):
        ...

ร–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]) / rate(app_response_latency_seconds_count[5m])
  1. rate(app_response_latency_seconds_sum[5m]): Son 5 dakika iรงindeki app_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.

  2. rate(app_response_latency_seconds_count[5m]): Son 5 dakika iรงindeki app_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.

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

  1. rate fonksiyonu, belirtilen zaman aralฤฑฤŸฤฑ (รถrneฤŸin, son 5 dakika) boyunca metrik deฤŸerinin zaman serisindeki veri noktalarฤฑnฤฑ alฤฑr.

  2. ฤฐki ardฤฑลŸฤฑk veri noktasฤฑ arasฤฑndaki farkฤฑ alarak, her bir veri noktasฤฑ arasฤฑndaki deฤŸiลŸimi hesaplar.

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

  1. Son 5 dakikadaki app_response_latency_seconds_count metriฤŸi iรงin veri noktalarฤฑnฤฑ alฤฑr.

  2. ฤฐki ardฤฑลŸฤฑk veri noktasฤฑ arasฤฑndaki farkฤฑ alarak, her bir veri noktasฤฑ arasฤฑndaki deฤŸiลŸimi hesaplar.

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

import http.server
import time
from prometheus_client import start_http_server, Histogram

REQUEST_RESPOND_TIME = Histogram('app_response_latency_seconds', 'Response latency in seconds', buckets=[0.1,0.5,1,2,3,4,5,10])

APP_PORT = 8000
METRICS_PORT = 8001

class HandleRequests(http.server.BaseHTTPRequestHandler):

    @REQUEST_RESPOND_TIME.time()
    def do_GET(self):
        time.sleep(1)
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>First Application</title></head><body style='color: #333; margin-top: 30px;'><center><h2>Welcome to our first Prometheus-Python application.</center></h2></body></html>", "utf-8"))
        self.wfile.close()
        REQUEST_RESPOND_TIME.observe(time_taken)


if __name__ == "__main__":
    start_http_server(METRICS_PORT)
    server = http.server.HTTPServer(('10.90.0.144', APP_PORT), HandleRequests)
    server.serve_forever()

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:

REQUEST_RESPOND_TIME = Histogram('app_response_latency_seconds', 'Response latency in seconds', buckets=[0.1,0.5,1,2,3,4,5,10])
  • 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:

@REQUEST_RESPOND_TIME.time()

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