Spring Boot๋ก ๋ฐฑ์๋๋ฅผ ์๋น์คํ๋ค ๋ณด๋ฉด ๊ฐ ์๋น์ค๋ค์ ์ํ๋ฅผ ํ ๋์ ๋ณผ ์ ์๋ ์๊ฐํ๋ ๋ชจ๋ํฐ๋ง ์์คํ ์ด ํ์ํด์ง๋ค.
์ด๋ฅผ ์ํด ์ด๋ฒ ํฌ์คํธ์์๋ Spring Boot MSA ํ๋ก์ ํธ์ Prometheus๋ฅผ ์ฐ๋ ํ, Grafana๋ก ์๊ฐํ๋ ๋ชจ๋ํฐ๋ง ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
Prometheus๋?
Prometheus๋ ์๋ Soundcloud์์ ๋ง๋ ์คํ์์ค ์์คํ ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ ํดํท์ ๋๋ค. 2012๋ ์์ ์ด๋, ๋ง์ ๊ธฐ์ ๊ณผ ์กฐ์ง์ด Prometheus๋ฅผ ์ฑํํ์ผ๋ฉฐ, ์ด ํ๋ก์ ํธ๋ ๋งค์ฐ ํ๋ฐํ ๊ฐ๋ฐ์ ๋ฐ ์ฌ์ฉ์ ์ปค๋ฎค๋ํฐ๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ํ์ฌ๋ ๋ ๋ฆฝํ ์คํ ์์ค ํ๋ก์ ํธ๋ก์ ์ด๋ค ํ์ฌ๋ก๋ถํฐ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ง ๊ด๋ฆฌ๋๊ณ ์์ต๋๋ค. ์ด๋ฅผ ๊ฐ์กฐํ๊ณ ํ๋ก์ ํธ์ ๊ฑฐ๋ฒ๋์ค ๊ตฌ์กฐ๋ฅผ ๋ช ํํ ํ๊ธฐ ์ํด Prometheus๋ 2016๋ ์ Kubernetes์ ์ด์ด ๋ ๋ฒ์งธ๋ก ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ปดํจํ ์ฌ๋จ์ ํธ์คํธ ํ๋ก์ ํธ๋ก ๊ฐ์ ํ์ต๋๋ค. Prometheus๋ ๋ ์ด๋ธ์ด๋ผ๋ optional key-value์๋ค๊ณผ ํจ๊ป ๊ธฐ๋ก๋ metrics๋ฅผ ์๊ณ์ด ๋ฐ์ดํฐ๋ก ์์ง ๋ฐ ์ ์ฅํฉ๋๋ค. ์๋ฌธ๐
๊ทธ๋ฆฌ๊ณ Prometheus๋ฅผ ํตํด ์์ง, ์ ์ฅ๋ ๋ฐ์ดํฐ๋ PromQL์ด๋ผ๋ ์ฟผ๋ฆฌ ํํ๋ก ์ถ์ถ ๋ฐ ๋ถ์ํ ์ ์๋ค.
Grafana๋?
Grafana OSS๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉํธ๋ฆญ, ๋ก๊ทธ ๋ฐ ์ถ์ ์ด ์ ์ฅ๋ ์์น์ ๊ด๊ณ์์ด ์ฟผ๋ฆฌ, ์๊ฐํ, ์๋ฆผ ๋ฐ ํ์ํ ์ ์์ต๋๋ค. Grafana OSS๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค(TSDB) ๋ฐ์ดํฐ๋ฅผ ์๊ธฐ ์ฌ์ด ๊ทธ๋ํ์ ์๊ฐํ๋ก ์ ํํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ Grafana OSS ํ๋ฌ๊ทธ์ธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด NoSQL/SQL DB, Jira ๋๋ ServiceNow์ ๊ฐ์ ํฐ์ผํ ๋๊ตฌ, GitLab๊ณผ ๊ฐ์ CI/CD ๋๊ตฌ์ ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฌธ๐
์ฆ Prometheus๋ฅผ ํตํด ์ถ์ถํ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ Grafana๋ก ์๊ฐํํจ์ผ๋ก์จ ๋ด๊ฐ ํ์ฌ ์๋น์คํ๋ Spring Boot ์ฑ๋ค์ ํ ๋์ ๋ชจ๋ํฐ๋งํ ์ ์๋ค.
Spring Boot Applications ์ค๋น
Grafana + Prometheus ์ ์ฉ ์ ๊ฒ์ฆ
์ด ํฌ์คํธ์์๋ ์ฐ๋ถํฌ ํ๊ฒฝ ์์์ ์ต๋ํ ๊ฐ๋จํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ (MSA; Microservices Architecture) ํํ๋ก Spring Boot ์ฑ๋ค์ ์๋น์คํ๋ค. ์ฐ์ธก ์ด๋ฏธ์ง์ step09_
๋ก ์์ํ๋ ์ฑ๋ค์ด ๋ฐ๋ก ๊ทธ๊ฒ์ด๋ค.
์ด 4๊ฐ์ ์ฑ๋ค์ ์์ฝํ์๋ฉด:
- step09_SpringCloudClient1: Payment service๋ผ ๊ฐ์ .
/payment/info
์์ ํด๋น ์๋น์ค์ ํฌํธ ๋ฒํธ๋ฅผ ์๋ ค์ค๋ค. - step09_SpringCloudClient2: Order service๋ผ ๊ฐ์ .
/order/info
์์ ํด๋น ์๋น์ค์ ํฌํธ ๋ฒํธ๋ฅผ ์๋ ค์ค๋ค. - step09_SpringCloudGateway: Gateway service. ์ 1, 2 ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ 80 ํฌํธ๋ก ๋ฌถ๋ ๊ฒ์ดํธ์จ์ด ์ญํ ์ ์ํํ๋ค. ์ค์ ๋ก ์๋น์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด Nginx๋ Apache๋ฅผ 80๋ฒ ํฌํธ์ ๋ฌผ๋ ค๋๋ ๊ฒ์ด ์ข๊ฒ ์ง๋ง ์ด ํฌ์คํธ์์๋ ๊ฒ์ดํธ์จ์ด ์๋น์ค๋ฅผ 80๋ฒ ํฌํธ์ ๋ฌผ๋ ค๋๊ธฐ๋ก ํ๋ค.
- step09_SpringCloudServer: Eureka server. ์ 3๊ฐ์ ์๋น์ค๋ค์ ์ ๋ถ
@EnableDiscoveryClient
์ ๋ํ ์ด์ ์ ์ ์ฉํ์ฌ ์ด Eureka server์ ๋ฑ๋ก๋๊ฒ๋ ๋ง๋ค์๋ค. - ๋ชจ๋ Java 17, Spring Boot 3.2.3, Gradle + Groovy๋ก ๊ตฌ์ฑ
- Eureka server ๋ฐ client ๊ตฌ์ฑ
application.properties
๊ฐ ์๋๋ผapplication.yml
์ ์์ฑ- ๊ฐ๋ฐ ํ๊ฒฝ์ STS4์ด๋ค.
4๊ฐ์ ์ฑ๋ค์ ์คํ๊ฐ๋ฅํ jar ํ์ผ๋ก ์์ฑํ๊ธฐ ์ํ์ฌ ./gradlew bootJar
๋ฅผ ์คํํ์๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด ์๋์ฐ์์ 4๊ฐ์ ์ฑ๋ค์ ๊ตฌ๋ํ์ฌ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ์ธํ์๋ค.
Spring Boot ์ฑ๋ค์ Prometheus ์ ์ฉ
Spring Boot ์ฑ๋ค์ Spring Boot Actuator๋ฅผ ํ์ฑํํ์ฌ, Actuator๊ฐ ์ ๊ณตํ๋ metrics๋ฅผ Prometheus๋ก ์์งํ์.
์ฐ์ ๊ฐ ์ฑ๋ค์ application.yml
์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
Eureka server์ application.yml
:
server:
port: 8761
address: 127.0.0.1
tomcat:
mbeanregistry:
enabled: true
management:
endpoints:
web:
exposure:
include: "*"
eureka:
instance:
hostname: 127.0.0.1 # public IP ์ฃผ์ ๋๋ ๊ทธ๋ฅ localhost ๋ฑ..
prefer-ip-address: true #instance๊ฐ client ๋ณด๋ค ์์ ์๊ฒ
client:
register-with-eureka: false #์๋ฒ๋ผ์ false
fetch-registry: false
service-url:
default-zone: http://${eureka.instance.hostname}:${server.port}/eureka/ # ์ถ๊ฐ
ํนํ ์ค์ํ ํํธ๋ server
์๋์ tomcat
๋ถํฐ, management
ํญ๋ชฉ ์ ์ฒด์ด๋ค.
๋จผ์ server
์๋์ tomcat
ํญ๋ชฉ์ ๋ํ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ๋ค.
๐ก Tomcat MBean ๋ ์ง์คํธ๋ฆฌ ํ์ฑํํ๊ธฐ:
- MBean์ Java Management Extensions (JMX)๋ฅผ ํตํด ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ ์ ์๋ Java ๊ฐ์ฒด
- Tomcat์ MBean ๋ ์ง์คํธ๋ฆฌ๋ฅผ ํ์ฑํํ๋ฉด, ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ํฐ์บฃ ๋ด๋ถ์ ๋ค์ํ ๋ฉํธ๋ฆญ์ ์์งํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ํฐ์บฃ์ ์ฑ๋ฅ ๋ฐ ์ํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
์๋ฒ ๋๋ ํฐ์บฃ์ MBean ๋ ์ง์คํธ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋ผ ์๋ค. ๋๋ถ์ ํฐ์บฃ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ํํ ์ ์๋ค. ํฐ์บฃ์ MBean์ ์ฌ์ฉํด์ Micrometer ๋ฑ์ ํตํด ๋ฉํธ๋ฆญ์ ๋ ธ์ถํ๊ณ ์ถ๋ค๋ฉด (...) server.tomcat.mbeanregistry.enabled ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์๋ฌธ๐
๋ํ management
ํญ๋ชฉ์, Spring Boot ์ฑ๋ค์ /actuator/prometheus
๋ผ๋ path๋ฅผ ๋
ธ์ถ์ํค๊ธฐ ์ํจ์ด๋ค. ์ฌ๊ธฐ์ endpoint
์ include
๋ ํด๋น ํญ๋ชฉ๋ค์ ํฌํจํ๋ค, ๊ทธ๋ฆฌ๊ณ exclude
๋ ๋ฐฐ์ ํ๋ค๋ ๊ฒ์ด๋ค. *
๋ผ๋ ๊ฐ์ ๋ชจ๋ endpoints
๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ. ๊ทธ๊ฒ ์๋๋ผ ํน์ ํ endpoint๋ง ๋
ธ์ถ์ํค๊ณ ์ ํ๋ค๋ฉด ์ํฉ์ ๋ง๊ฒ ๊ตฌ์ฑํ ์๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ฑ๋ค์ build.gradle
์ dependencies
ํญ๋ชฉ์๋ ์๋์ ๊ฐ์ด Prometheus์ Actuator๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
dependencies {
(... ์๋ต ...)
runtimeOnly 'io.micrometer:micrometer-registry-prometheus' // ๋ง์ดํฌ๋ก๋ฏธํฐ ํ๋ก๋ฉํ
์ฐ์ค ๊ตฌํ์ฒด
implementation 'org.springframework.boot:spring-boot-starter-actuator' // ์ก์ถ์์ดํฐ
}
์ด๋ ๊ฒ application.yml
๋ฐ build.gradle
๊ตฌ์ฑ์ ๋๋จธ์ง 3๊ฐ์ ์ฑ๋ค์๋ ์ ์ฉํ ๋ค, bootJar
๋ฅผ ํตํด ์คํ๊ฐ๋ฅํ jar ํ์ผ์ ๋ฐ๋๋ค.
Ubuntu์ Grafana ๋ฐ Prometheus ํ๊ฒฝ ๊ตฌ์ฑ
Grafana ๋ฐ Prometheus ์ค์น
์ด ํฌ์คํธ์์๋ ์ 4๊ฐ์ Spring Boot ์ฑ๋ค์ด Ubuntu ํ๊ฒฝ์์ ๊ตฌ๋๋ ๊ฒ์ ์ ์ ๋ก ํ๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ Ubuntu์ ์ ธ์์ ์คํํ์ฌ Grafana ๋ฐ Prometheus๋ฅผ ์ค์นํ์ฌ ์คํ์ํฌ ์ ์๋ค.
# ์๊ฐํ ๋๊ตฌ์ธ Grafana๋ฅผ ์ค์น
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana
# Grafana๋ฅผ ์์ํ๊ณ ํ์ฑํ
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
# ๋ชจ๋ํฐ๋ง ๋๊ตฌ์ธ Prometheus๋ฅผ ์ค์น
sudo apt-get install prometheus
# Prometheus๋ฅผ ์์ํ๊ณ ํ์ฑํ
sudo systemctl start prometheus
sudo systemctl enable prometheus
Prometheus ํ๊ฒฝ ๊ตฌ์ฑ
Prometheus์ /etc/prometheus/prometheus.yml
(ํด๋น ํ์ผ์ ๋์๋ค๊ฐ ๋ถ์ผ ๊ฒ, targets
ํญ๋ชฉ์ ์ํฉ์ ๋ง๊ฒ ์กฐ์ , ๋ค์ฌ์ฐ๊ธฐ ์ฃผ์!)
- job_name: 'probono-server'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['localhost:8761']
์ดํ ์๋์ ๊ฐ์ด Prometheus ์๋น์ค ์ฌ์์:
# Prometheus๋ฅผ ์ฌ์์
sudo systemctl reload prometheus
sudo systemctl restart prometheus
์์์ application.yml
๋ฐ build.gradle
๋ฅผ ์์ ํ 4๊ฐ์ ์ฑ๋ค์ jar ํ์ผ์ ์คํํ๊ณ , Ubuntu์ ์
ธ์์ curl http://localhost:8761/actuator/prometheus
์คํ ์ ์๋์ ๊ฐ์ด ๋จ๋ฉด metrics๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๊ณ ์๋ ๊ฒ์ด๋ค.
๋ง์ฝ, 404 Not Found ๋ฑ์ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด Prometheus ์ ์ฉ์ ์คํจํ ๊ฒ์ด๋ค.
Grafana ํ๊ฒฝ ๊ตฌ์ฑ
์ด๊ธฐ ๊ตฌ์ฑ
http://localhost:3000
์ ์ ์ํ์ฌ Grafana ๋ก๊ทธ์ธ ํ๋ฉด์ ๋ณผ ์ ์๋ค. ๊ธฐ๋ณธ ๊ณ์ ์ admin
/ admin
๊ทธ๋ฆฌ๊ณ ์ต์ด ๋ก๊ทธ์ธ ์, ์๋ ํ๋ฉด๊ณผ ๊ฐ์ด ์ํธ๋ฅผ ์ค์ ํ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋ฌ๋ค.
์ํ๋ ์ํธ๋ฅผ ์ค์ ํ ๋ค (๋๋ ์ข์ธกํ๋จ skip๋ฅผ ๋๋ฅธ ๋ค) Submit๋ฅผ ๋๋ฅธ๋ค.
Spring Boot ๋ชจ๋ํฐ๋ง์ ์ ํฉํ ๋์๋ณด๋ ์์ฑ
์ด์ Spring Boot ์ฑ๋ค์ ๋ชจ๋ํฐ๋ง์ ์ ํฉํ ๋์๋ณด๋๋ฅผ ์์ฑํ ์ ์๋ค. Grafana ๋ฉ์ธ ํ๋ฉด์ ์ข์ธก์๋จ Dashboards๋ฅผ ํด๋ฆญํ๋ค.
์ดํ ๋์๋ณด๋ ํ๋ฉด์ ์ฐ์ธก์๋จ Import๋ฅผ ์ ํํ๋ค.
์ ์ ๊ฐ ์ง์ ๋์๋ณด๋๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ๋ง๋ค ์๋ ์๊ฒ ์ง๋ง, ์ด๋ฏธ ๋๊ฐ ๋ง๋ค์ด๋์ ํ ํ๋ฆฟ์ ํ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์ด ํฌ์คํธ์์๋ 'Spring Boot 2.1 System Monitor'๋ผ๋ ํ ํ๋ฆฟ์ ๊ฐ์ ธ๋ค ์ธ ๊ฒ์ด๋ค. https://grafana.com/grafana/dashboards/11378-justai-system-monitor/
์ด Spring Boot 2.1 System Monitor์ Copy ID to clipboard๋ฅผ ํด๋ฆญํ๋ค.
๋ค์ localhost
์ Grafana ํ์ด์ง๋ก ๋์์์, ์๋์ ๊ฐ์ด, ํด๋น ํ
ํ๋ฆฟ์ importํ๋ค.
์ด๋ Datasource๋ก Premetheus๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. ์๋์ ๊ฐ์ด, 'Prometheus server URL'์ด๋ผ๋ ํญ๋ชฉ์๋ http://localhost:9090์ ๋ฃ๋๋ค.
Grafana ๋์๋ณด๋ ์ต์ข ํ์ธ
Importํ ํ ํ๋ฆฟ์ ํตํด ๋์๋ณด๋๋ฅผ ์์ฑํ์ฌ ์๋์ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
์๋ ํ์ธ์.
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!