Məqalələr

Hikari Connection Pool Metrics

Written by Mushfiq Mammadov

Çoxdandır blogda məqalə yazmıram, karantində mən də şeytanın qıçını sındırım dedim 🙂

Bu məqalədə hikari-connection-pool`da mövcud olan connection`ların vəziyyəti haqqında real-time məlumatları izləmək üçün manual necə metrics yazmaq olar ona baxacağıq.

Çox güman ki, devops tərəfdə connection metrics ilə bağlı çox gözəl hazır tool`lar var, bu məqalədə sadəcə qısa və yığcam şəkildə necə metrics yazmaq olar onu görəcəyik. Bunu develop etmək niyyəti əslində hazırda üzərində işlədiyim proyekt ilə əlaqədar yarandı. Proyekt connection`lara həssas bir proyektdi, yüngül load test etmək istəyirdim və mənə connection`ların özlərini necə aparmağına tool`suz filan rahat şəkildə, istədiyim vaxt baxa bilmək lazım oldu. Və beləcə bu kod meydana gəldi.

Yəqin fikir vermisiz, loglarda Hikari`inin DEBUG modunu açıq etsəniz müəyyən intervaldan bir aşağıdakı logun çıxdığını görürsünüz:

HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0)

Mənə də bu məlumatlar kifayət edirdi. Qərara aldım ki, bir endpoint yazım, istədiyim vaxt çağırıb bu infolara baxım. Bu məqalədə də bu endpoint`i develop edəcəyik. Getdik 🙂

Deməli metrics ilə işləmək üçün Spring Boot Actuator kitabxanasından istifadə edəcəyik. Spring Boot 2 versiyasından sonra actuator`da 2 endpointdən (/health/info) başqa digər bütün endpoint`lər default olaraq disabled gəlir. Əgər bütün endpoint`ləri enabled etmək istəsək o zaman application.properties faylına aşağıdakı sətri əlavə etməliyik:

management.endpoints.web.exposure.include=*

Bizə metrics lazım olduğuna görə sadəcə onu əlavə edəcəyik. Metrics`də mövcud olan bütün parametrlərin siyahısına baxmaq üçün aşağıdakı endpoint`i çağırırıq:

http://localhost:8888/actuator/metrics

Bu siyahıdakı hansı parametrlə bağlı məlumata baxmaq istəyiriksə, həmin parametrin adını yuxarıda qeyd etdiyimiz endpointdən sonra / qoyaraq əlavə edib çağırırıq. Məsələn HikariCP`də mövcud olan bütün connection`ların sayına baxmaq üçün aşağıdakı endpoint`i çağırırıq:

http://localhost:8888/actuator/metrics/hikaricp.connections

Qayıdan response`dan görürük ki, bizim 3 connection pool`umuz və ümumilikdə 35 mövcud connection`umuz var. Amma hansı connection pool`a nə qədər connection aiddir onu ayrıca görə bilmirik.

Yazdıqlarımızı yekunlaşdırsaq deməli hazırkı vəziyyətdə bizim 2 çətinliyimiz var:

  1. Hansı parametrlə bağlı məlumatı görmək istəyiriksə, onun üçün ayrıca endpoint çağırmalıyıq; əgər 4 parametr üzrə məlumat lazımdısa, 4 fərqli endpoint çağırmalıyıq;
  2. Tutaq ki, bir neçə fərqli endpoint çağırmağa razı olduq, amma bizim əldə etdiyimiz məlumat yenə də ümumi məlumat olur. Əgər bizim bir neçə connection-pool`umuz varsa, hər pool üzrə məlumatları ayrıca görə bilməyəcəyik, necə ki, yuxarıdakı response`da göstərilən 35 connection 3 pool`a aiddir.

Buna görə də məlumatları istədiyimiz formada əldə etmək üçün manual metrics yazacağıq və bunun üçün actuator kitabxanasının MetricsEndpoint klasını istifadə edəcəyik. Proyektimizin strukturu aşağıdakı kimi olacaq:

hikari-connection-pool-metrics

MetricsController.java

 

MetricsService.java

 

MetricsUtil.java

 

DatabaseConfig.java

 

application.yml

 

İndi aşağıdakı endpoint`i çağırmaqla nəticəni artıq öz istədiyimiz şəkildə görə bilərik:

http://localhost:8888/metrics/hikari/connections

Kodları yəqin ki, izah etməyə ehtiyac yoxdur, MetricsEndpoint klasının metric() metodunu araşdırmaq kifayət edir. Parametrlərin ümumi siyahısına baxmaq üçün MetricsEndpoint klasının listNames() metodundan istifadə edə bilərsiz. Mənə hikari ilə bağlı 4 parametr lazım olduğundan sadəcə onları qruplaşdırmışam. Amma siz istəsəniz bunu özünüzə lazım olan digər şəkillərdə təkmilləşdirə bilərsiz.

Kodlara tam şəkildə Githubda aşağıdakı repo üzərindən baxa bilərsiz:

https://github.com/mmushfiq/hikari-connection-pool-metrics.git

Bu məqaləmiz də bu qədər, ümid edirəm faydalı olmuşdur. Növbəti məqalələrdə görüşənədək. Necə deyərlər evdə qalın, sağlam qalın, amma arada imkan olduqca yazın pozun))

About the author

Mushfiq Mammadov

2 Comments

Leave a Comment

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.