λͺ©μ°¨
λμ λ°°κ²½
μ§λ μ€νλ¦°νΈ λ μλ²κ° λ€μ΄λλλ° μμΈ νμ
μ΄ λ°λ‘ λμ§ μμμ΅λλ€. μ΄λ€ μνμλμ§λ μ λͺ°λκΈ°λλ¬Έμ μ°μ μΈμ€ν΄μ€λ₯Ό μ€μ§μν€κ³ μ¬μ€νν λ€ λ€νν μλ²λ₯Ό λμΈ μ μμμ΅λλ€. μμΌλ‘ λ μ΄λ° μΌμ΄ λ°μνμ§ μμ κ²μ΄λΌλ νμ ν μ μμ΅λλ€. μ΄μ λ°λΌ μμκ³ μΈμκ° κ³ μΉλ μ¬μ μΌλ‘, μ΄λ¬ν νμμ λ°©μ§νκ³ μλ²μ μνλ₯Ό μ§μμ μΌλ‘ νμΈνκΈ° μν΄ λͺ¨λν°λ§ ν΄μ λμ
νκΈ°λ‘ νμμ΅λλ€.
λͺ¨λν°λ§ μμ€ν λͺ©μ
μμ μ μΈ μλΉμ€λ₯Ό μν΄μλ λͺ¨λν°λ§ μμ€ν
μ΄ νμμ
λλ€. λͺ¨λν°λ§ νκ²½μ ꡬμΆνλ©΄ μλΉμ€ κΈ°λ₯μ΄ μ μμ μΌλ‘ μλνλμ§, μλ²κ° λ€μ΄λμ§ μμλμ§ λ±μ λͺ¨λν°λ§νκ³ μ₯μ κ° λ°μνλ©΄ μ΄μ λν΄ μΈμ§νκ³ λμ²ν μ μμ΅λλ€. λͺ¨λν°λ§νλ λμμ μ¬λ¬ κ°μ§κ° μμ μ μλλ°, μ ν¬ λͺ¨λ½ νλ‘μ νΈμμλ μλ²μ μνμ μ±λ₯μ λͺ¨λν°λ§νκ³ , μ± μλ²μ λ‘κ·Έμ λν λͺ¨λν°λ§ λ± λ λμμ λν΄ λͺ¨λν°λ§μ μ§ννκ³ μ ν©λλ€.
μν λͺ¨λν°λ§
ν΄λΉ μλ²μ μνκ° μ΄λ€μ§ νμΈν μ μμ΅λλ€. μλ² μνμλ CPU, λ©λͺ¨λ¦¬ μ΄μ©λ₯ λλ μ± μλ²μ DB 컀λ₯μ
μν, μμ±λμ΄μλ μ°λ λ μ, μμ² API λΉλ λ±μ΄ μκ³ μ΄μ κ°μ μλ² μνμ λ©νΈλ¦μ νμΈνκ³ λΆμν μ μμ΅λλ€.
β’
Spring Bootμ λͺ¨λν°λ§κ³Ό κ΄λ¦¬λ₯Ό μν λꡬμ
λλ€. HTTP λλ JMXλ‘ μλν¬μΈνΈλ₯Ό μ€μ νκ³ μ΄ μ 보λ₯Ό κΈ°λ°μΌλ‘ μλ²μ μνλ₯Ό λͺ¨λν°λ§ ν μ μμ΅λλ€. λ©νΈλ¦, ν¬μ€ 체ν¬, DB 컀λ₯μ
μν λ± μμ§μ΄ κ°λ₯ν©λλ€.
β’
κΈ°λ₯μ΄ κ°λ ₯ν λ§νΌ 보μμλ μ κ²½μ μ¨μΌν©λλ€. μλ²μ μνλ₯Ό λλ¬λ΄κΈ° λλ¬Έμ
λλ€. λ©λͺ¨λ¦¬, CPU μν λΏλ§ μλλΌ μ€μ νμΌμ μ λ κ²½λ‘ λ±λ νμΈν μ μμ΄μ μ νμ μΌλ‘ μ 보λ₯Ό μ€νν΄μΌν©λλ€.
β’
μ΄λ²€νΈ λͺ¨λν°λ§ λ° κ²½κ³ μ μ¬μ©λλ μ€ν μμ€ ν΄μ
λλ€. μ μ°ν 쿼리λ₯Ό μ 곡νκ³ , HTTP ν λͺ¨λΈμ μ¬μ©νμ¬ κ΅¬μΆλ μκ³μ΄ λ°μ΄ν°λ² μ΄μ€μ μ€μκ°(κΈ°λ³Έ 15μ΄)μΌλ‘ λ©νΈλ¦μ κΈ°λ‘νκ³ μκ°νκ° κ°λ₯ν©λλ€.
β’
μκ³μ΄ λ°μ΄ν° μκ°ν μ€ν μμ€ ν΄μ
λλ€. prometheus λ‘λ λ³λ ¬μ μΈ μκ°νκ° νλ€κ³ λ€μν μλ£κ° νλ€μ΄ grafana λ₯Ό ν¨κ» μ¬μ©ν©λλ€. μ¬λ¬ DBλ₯Ό μ§μνκ³ , μμ λ‘κ² λμ보λλ₯Ό ꡬμ±ν μ μλλ° λ³΄ν΅ ν
νλ¦Ώμ νμ©ν©λλ€.
μ€νλ§λΆνΈ μ€μ
λ¨Όμ μ± μλ²μ μνλ₯Ό 보μ¬μ£ΌκΈ° μν μ€νλ§λΆνΈ μ€μ μ actuactor μ prometheus λ‘ ν©λλ€.
μμ‘΄μ± μΆκ°
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
Groovy
볡μ¬
μ€νλ§λΆνΈμμ μ¬μ©ν μ μλλ‘ μμ‘΄μ±μ μΆκ°ν΄μ€λλ€.
property μ€μ
management:
endpoints:
web:
exposure:
include: "prometheus"
endpoints:
health:
show-details: always
metrics:
tags:
application: ${spring.application.name}
YAML
볡μ¬
β’
management.endpoints.web.exposure.include
β¦
actuator API μμ λ³΄μ¬ μ€ λ°μ΄ν°μ μΉ΄ν
κ³ λ¦¬λ₯Ό μ§μ ν©λλ€.
β¦
* λ‘ μ€μ νλ©΄ μλ²μ λͺ¨λ μνλ₯Ό 보μ¬μ€ μ μκΈ°λλ¬Έμ λ§€μ° μνν©λλ€.
include λ₯Ό * λ‘ νμ λ
β¦
μμ κ°μ΄ κ°κ°μ μ λ³΄κ° λ΄κΈ΄ λͺ¨λ API λ₯Ό μ€νν©λλ€.
β’
management.metrics.tags.application
β¦
μ΄ν prometheus μμ ꡬλΆν application μ μ΄λ¦μ μ ν©λλ€.
μ΄μΈμλ authorization λ± λ€μν μ€μ μ΄ λ§μ§λ§, νμ¬ WAS μλ²λ private IP λ‘λ§ μ κ·Όμ΄ κ°λ₯νκΈ°λλ¬Έμ μμ κ°μ΄ μ€μ λ§ ν΄λ 보μμ λ¬Έμ κ° μμ΅λλ€.
μΈνλΌ μ€κ³
μ ν¬λ AWS μ t4g.micro λ₯Ό μ΄μ©ν΄μΌ νλ μλ² λ¦¬μμ€ μ νμ΄ μμμ΅λλ€. ν΄λΉ μΈμ€ν΄μ€λ 1GB λ©λͺ¨λ¦¬λ₯Ό κ°μ§κΈ°λλ¬Έμ WAS, prometheus, grafana λ₯Ό λͺ¨λ νλμ μλ²μ λμ°κΈ°λ νλ€μμ΅λλ€. κ·Έλ λ€κ³ WAS, prometheus, grafana λ₯Ό κ°κ°μ μΈμ€ν΄μ€λ‘ λμ°λ κ²λ λΆκ°λ₯νμ΅λλ€. κ·Έ μ΄μ λ‘, νμ©λ μΈλ°μ΄λ κ·μΉμ΄ 8080κ³Ό 8081 ν¬νΈλ°μ μμκΈ° λλ¬Έμ
λλ€. μ΄μ λ°λΌ μ΄ν λ‘κ·Έ λͺ¨λν°λ§ μλ²κΉμ§ κ³ λ €νμ¬ μ€κ³ν μν λͺ¨λν°λ§ μΈμ€ν΄μ€ ꡬ쑰λ λ€μκ³Ό κ°μ΅λλ€.
β’
WASλ ν
μ€νΈμ© 8081 ν¬νΈλ‘ μ€ννμμ΅λλ€. ν΄λΉ ν¬νΈλ μΈλ°μ΄λ κ·μΉμ μλ°°λμ§ μμ actuator λ₯Ό ν΄λΉ ν¬νΈλ‘ μ΄μ©νκΈ°λ‘ νμμ΅λλ€.
β’
prometheus λ 8080 μΌλ‘ μ€ννμμ΅λλ€. νμ¬λ μλ²κ° μ λμνλμ§ νμΈνκΈ° μν΄ 8080 μΌλ‘ μ€ννμκ³ , μΆν λ‘κ·Έ λͺ¨λν°λ§λ ν¬νΈλ₯Ό λ°κΏ μμ μ
λλ€.
β’
grafana λ μκ°ν ν΄μ΄κΈ°λλ¬Έμ, νμΈμ© μ΄μΈμλ μ§μμ μΌλ‘ μ μμ΄ κ°λ₯ν΄μΌ ν©λλ€. μ΄μ λ°λΌ 8081 ν¬νΈλ‘ μ€νμμΌ μΈλ°μ΄λ κ·μΉμ μλ°°λμ§ μκ² μ¬μ©ν μ μλλ‘ νμμ΅λλ€.
Prometheus μ€μΉ
λͺ¨λν°λ§ μλ²λ₯Ό λμΈ μΈμ€ν΄μ€λ‘ μ μνμ¬ prometheus λ₯Ό μ€μΉνκ³ μλ²λ₯Ό μ€νν©λλ€.
wget https://github.com/prometheus/prometheus/releases/download/v2.37.1/prometheus-2.37.1.linux-arm64.tar.gz
tar -xvf prometheus-2.37.1.linux-arm64.tar.gz
Shell
볡μ¬
wget λͺ
λ Ήμ΄λ web-get μ μ€μλ§μ΄κ³ , web μμ λ€μ΄λ‘λ ν λ μ¬μ©λλ λͺ
λ Ήμ΄μ
λλ€.
2022-09-23 κΈ°μ€Β LTS λ²μ μΈ 2.37.1 λ²μ μ 리λ
μ€ arm64 λ²μ μ λ€μ΄λ°μμ΅λλ€. λΉμ°ν λ§μ΄μ§λ§, μΈμ€ν΄μ€μ OS λ²μ μ λ§κ² μ λ€μ΄λ‘λν΄μΌ μ€νμ΄ κ°λ₯ν©λλ€. μ²μμλ μ무 μκ°μμ΄ freebsd λ²μ μ λ€μ΄ λ°μλ€κ° κ³ μνμ΅λλ€. λ€μ΄λ‘λν νμΌμ tar λͺ
λ Ήμ΄λ‘ μμΆμ νμ΄μ£Όλ©΄ prometheus-2.37.1.linux-arm64 λΌλ λ€μ΄λ‘λν λ²μ μ΄λ¦μ ν΄λκ° μμ±λ©λλ€.
Prometheus μ€μ
μμΆμ νΌ prometheus-2.37.1.linux-arm64 ν΄λμμ vi λͺ
λ Ήμ΄λ‘ prometheus.yml νμΌμ μμ ν©λλ€.
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:8080"]
- job_name: "springboot"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["{WAS IP}:{WAS PORT}"]
YAML
볡μ¬
β’
interval: 15s
β¦
λμ μλ²μμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μκ° κ°κ²©μ μ μν©λλ€. κΈ°λ³Έκ°μΈ 15μ΄λ₯Ό κ·Έλλ‘ μ¬μ©ν΄ μ£Όμμ΅λλ€.
β’
alert λ λ°λ‘ μ¬μ©νμ§ μκΈ°μ, λΉ κ°μΌλ‘ λμμ΅λλ€.
β’
job_name: prometheus(localhost:8080)
β¦
prometheus μμ μ체μ μΌλ‘ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ job μ
λλ€.
β¦
ν΄λΉ ν¬νΈμμ prometheus μλ²μ μν, κ·Έλν λ±μ νμΈν μ μμ΅λλ€.
β¦
ν΄λΉ νμ΄μ§λ grafana λ₯Ό λμ
νλ©΄ μ¬μ©ν μΌμ΄ λλ¬ΌκΈ°λλ¬Έμ μ΄νμ κΈ°λ³Έκ°(9090)μΌλ‘ λ³κ²½ν μμ μ
λλ€.
β’
job_name: springboot
β¦
WAS μ actuator μ μλ prometheus μ μ 보λ₯Ό μ»κΈ° μν΄ job μ μΆκ°νμμ΅λλ€.
β¦
metrics_path μλ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μλ²μ λ°μ΄ν°κ° μλ endpoint λ₯Ό μ€μ ν©λλ€.
β¦
target μλ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μλ²μ IP μ ν¬νΈλ₯Ό μ€μ ν©λλ€.
Prometheus μ€ν
sudo nohup ./prometheus --web.listen-address=:8080 &
Shell
볡μ¬
nohup λͺ
λ Ήμ΄λ‘ μ€ννμ¬ λ°±κ·ΈλΌμ΄λλ‘ μ€ννμμ΅λλ€. μ΄μ ν¨κ» ν¬νΈλ₯Ό μ€μ νκΈ° μν΄ --web.listen-address μ΅μ
μΌλ‘ 8080μ μ€μ νκ³ μλ²λ₯Ό μ€νν©λλ€.
μλ²λ₯Ό μ€νν ν ν΄λΉ μΈμ€ν΄μ€μ 8080 ν¬νΈλ‘ μ μνλ©΄ λ€μκ³Ό κ°μ νλ©΄μ λ³Ό μ μμ΅λλ€. νμ¬λ prometheus μλ²κ° μ μ€νλμλμ§ νμΈνκΈ° μν μ©λμ΄κ³ , μ΄νμ μ΄ νμ΄μ§λ μ¬μ©νμ§ μμ μμ μ
λλ€. status - targets μμ target μΌλ‘ μ€μ ν μΉμ±μλ²μ health μνλ₯Ό νμΈν μ μμ΅λλ€.
μ°μΈ‘μ μ§κ΅¬λ³Έ λͺ¨μμ λλ₯΄λ©΄ μ¬μ© κ°λ₯ν 쿼리λ€μ λ³Ό μ μμ΅λλ€. κ°λ¨νκ² μ΄μμλ μ°λ λ κ°μ 쿼리λ₯Ό μ€ν(Execute)νκ³ Graph λ₯Ό 보면 μκ°νλ μλ£λ₯Ό νμΈν μ μμ΅λλ€. νμ§λ§ prometheus μμλ μμ κ°μ΄ λ¨νΈμ μΈ κ·Έλν μλ£λ°μ νμΈν μ μμ΅λλ€. μ΄μ λ°λΌ λ€μνκ³ μΈλΆνλ κ·Έλνλ₯Ό μν΄ μκ°ν μ μ© ν΄μΈ Grafana λ₯Ό μ¬μ©νκ³ μ ν©λλ€.
Grafana μ€μΉ
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.1.5.linux-arm64.tar.gz
tar -zxvf grafana-enterprise-9.1.5.linux-arm64.tar.gz
Shell
볡μ¬
μ€μΉ λ°©μμ μμ prometheus μ μ μ¬ν©λλ€.
Grafana μ€μ
Grafana μμ 보μκ·Έλ£Ήλλ¬Έμ κΈ°λ³Έ ν¬νΈ(3100) λμ 8081 ν¬νΈλ‘ λ³κ²½νμ΅λλ€. λ€μ΄λ°μ ν΄λμ conf/defaults.ini νμΌμμ ν¬νΈλ₯Ό μ€μ ν μ μμ΅λλ€.
# The http port to use
http_port = 8081
Shell
볡μ¬
Grafana μ€ν
cd bin
sudo nohup ./grafana-server &
Shell
볡μ¬
grafana μμ nohup λͺ
λ Ήμ΄λ‘ μ€ννμμ΅λλ€. μλ²λ₯Ό μ€νμν¨ ν ν΄λΉ μΈμ€ν΄μ€μ 8081 ν¬νΈλ‘ μ μν©λλ€. κ·Έλ¬λ©΄ λ‘κ·ΈμΈ νλ©΄μ΄ λμ€λλ°, μ΄κΈ° μμ΄λμ λΉλ°λ²νΈλ admin/admin μ
λλ€. ν΄λΉ μ 보λ μ€μ νμΌμμ λ³κ²½ν μ μμ΅λλ€.
μ μμ νλ©΄ data source λ₯Ό μΆκ°ν μ μμ΅λλ€. μμ μ€μ ν prometheus λ₯Ό μΆκ°ν΄μ€λλ€.
URL μ λ°μ΄ν°λ₯Ό λ°μμ¬ url μ κΈ°μ
ν©λλ€. νμ¬ prometheus μ grafana κ° κ°μ μΈμ€ν΄μ€μ μκ³ , prometheus λ₯Ό 8080 ν¬νΈλ‘ μ€ννμκΈ°λλ¬Έμ URL μ localhost:8080 μ λ£μμ΅λλ€. λλ¨Έμ§λ κΈ°λ³ΈμΌλ‘ λκ³ save νμμ΅λλ€.
dashboard λ‘ μκ°ννκΈ° μν΄ add a new panel μ ν΄λ¦ν©λλ€.
metric μ μ 곡λλ 쿼리 μ€ μνλ 쿼리λ₯Ό ν΄λ¦νκ³ run queries λ₯Ό λλ₯΄λ©΄ κ·Έλνλ₯Ό νμΈν μ μμ΅λλ€. Grafana μμλ λ¨μν νλμ λ°μ΄ν°λ₯Ό κ·Έλνλ‘ λ³Ό μ μμ λΏλ§ μλλΌ μ¬λ¬ 쿼리λ₯Ό λͺ¨μ λ€μνκ³ νλΆν μκ°μ μλ£λ₯Ό νμΈν μ μμ΅λλ€. κ·Έλ¦¬κ³ μ¬μ©μλ₯Ό μν΄ μ¬λ¬ 쿼리λ€μ λ€μν μκ° μλ£λ‘ 보μ¬μ£Όλ ν
νλ¦Ώλ μ 곡ν©λλ€.
μ ν¬ λͺ¨λ½μ μμ template μ μ μ©νμκ³ , json μ download λ°μ import νμμ΅λλ€. json μ΄μΈμλ, ν΄λΉ template μ ID λ₯Ό clipboard μ μ μ₯νκ³ Import via grafana.com μμ id λ₯Ό λΆμ¬λ£κ³ load νλ©΄ import κ° κ°λ₯ν©λλ€.
νμ¬ Prometheus μ Grafana λ₯Ό μ μ©ν μνμ
λλ€.
ν΄λΉ ν
νλ¦Ώμμλ CPU, λ©λͺ¨λ¦¬ μ¬μ©μ¨, JVM λ©λͺ¨λ¦¬ μ¬μ© νν©, μ°λ λ κ°μ, μμ² API λΉλ, DB 컀λ₯μ
κ°μ λ±μ μμΈνκ² νμΈν μ μμ΅λλ€.
λ‘κ·Έ λͺ¨λν°λ§ κ΅¬μΆ λ΄μ©μ λ€μ νμ΄μ§μμ λ§μ μ§ννκ² μ΅λλ€.