Spring Boot Uygulamasının Metriclerini Prometheus ile Takip Etmek

Ege Kocabas
Kod Gemisi
Published in
5 min readAug 8, 2019

Bu yazımda Spring Boot uygulamamızın metric’lerini Prometheus yardımı ile depolamayı ve takip etmeyi göstereceğim.

Spring Boot Nedir?

Spring Boot, Spring tabanlı uygulama geliştirmenin en hızlı ve kolay yolu olması amacıyla geliştirilmiş bir frameworktür. Spring Boot sayesinde ‘boilerplate’ yani basmakalıp kodlardan sıyrılıp, sadece ihtiyacımız olan kodu yazıyoruz (only write the code that you need to). Spring Boot web sunucusu olarak Tomcat ve diğer birçok ek özellikle beraber geliyor.

Prometheus Nedir?

Prometheus açık kaynak sistem monitoring ve alerting uygulamasıdır. 2012 yılında SoundCloud şirketinde geliştirilmeye başlanmıştır. Şu anda geliştirmesi community tarafından yapılmaktadır. 2016 yılında ise Kubernetes’ten sonra ikinci ‘hosted’ proje olarak Cloud Native Computing Foundation ’a dahil olmuştur.

Makaleyi yazarken kullandığım sistem özellikleri yukarıdaki gibidir.
Directory Structure

Spring Boot Metriclerinin Aktif Hale Getirilmesi

Ele alacağım örnek basit bir HelloWorld Spring Boot uygulamasıdır. Bağlantıya tıklayarak siz de örnek bir proje oluşturabilirsiniz.

İhtiyacımız olan library’lere ait dependency’leri projemiz içerisindeki pom.xml dosyamıza ekliyoruz.

pom.xml

</dependencies>
...
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
...
...
</dependencies>

spring-boot-starter-actuator →Spring Boot uygulamamızdaki metric’leri JMX ya da HTTP endpoint’lerinde görebilmemizi sağlıyor. Bu linkten endpoint’ler hakkında daha detaylı bilgiye ulaşabilirsiniz.

micrometer-registry-prometheus →Actuator’ın oluşturduğu metric’leri Prometheus’un okuyabileceği formata çevirmek için kullanıyoruz.

Bu iki dependency eklendiği anda HTTP endpoint’leri aktif bir şekilde gelmiyor. Hangilerini istediğimizi application.properties dosyası içinde belitmemiz gerekiyor.

./src/main/resources/application.properties

Bu dizindeki dosyaya aşağıdaki satırı ekleyerek /actuator/prometheus endpoint’ini aktifleştirmiş oluyoruz.

management.endpoints.web.exposure.include=prometheus

Bu işlemler tamamlandıktan sonra executable’ımızı oluşturuyoruz.

mvn package

Düzgün çalıştığını kontrol etmek için aşağıdaki şu komutu çalıştırabiliriz:

java -jar target/<project name>.jar
Projenize göre değişkenlik gösterir.
Hangi endpoint’lerin aktif olduğunu /actuator uzantısından kontrol ediyoruz.

Spring Boot Uygulamasının Docker ile Çalıştırılması

Aşağıdaki Dockerfile ile docker image’imizi oluşturuyoruz.

Dockerfile

FROM adoptopenjdk/openjdk8EXPOSE 8080COPY /path/to/<project name>.jar /home/<project name>.jarCMD ["java","-jar","/home/<project name>.jar"]

Kopyalamamız gereken *.jar dosyası, mvn package işleminden sonra /target’ın içine çıkan dosyadır. Makalenin başında görmüş olduğunuz Directory Structure’a göre bu Dockerfile’ı değiştirmeye kalktığımızda yapılacak tek değişiklik aşağıdaki gibi olacaktır:

COPY ./spring-boot/target/<project name.jar> /home/<project name>.jar

Ardından build işlemini başlatıyoruz:

docker build --tag=helloworld .

İşlem tamamlandıktan sonra helloworld isminde docker image’imiz yaratılmış oluyor. Bu image’in içinde ise build ettiğimiz java dosyası çalışmaktadır.

Prometheus Konfigürasyonu

Şimdi ise Prometheus’un konfigürasyon dosyasını oluşturmamız gerekiyor.

prometheus.yml

global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['HOST-IP:8080']

HOST-IP yerine hangi makinede çalışacaksa o makinenin ip adresini yazmamiz gerekiyor.

docker-compose.yml

version: "3.4"services:
myapp:
image: helloworld
ports:
- "8080:8080"
prometheus:
image: quay.io/prometheus/prometheus:v2.0.0
ports:
- "9090:9090"
command: "--config.file=/etc/prometheus/prometheus.yml"
configs:
- source: prometheus.yml
target: /etc/prometheus/prometheus.yml
configs:
prometheus.yml:
file: ./prometheus.yml

prometheus.yml ile docker-compose.yml aynı dizinde olmalıdır.

Farklı dizinlerde olduğu durumda ise docker-compose.yml dosyasının en alt satırındaki configs kısmı değiştirilmelidir.

Örnek vermek gerekirse,

docker-compose.yml

...
...
configs:
prometheus.yml:
file: /path/to/prometheus.yml

Docker Swarm

Uygulamalarımızı ayağa kaldırmak için önce bir Docker Swarm cluster’ı yaratmamız gerekiyor. Böylelikle uygulamalarımızı docker stack deploy komutu ile çalıştırabiliriz.

Docker Swarm hakkında detaylı bilgiye linkten ulaşabilirsiniz.

Docker’ın kendi dokümantasyonunu okumak isterseniz:

Create a swarm

Add nodes to the swarm

  • Docker Swarm cluster’ı yerine direkt docker-compose up ile çalıştırdığımız zaman aşağıdaki hatayı almaktayız.
WARNING:  Some services (prometheus) use the 'configs' key, which will be  ignored. Compose does not support 'configs' configuration - use docker stack deploy to deploy to a swarm.
  • docker-compose, config dosyalarıyla birlikte çalışmıyor. Daha detaylı bilgi için linke tıklayabilirsiniz.

Docker swarm cluster’ını yarattıktan sonra:

docker stack deploy -c docker-compose.yml <name>

ile Prometheus’u ve Spring Boot uygulamamızı çalıştırıyoruz.
docker-compose.yml dosyasının olduğu dizinde çalıştırılmazsa hata verecektir.

Servislerimizin oluşturulmasını bekliyoruz. Bu sürede docker service ls komutu ile servislerimizin replica sayılarını kontrol edebiliriz. Hiçbir sıkıntı çıkmaması durumunda aşağıdaki gibi bir çıktıyla karşılaşacaksınız:

HOST-IP:8080 →Spring Boot uygulamamız

HOST-IP:9090 →Prometheus

HOST-IP:9090/targets ‘a bağlanıp Spring Boot uygulamamızın metric’lerini düzgün alıp almadığını kontrol ediyoruz.

Ya da sırasıyla Status →Targets’a tıklayarak da aynı sayfaya gidebiliriz.

Bu noktada her şey düzgün çalışmakta ve sitemizin metric’leri Prometheus’a import edilmiş durumdadır.

Prometheus

Prometheusun ana sayfasındaki boşluğa {job=”spring-boot”} yazıp execute dediğiniz zaman Spring Boot uygulamamızdan gelen metric’lerin listesini görebilirsiniz. “spring-boot” olması, config dosyasında (prometheus.yml) bu isimle tanımlamamızdan kaynaklanır.

Örnek vermek gerekirse, sitenize gelen HTTP isteklerini görmek istediğinizde:

http_server_requests_seconds_count{job=”spring-boot”,uri=”/”}

yazmanız yeterlidir. Daha sonrasında ise Graph’a tıklayarak HTTP istek sayısının zamana göre değişimini bir grafik üzerinde görebilirsiniz.

Bu istekleri çeşitlendirmek, daha da karmaşık yazmak mümkündür. Bu yazımda size Spring Boot uygulamasının metric’lerini Prometheus’a eklemeyi gösterdiğim için daha derine inmiyorum. Prometheus hakkında daha detaylı bilgi için aşağıdaki linklere bakabilirsiniz.

--

--