2023. 5. 18. 10:07ใ์ธํ๋ฐ/์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ
์ ๋ฒ ๊ธ์์ ์คํ๋ง ๋ถํธ์์ ๋ชจ๋ํฐ๋งํ ๋ ์ง์ํ๋ ํด์ธ ํ๋ก๋ฉํ ์ฐ์ค์ ๊ทธ๋ผํ๋์ ๋ํ ๊ฐ๋ ? ์ ๋ ์์๋ดค๋ค.
์ด๋ฒ ๊ธ์์๋ ํ๋ก๋ฉํ ์ฐ์ค ๋จผ์ ์ค์นํ๊ณ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ์์ ์ด๋ค.
1๏ธโฃ ํ๋ก๋ฉํ ์ฐ์ค ์ค์น
๋จผ์ ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ค์น๋ถํฐ ์งํํด์ผํ๋ค. (๋น์ฐํจ)
https://prometheus.io/download/
์์ ๋งํฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ์
๊ฐ์์ ์ด์ํ๊ฒฝ์ ๋ง๋ ํ์ผ์ ์ ํํด ๋ค์ด๋ฐ๊ณ ์์ถ ํด์ ํด์ฃผ๋ฉด ๋๋ค. (mac์ darwin ์ด๋ผ๊ณ ์ ํ ์์ถํ์ผ ๋ค์ด)
์์ถ ํ์ผ์ ๋ค์ด๋ฐ์ ํด์ ํ ๋ค์ prometheus.exe ๋ฅผ ์คํํ๋ฉด ๋๋๋ฐ
์ฒ์์๋
์ด๋ฐ ํ๋ฉด์ ๋ณผ ์ ์๋๋ฐ ์ฌ๊ธฐ์ '์ถ๊ฐ ์ ๋ณด' ๋ฅผ ํด๋ฆญํ ๋ค์์ '์คํ' ๋ฒํผ ํด๋ฆญํด์ฃผ๋ฉด ๋๋ค.
(์์ง ๋งฅ๋ถ์์๋ ์ค์น๋ฅผ ํด๋ณด์ง ์์์ ์ค์นํ๊ฒ ๋๋ค๋ฉด ์ ๋ณด ์ถ๊ฐ ์์ )
์คํํ ๋ค์ localhost:9090 (๊ธฐ๋ณธ ํฌํธ 9090) ํด์ ํ๋ก๋ฉํ ์ฐ์ค ์คํ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
2๏ธโฃ ํ๋ก๋ฉํ ์ฐ์ค ์ค์
ํ๋ก๋ฉํ ์ฐ์ค๋ ๋ฉํธ๋ฆญ์ ์์งํ๊ณ ๋ณด๊ดํ๋ DB์ด๋ค.
ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ์คํ๋ง๊ณผ ์ฐ๋ํ๊ธฐ ์ํด์๋ 2๊ฐ์ง ์ค์ ์ ํด์ค์ผ ํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ค์ : ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉํธ๋ฆญ์ ๊ฐ์ ธ๊ฐ ์ ์๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ๋ก๋ฉํ ์ฐ์ค ํฌ๋งท์ ๋ง์ถ์ด ๋ฉํธ๋ฆญ ๋ง๋ค๊ธฐ
- ํ๋ก๋ฉํ ์ฐ์ค ์ค์ : ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉํธ๋ฆญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์์งํ๋๋ก ์ค์
์ ํ๋ฆฌ์ผ์ด์ ์ค์
: ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉํธ๋ฆญ์ ๊ฐ์ ธ๊ฐ๋ ค๋ฉด ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ฌ์ฉํ๋ ํฌ๋งท์ ๋ง์ถ์ด ๋ฉํธ๋ฆญ์ ๋ง๋ค์ด์ผ ํ๋ค.
์คํ๋ง์์ ์ก์ธ์์ดํฐ๋ฅผ ํตํด ๋ฉํธ๋ฆญ์ ๋ณด๋ฉด (/actuator/metrics) json ํํ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทผ๋ฐ ํ๋ก๋ฉํ ์ฐ์ค๋ json ํํ๋ฅผ ์์๋ณผ ์ ์๊ณ , ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ฌ์ฉํ๋ ํฌ๋งท๋ง ์์๋ณผ ์ ์๋ค.
-> ์ด๋ฐ ๋ฌธ์ ๋ ๋ง์ดํฌ๋ก๋ฏธํฐ๊ฐ ํด๊ฒฐํด์ค๋ค.
๋ง์ดํฌ๋ก๋ฏธํฐ๋ ํฌ๋งท์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๋๋ฐ ์คํ๋ง ์ก์ธ์์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์ดํฌ๋ก๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ,
๊ฐ๊ฐ์ ๋ฉํธ๋ฆญ๋ค์ ๋ด๋ถ์์ ๋ง์ดํฌ๋ก๋ฏธํฐ ํ์ค ๋ฐฉ์์ผ๋ก ์ธก์ ๋๊ณ ์๋ค.
๋ฐ๋ผ์ ๊ทธ๋ฅ ์ด๋ค ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ์ง๋ง ๊ฒฐ์ ํด์ฃผ๋ฉด ๋๋ค.
build.gradle
implementation 'io.micrometer:micrometer-registry-prometheus'
build.gradle์ ๋ง์ดํฌ๋ก๋ฏธํฐ ํ๋ก๋ฉํ ์ฐ์ค ๊ตฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ์คํ๋ง ๋ถํธ์ ์ก์ธ์์ดํฐ๊ฐ ์๋์ผ๋ก ๋ง์ดํฌ๋ก๋ฏธํฐ ํ๋ก๋ฉํ ์ฐ์ค ๊ตฌํ์ฒด๋ฅผ ๋ฑ๋กํด์ ๋์ํ๋๋ก ์ค์ ํด์ค๋ค.
gradle refresh ํด์ค ๋ค์์ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์คํํ ๋ค์, localhost:8080/actuator ๋ฅผ ๋ณด๋ฉด
ํ๋ก๋ฉํ ์ฐ์ค ์ค๋ํฌ์ธํธ๊ฐ ์๋์ผ๋ก ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
http://localhost:8080/actuator/prometheus
์ด๋ฐ์์ผ๋ก ๋ชจ๋ ๋ฉํธ๋ฆญ๋ค์ด ํ๋ก๋ฉํ ์ฐ์ค ํฌ๋งท์ผ๋ก ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
* ํ๋ก๋ฉํ ์ฐ์ค ํฌ๋งท
์ด๋ ๊ฒ ํ๋ก๋ฉํ ์ฐ์ค ํฌ๋งท์ ๋ณด๋ฉด jvm_info ๋ก . ๋์ ์ _ ํฌ๋งท์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ jvm.info ๊ฐ jvm_info ๋ก ๋ณํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ http.server.requests๊ฐ ํ๋ก๋ฉํ ์ฐ์ค ํฌ๋งท์์๋ http_server_requests_seconds_count(์์ฒญ ์), http_server_request_seconds_sum(์๊ฐ ํฉ, ์์ฒญ์์ ์๊ฐ์ ํฉํจ), http_server_request_seconds_max(์ต๋ ์๊ฐ, ์์ฒญ ์ค ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฐ ์์ฒญ ์ ) ๋ก 3๊ฐ์ง๋ก ๋ถ๋ฆฌ๋๋ค.
ํ๋ก๋ฉํ ์ฐ์ค ์ค์
์ ํ๋ฆฌ์ผ์ด์ ์ค์ ์ ํ ๋ค์์๋ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ด ๋ฉํธ๋ฆญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์์งํ ์ ์๋๋ก ์ค์ ํด์ผ ํ๋ค.
prometheus.yml
ํ๋ก๋ฉํ ์ฐ์ค ์คํ ํด๋์ ๋ณด๋ฉด prometheus.yml ์ด ์๋๋ฐ ์ฌ๊ธฐ์
์ด ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ค๋ค. (์ด๋ ๋์ด์ฐ๊ธฐ ์ฃผ์..!!!!)
ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ /actuator/prometheus ๋ฅผ ํธ์ถํด์ ๋ฉํธ๋ฆญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์์งํด ๊ฐ ์ ์๋๋ก ์ค์ ํ๋๊ฑด๋ฐ
job_name : ์์งํ๋ ์ด๋ฆ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ์ด๋ฆ์ด๋ค.
metrics_path : ์์งํ ๊ฒฝ๋ก๋ฅผ ์ง์
scrape_interval : ์์งํ ์ฃผ๊ธฐ๋ฅผ ์ง์
targets : ์์งํ ์๋ฒ์ IP, PORT ์ง์
์ด๋ ๊ฒ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ํ๋ก๋ฉํ ์ฐ์ค๊ฐ http://localhost:8080/actuator/promethous ๋ฅผ 1์ด์ ํ๋ฒ์ฉ ํธ์ถํด์ ๋ฉํธ๋ฆญ์ ์์งํด์จ๋ค.
โ ์ฃผ์
scrape_interval ์ ์ง๊ธ์ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ํ์ธํ๊ธฐ ์ํด์ 1s ์ฆ, 1์ด๋ก ์ค์ ํด ํ์ธํ์ง๋ง, ์์ง ์ฃผ๊ธฐ์ ๊ธฐ๋ณธ์ 1m ์ด๋ค.
์์ง ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ์งง๊ฒ ์ค์ ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ ์ด์์์๋ 10s ~ 1m ์ ๋๋ฅผ ๊ถ์ฅํ๋ค. ( ์ด๊ฒ๋ ๊ถ์ฅ์ด๋๊น ์์คํ ํ๊ฒฝ์ ๊ณ ๋ คํด์ ์ค์ ํ๊ธฐ)
yml ์ค์ ์ ๋๋ธ ๋ค์์ ์ ์ฅํ๊ณ ๋ค์ ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ์คํํ๋ฉด ๋๋ค.
localhost:9090 ์ผ๋ก ํ๋ก๋ฉํ ์ฐ์ค ํ๋ฉด์์ status -> targets ์ ๋ณด๋ฉด ์ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
http://localhost:9090/metrics
-> ํ๋ก๋ฉํ ์ฐ์ค ์์ฒด์์ ์ ๊ณตํ๋ ๋ฉํธ๋ฆญ์ผ๋ก ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์์ ์ ๋ฉํธ๋ฆญ์ ํ์ธํ๋ ๊ฒ์ด๋ค.
http://localhost:9090/spring-actuator
-> ์ ํ๋ฆฌ์ผ์ด์ ๋ฉํธ๋ฆญ ์ ๋ณด
-> State๊ฐ up์ด๋ฉด ์ ์์ด๊ณ , down ์ด๋ฉด ์ฐ๋์ด ์๋์ด ์๋ ๊ฒ์ด๋ค.
ํ๋ก๋ฉํ ์ฐ์ค ๋ฐ์ดํฐ ์กฐํ๋ ์ ๊ฒ์์ฐฝ์ ๋ฉํธ๋ฆญ์ ๊ฒ์ํด์ ์กฐํํ ์ ์๋ค.
3๏ธโฃ ํ๋ก๋ฉํ ์ฐ์ค ๊ธฐ๋ณธ ๊ธฐ๋ฅ
* ๊ธฐ๋ณธ ์กฐํ
์์ ๊ธฐ๋ณธ ํ๋ฉด์์ http_server_requests_seconds_count ๋ฅผ ์ ๋ ฅํ๊ณ ์คํํด๋ณด๋ฉด
์์งํ๊ณ ์๋ ๋ฉํธ๋ฆญ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค.
๊ตต์ ๊ธ์จ๋ก error, exceptioni, instance, job, method, outcome, status, uri๋ ๊ฐ๊ฐ ๋ฉํธ๋ฆญ ์ ๋ณด๋ฅผ ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ ํ๊ทธ๋ก
๋ง์ดํฌ๋ก๋ฏธํฐ์์๋ ํ๊ทธTag, ํ๋ก๋ฉํ ์ฐ์ค์์๋ ๋ ์ด๋ธLabel ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฆฌ๊ณ ๋งจ ์ค๋ฅธ์ชฝ์ ์ซ์๊ฐ ๋ฉํธ๋ฆญ ๊ฐ์ด๋ค.
๊ทธ๋ฆฌ๊ณ Graph ํญ์ ํด๋ฆญํ๋ฉด
๋ฉํธ๋ฆญ ๊ฐ์ ๊ทธ๋ํ๋ก ์กฐํํ ์ ๋ ์๋ค.
* ํํฐ
์กฐํํ ๋ ๋ ์ด๋ธ(ํ๊ทธ)๋ฅผ ๊ธฐ์ค์ผ๋ก ํํฐ๋ฅผ ์ฌ์ฉํด์ ์กฐํํ ์ ์๋ค.
์ด๋ ํํฐ๋ {} ์ค๊ดํธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค.
= ์ ๊ณต๋ ๋ฌธ์์ด๊ณผ ์ ํํ ์ผ์นํ๋ ๋ ์ด๋ธ ์ ํ
!= ์ ๊ณต๋ ๋ฌธ์์ด๊ณผ ์ผ์นํ์ง ์๋ ๋ ์ด๋ธ ์ ํ
=~ ์ ๊ณต๋ ๋ฌธ์์ด๊ณผ ์ ๊ท์ ์ผ์นํ๋ ๋ ์ด๋ธ ์ ํ
!~ ์ ๊ณต๋ ๋ฌธ์์ด๊ณผ ์ ๊ท์ ์ผ์นํ์ง ์๋ ๋ ์ด๋ธ ์ ํ
http_server_requests_seconds_count{uri="/log", method="GET"}
uri=/log, method= GET ์ธ ์กฐ๊ฑด์ผ๋ก ์กฐํ
http_server_requests_seconds_count{uri!="/actuator/prometheus"}
uri != ๋ฅผ ์ฌ์ฉํด์ /actuator/prometheus ๋ฅผ ์ ์ธํ ์กฐ๊ฑด์ผ๋ก ์กฐํํ๋ค.
http_server_requests_seconds_count{method=~"GET|POST"}
http_server_requests_seconds_count{uri!~"/actuator.*"}
* ์ฐ์ฐ์ ์ฟผ๋ฆฌ์ ํจ์
+ (๋ง์ ), - (๋บ์ ), * (๊ณฑ์ ) , / (๋ถํ ) , % (๋ชจ๋๋ก) , ^ (์น์/์ง์) ์ฐ์ฐ์ ์ง์
sum : ํฉ๊ณ
sum(http_server_requests_seconds_count)
sum by(method, status) (http_server_request_seconds_count)
count : ๋ฉํธ๋ฆญ ์์ฒด ์ ์นด์ดํธ
count(http_server_requests_seconds_count)
topk : ์์ 3๊ฐ ๋ฉํธ๋ฆญ
topk(3, http_server_requests_seconds_count)
์คํ์ ์์ ์ : ํ์ฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํน์ ๊ณผ๊ฑฐ ์์ ๋ฐ์ดํฐ ๋ฐํ
http_server_requests_seconds_count offset 10m
๋ฒ์ ๋ฐฑํฐ ์ ํ๊ธฐ : ๋ง์ง๋ง์ [1m], [60s]์ ๊ฐ์ด ํํํ๋ ๊ฒ์ผ๋ก ์ง๋ 1๋ถ๊ฐ์ ๋ชจ๋ ๊ธฐ๋ก๊ฐ์ ์ ํํ๋ค.
http_server_requests_seconds_count[1m]
4๏ธโฃ ๊ฒ์ด์ง Gauge, ์นด์ดํฐ Counter
* ๊ฒ์ด์ง Gauge
: ๊ฒ์ด์ง๋ ์ค๋ฅด๊ณ ๋ด๋ฆฌ๊ณ ํ๋ ๊ฐ์ผ๋ก CPU ์ฌ์ฉ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์ฌ์ฉ์ค์ธ ์ปค๋ฅ์ ์ ๋ฑ์ด ์๋ค.
๊ฒ์ด์ง๋ ํ์ฌ ์ํ๋ฅผ ๊ทธ๋๋ก ์ถ๋ ฅํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
system_cpu_usage
* ์นด์ดํฐ Counter
: ์นด์ดํฐ๋ ๋จ์ํ๊ฒ ์ฆ๊ฐํ๋ ๋จ์ผ ๋์ ๊ฐ์ผ๋ก HTTP ์์ฒญ ์, ๋ก๊ทธ ๋ฐ์ ์ ๋ฑ์ด ์๋ค.
http_server_requests_seconds_count{uri="/log"}
uri= /log HTTP ์์ฒญ ๋ฉํธ๋ฆญ์ ๊ทธ๋ํ๋ก ์กฐํํ๋ ๊ฒ์ธ๋ฐ ์นด์ดํฐ๋ ๊ณ์ ๋์ ํด์ ์ฆ๊ฐํ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ๊ณ์ ์ฆ๊ฐํ๋ ๊ทธ๋ํ๋ง ๋ณด๊ฒ ๋๋ค.
์ด ๊ทธ๋ํ๋ง ๋ณด๋ฉด ์ธ์ ๊ณ ๊ฐ์ ์์ฒญ์ด ๋ง์๊ณ ์์๋์ง ํ์ ํ๊ธฐ ์ด๋ ต๋ค.
-> ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด increase(), rate() ๋ฑ์ ์ง์ํ๋ค.
increase()
: ์ง์ ํ ์๊ฐ ๋จ์๋ณ๋ก ์ฆ๊ฐ๋ฅผ ํ์ธํ ์ ์๋ค .
ex) increase(http_server_requests_seconds_count{uri="/log"}[1m])
increase(๋ฉํธ๋ฆญ, [์๊ฐ]) [์๊ฐ] ์ ์ฌ์ฉํด์ ๋ฒ์ ๋ฒกํฐ๋ฅผ ์ ํํด์ค์ผ ํ๋ค.
rate()
: ๋ฒ์ ๋ฒกํฐ์์ ์ด๋น ํ๊ท ์ฆ๊ฐ์จ์ ๊ณ์ฐํ๋ค.
increase๊ฐ ์ซ์๋ฅผ ์ง์ ์นด์ดํธํ๋ ๊ฒ์ด๋ผ๋ฉด rate()๋ ์ด๋น ํ๊ท ์ ๋๋์ด์ ๊ณ์ฐํ๋ค.
irate()
: ๋ฒ์ ๋ฒกํฐ์์ ์ด๋น ์๊ฐ ์ฆ๊ฐ์จ์ ๊ณ์ฐํ๋ค.
๐พ ๊ฒ์ด์ง๋ ๊ฐ์ด ๊ณ์ ๋ณํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ๊ฐ์ ๊ทธ๋๋ก ๊ทธ๋ํ๋ก ํํํด์ฃผ๋ฉด ๋์ง๋ง ์นด์ดํฐ๋ ๊ณ์ ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ increase(), rate() ๋ฑ์ ์ฌ์ฉํด์ ํํํ๋ฉด ๋๋ค.