๐Ÿ“š ๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ(Micrometer), ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค(Prometheus), ๊ทธ๋ผํŒŒ๋‚˜(Grafana)

CodeByHanยท2025๋…„ 4์›” 6์ผ

์Šคํ”„๋ง

๋ชฉ๋ก ๋ณด๊ธฐ
19/33

์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ, ์ปค๋„ฅ์…˜ ์‚ฌ์šฉ, ๊ณ ๊ฐ ์š”์ฒญ์ˆ˜์™€ ๊น‰์€ ์ˆ˜ ๋งŽ์€ ์ง€ํ‘œ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์•ผ ์–ด๋””์— ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์‚ฌ์ „์— ๋Œ€์ฒ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ๋ฌธ์ œ ํŒŒ์•…์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ€๋“ ์ฐผ๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ์™€ ๊ด€๋ จ์žˆ๋Š” ๊ณณ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์„œ ๋Œ€์‘ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ“Œ ๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ(Micrometer)

์„ธ์ƒ์—๋Š” ์ˆ˜ ๋งŽ์€ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด(๊ทธ๋ผํŒŒ๋‚˜, ํ•€ํฌ์ธํŠธ)์ด ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ค‘๊ฐ„์— ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ƒ๋‹นํžˆ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ๋ถˆํŽธํ•ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ(Micrometer)๋‹ค.

๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด
AppOptics, Atlas, CloudWatch, Datadog, Dynatrace, Elastic, Ganglia, Graphite, Humio, Influx, Instana, JMX, KairosDB, New Relic, Prometheus, SignalFx, Stackdriver, StatsD, Wavefront

๋ฉ”ํŠธ๋ฆญ(Metric)

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ , CPU ์‚ฌ์šฉ๋ฅ , ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ๋ฅ  ๋“ฑ๋“ฑ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์ถ”์ด๋ฅผ ์ถ”์ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•œ๋‹ค.
  • ์Šคํ”„๋ง ๋ถ€ํŠธ ์•ก์ถ”์—์ดํ„ฐ๋Š” ๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ง€ํ‘œ ์ˆ˜์ง‘์„ @AutoConfiguration ๋ฅผ ํ†ตํ•ด ์ž๋™ ๋“ฑ๋ก ํ•ด์ค€๋‹ค.
  • metrics ์—”๋“œํฌ์ธํŠธ
    metrics ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ๋“ค์„ ํ™•์ธ ๊ฐ€๋Šฅ
    http://localhost:8080/actuator/metrics
    metrics ์—”๋“œํฌ์ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ๋” ์ž์„ธํžˆ ํ™•์ธ ๊ฐ€๋Šฅ
    http://localhost:8080/actuator/metrics/{name}

๐Ÿค” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ
์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”ํŠธ๋ฆญ์„ ์ •์˜ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ๋ฌธ์ˆ˜, ์ทจ์†Œ์ˆ˜๋ฅผ ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค(Prometheus)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ทธ ์ˆœ๊ฐ„๋งŒ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณผ๊ฑฐ ์ด๋ ฅ๊นŒ์ง€ ํ•จ๊ป˜ ํ™•์ธํ•˜๋ ค๋ฉด ๋ฉ”ํŠธ๋ฆญ์„ ๋ณด๊ด€ํ•˜๋Š” DB๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋””์„ ๊ฐ€ ๋ฉ”ํŠธ๋ฆญ์„ ์ง€์†ํ•ด์„œ ์ˆ˜์ง‘ํ•˜๊ณ  DB์— ์ €์žฅํ•ด์•ผํ•œ๋‹ค. ์ด ์—ญํ• ์„ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค(Prometheus)๊ฐ€ ์ˆ˜ํ–‰ ํ•œ๋‹ค.

์„ค์น˜
https://github.com/prometheus/prometheus/releases/download/v2.42.0/

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •

1) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฐ€์ ธ๊ฐ€๋ ค๋ฉด ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํฌ์ผ“์— ๋งž์ถ”์–ด ๋ฉ”ํŠธ๋ฆญ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋Š” ํฌ๋ฉง(JSON)์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ๊ฐ€ ์ด๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.

build.gradle

implementation 'io.micrometer:micrometer-registry-prometheus'
  • ์•ก์ถ”์—์ดํ„ฐ์— ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.
    /actuator/prometheus -> ์ž๋™์œผ๋กœ ์ถ”๊ฐ€
    http://localhost:8080/actuator/prometheus

2) ์ˆ˜์ง‘ ์„ค์ •

  • ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ํด๋”์— ์žˆ๋Š” prometheus.yml ํŒŒ์ผ ์ˆ˜์ •, #์ถ”๊ฐ€ ๋ถ€๋ถ„๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค.

prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

rule_files:

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
  # ์ถ”๊ฐ€
  - job_name: "spring-actuator"
    metrics_path: '/actuator/prometheus'
    scrape_interval: 1s
    static_configs:
      - targets: ['localhost:8080']
  • ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋Š” http://localhost:8080/actuator/prometheus๋ฅผ 1์ดˆ์”ฉ ํ˜ธ์ถœํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•œ๋‹ค.
  • ๋„ˆ๋ฌด ์ˆ˜์ง‘ ์ฃผ๊ธฐ๊ฐ€ ๋น ๋ฅธ ๊ฒƒ๊ฐ™์œผ๋ฉด ์กฐ์ •ํ•˜๋ฉด ๋œ๋‹ค.

3) ํ™•์ธ

3-1) http://localhost:9090 ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ์ž‘๋™ ํ™•์ธ

3-2) prometheus.yml ํ™•์ธ

  • Status -> Configuration

3-3) ์—ฐ๋™ ํ™•์ธ

  • Status -> Targets

  • State๊ฐ€ UP์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉด ์ •์ƒ์ด๊ณ , DOWN ์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉด ์—ฐ๋™ ์„ฑ๊ณต

  • prometheus : ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ์ž์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ์ •๋ณด

  • spring-actuator : ์šฐ๋ฆฌ๊ฐ€ ์—ฐ๋™ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”ํŠธ๋ฆญ ์ •๋ณด

    โ—๏ธ ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„๊ฐ€ ๋Œ์•„๊ฐ€์•ผ์ง€ ์—ฐ๋™์ด ๋œ๋‹ค.

3-4) ๊ฐ„๋‹จํ•œ ๋ฉ”ํŠธ๋ฆญ ์กฐํšŒ

jvm_info

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค - ๊ธฐ๋ณธ ๊ธฐ๋Šฅ

http_server_requests_seconds_count

  • ๋์— ์ˆซ์ž๋Š” ํ•ด๋‹น ๋ฉ”ํŠธ๋ฆญ ๊ฐ’, uri="/actuator/prometheus" ๋Š” 1์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ด์„œ ์ˆซ์ž๊ฐ€ ํฐ ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Table -> Evaluation time ์„ ์ˆ˜์ •ํ•ด์„œ ๊ณผ๊ฑฐ ์‹œ๊ฐ„ ์กฐํšŒ ๊ฐ€๋Šฅ

  • Graph : ๋ฉ”ํŠธ๋ฆญ์„ ๊ทธ๋ž˜ํ”„๋กœ ์กฐํšŒ ๊ฐ€๋Šฅ

ํ•„ํ„ฐ

  • ๋ ˆ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    = : ์ œ๊ณต๋œ ๋ฌธ์ž์—ด๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ ˆ์ด๋ธ” ์„ ํƒ
    != : ์ œ๊ณต๋œ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์ง€ ์•Š์€ ๋ ˆ์ด๋ธ” ์„ ํƒ
    =~ : ์ œ๊ณต๋œ ๋ฌธ์ž์—ด๊ณผ ์ •๊ทœ์‹ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ด๋ธ” ์„ ํƒ
    !~ : ์ œ๊ณต๋œ ๋ฌธ์ž์—ด๊ณผ ์ •๊ทœ์‹ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ ˆ์ด๋ธ” ์„ ํƒ
  • ์˜ˆ์‹œ) uri=/log , method=GET ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ http_server_requests_seconds_count{uri="/log", method="GET"}

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค - ๊ฒŒ์ด์ง€์™€ ์นด์šดํ„ฐ

1) ๊ฒŒ์ด์ง€(Gauge)

  • ์ž„์˜๋กœ ์˜ค๋ฅด๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฐ’
    ์—์‹œ) CPU ์‚ฌ์šฉ๋Ÿ‰, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ์‚ฌ์šฉ์ค‘์ธ ์ปค๋„ฅ์…˜

system_cpu_usage

2) ์นด์šดํ„ฐ(Counter)

  • ๋‹จ์ˆœํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋‹จ์ผ ๋ˆ„์  ๊ฐ’
    ์˜ˆ์‹œ) HTTP ์š”์ฒญ ์ˆ˜, ๋กœ๊ทธ ๋ฐœ์ƒ ์ˆ˜

http_server_requests_seconds_count{uri="/log"}

๐Ÿค” ์ฆ๊ฐ€๋งŒ ํ•˜๋Š” ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ํŠน์ • ์‹œ๊ฐ„์— ์–ผ๋งˆ๋‚˜ ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ๋“ค์–ด์™”๋Š”์ง€ ํ•œ๋ˆˆ์— ํ™•์ธํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ต๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด increase() , rate() ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ง€์›๋ฅผ ์ง€์›ํ•œ๋‹ค.

increase(http_server_requests_seconds_count{uri="/log"}[1m])

  • 02:42 ~ 02:43: 80๊ฑด ์š”์ฒญ
  • 02:43 ~ 02:46: 0๊ฑด ์š”์ฒญ
  • 02:46 ~ 02:48: ์•ฝ 50๊ฑด ์š”์ฒญ

rate(http_server_requests_seconds_count{uri="/log"}[1m])

๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ดˆ๋‹น ์–ผ๋งˆ๋‚˜ ์ฆ๊ฐ€ํ•˜๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

๐Ÿ“Œ ๊ทธ๋ผํŒŒ๋‚˜(Grafana)

https://grafana.com/grafana/download
๊ทธ๋ผํŒŒ๋‚˜๋ฅผ ์„ค์น˜ํ•œ ํ›„ http://localhost:3000 ์œผ๋กœ ํ™•์ธํ•ด๋ณด์ž

๋กœ๊ทธ์ธ ํ™”๋ฉด์ด ๋‚˜์˜ค๋ฉด
email or username : admin
Password : admin
์œผ๋กœ ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” SKIP์„ ํ•˜์ž

์ด๋Ÿฐ ํ™”๋ฉด์ด ๋‚˜์™€์•ผํ•œ๋‹ค.

๋ฐ์ดํ„ฐ์†Œ์Šค ์ถ”๊ฐ€

  1. ์™ผ์ชฝ ํ•˜๋‹จ์— ์žˆ๋Š” ์„ค์ •(Configuration) ๋ฒ„ํŠผ์—์„œ Data sources๋ฅผ ์„ ํƒํ•œ๋‹ค.
  2. Add data source ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  3. Prometheus๋ฅผ ์„ ํƒํ•œ๋‹ค.

โ—๏ธ ๋ฐ˜๋“œ์‹œ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค, ๊ทธ๋ผํŒŒ๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ 3๊ฐœ๊ฐ€ ๋‹ค ์ผœ์ ธ์žˆ์–ด์•ผํ•œ๋‹ค.

Prometheus ๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ค์ •

  • URL: http://localhost:9090
  • ๋‚˜๋จธ์ง€๋Š” ํŠน๋ณ„ํžˆ ๊ณ ์น  ๋ถ€๋ถ„์ด ์—†๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ๋‘๊ณ  Save & test ๋ฅผ ์„ ํƒ

๊ทธ๋ผํŒŒ๋‚˜ - ๋Œ€์‹œ๋ณด๋“œ ๋งŒ๋“ค๊ธฐ

๋Œ€์‹œ๋ณด๋“œ ์ €์žฅ

  1. ์™ผ์ชฝ Dashboards ๋ฉ”๋‰ด ์„ ํƒ
  2. New ๋ฒ„ํŠผ ์„ ํƒ New Dashboard ์„ ํƒ
  3. ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ Save dashboard ์ €์žฅ ๋ฒ„ํŠผ(disk ๋ชจ์–‘) ์„ ํƒ
  4. Dashboard name: hello dashboard๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ €์žฅ

๋Œ€์‹œ๋ณด๋“œ ํ™•์ธ

  1. ์™ผ์ชฝ Dashboards ๋ฉ”๋‰ด ์„ ํƒ
  2. ์•ž์„œ ๋งŒ๋“  hello dashboard ์„ ํƒ

ํŒจ๋„ ๋งŒ๋“ค๊ธฐ

๋Œ€์‹œ๋ณด๋“œ์— ํŒจ๋„ ๋งŒ๋“ค๊ธฐ

  1. ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ Add panel ๋ฒ„ํŠผ(์ฐจํŠธ ๋ชจ์–‘) ์„ ํƒ

  2. Add a new panel ๋ฉ”๋‰ด ์„ ํƒ

  3. ํŒจ๋„์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

  4. ์•„๋ž˜์— ๋ณด๋ฉด Run queries ๋ฒ„ํŠผ ์˜ค๋ฅธ์ชฝ์— Builder , Code ๋ผ๋Š” ๋ฒ„ํŠผ์ด ๋ณด์ด๋Š”๋ฐ, Code ๋ฅผ ์„ ํƒ

  5. Enter a PromQL query... ์ด๋ผ๋Š” ๋ถ€๋ถ„์— ๋ฉ”ํŠธ๋ฆญ์„ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

CPU ๋ฉ”ํŠธ๋ฆญ ๋งŒ๋“ค๊ธฐ

  • system_cpu_usage : ์‹œ์Šคํ…œ์˜ CPU ์‚ฌ์šฉ๋Ÿ‰
  • process_cpu_usage : JVM ํ”„๋กœ์„ธ์Šค CPU ์‚ฌ์šฉ๋Ÿ‰

PromQL ์— system_cpu_usage ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Run queries ํด๋ฆญ
+ Query ๋ฒ„ํŠผ๋ฅผ ํ†ตํ•ด process_cpu_usage ์ถ”๊ฐ€

๊ทธ๋ž˜ํ”„ ์ด๋ฆ„ ๋ณ€๊ฒฝ

  • ํ•˜๋‹จ์˜ Options -> Legend ๋ฅผ ์„ ํƒํ•˜๊ณ  Custom์„ ์„ ํƒ -> Cpu ์‚ฌ์šฉ๋Ÿ‰ ๋ฅผ ์ž…๋ ฅ

ํŒจ๋„ ์ด๋ฆ„ ์„ค์ •

์˜ค๋ฅธ์ชฝ์— ๋ณด๋ฉด Panel options -> Title ์ˆ˜์ •

๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ

  • Standard options -> Unit-> Data -> bytes(SI) ๋ฅผ ์„ ํƒ

์ตœ์†Œ๊ฐ’ ๋ณ€๊ฒฝ

  • Standard options -> Min- > 0 ์„ ์„ ํƒ

๊ทธ๋ผํŒŒ๋‚˜ - ๊ณต์œ  ๋Œ€์‹œ๋ณด๋“œ ํ™œ์šฉ

https://grafana.com/grafana/dashboards

1) ์Šคํ”„๋ง ๋ถ€ํŠธ ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ ๋Œ€์‹œ๋ณด๋“œ

https://grafana.com/grafana/dashboards/11378-justai-system-monitor/

  • Copy Id to clipboard ๋ฅผ ํ†ตํ•ด id ์นดํ”ผ

๋Œ€์‹œ๋ณด๋“œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

  1. ์™ผ์ชฝ Dashboards ๋ฉ”๋‰ด ์„ ํƒ
  2. New ๋ฒ„ํŠผ ์„ ํƒ -> Import ์„ ํƒ
  3. ๋ถˆ๋Ÿฌ์˜ฌ ๋Œ€์‹œ๋ณด๋“œ ์ˆซ์ž(11378)๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Load ๋ฒ„ํŠผ ์„ ํƒ
  4. Prometheus ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ ํƒํ•˜๊ณ  Import ๋ฒ„ํŠผ ์„ ํƒ

๋ถˆ๋Ÿฌ์˜จ ๋Œ€์‹œ๋ณด๋“œ ์ˆ˜์ •ํ•˜๊ธฐ

  • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ ์„ค์ • ๋ฒ„ํŠผ(ํ†ฑ๋‹ˆ๋ฐ”ํ€ด, Dashboard settings)์„ ์„ ํƒ -> Make editable ์„ ํƒ

Jetty ํ†ต๊ณ„ -> Tomcat ํ†ต๊ณ„

  • Title์„ Tomcat Statistics ๋กœ ์ˆ˜์ •

  • Thread Config Max ํŒจ๋„ ์„ค์ • ๋ณ€๊ฒฝ
    jetty_threads_config_max -> tomcat_threads_config_max_threads

  • Thread ํŒจ๋„ ์„ค์ • ๋ณ€๊ฒฝ
    jetty_threads_current -> tomcat_threads_current_threads
    jetty_threads_busy-> tomcat_threads_busy_threads
    jetty_threads_idle -> ์ œ๊ฑฐ
    jetty_threads_jobs -> ์ œ๊ฑฐ

2) ๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ ๋Œ€์‹œ๋ณด๋“œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ ๋Œ€์‹œ๋ณด๋“œ๋Š” JVM ์„ฑ๋Šฅ๊ณผ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ์œ ์šฉ

https://grafana.com/grafana/dashboards/4701-jvm-micrometer/

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์™€ ๊ทธ๋ผํŒŒ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์ปค์— ๋„์šฐ๊ธฐ

docker-compose.yml

version: '3.7'
services:
  prometheus:
    container_name: prometheus
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    networks:
      - es-bridge

  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    ports:
      - 3000:3000
    depends_on:
      - prometheus
    networks:
      - es-bridge

networks:
  es-bridge:
    driver: bridge

์œ„์• ์„œ ์„ค์ •ํ•œ prometheus.yml๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑํ•ด์ค˜์•ผํ•œ๋‹ค.

โ—๏ธ ํ•˜์ง€๋งŒ ์œ„์— ๋กœ์ปฌ์—์„œ ์„ค์ •ํ•œ prometheus.yml๋ฅผ ๊ทธ๋Œ€๋กœ ์„ค์ •ํ•˜๋ฉด http://localhost:8080/actuator/prometheus๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋”๋ผ๋„, Prometheus ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ๋Š” ํ•ด๋‹น ํƒ€๊ฒŸ์„ ์ฐพ์ง€ ๋ชปํ•ด ์ƒํƒœ๊ฐ€ ๋‹ค์šด(Down)์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

โ“ ๋ฌธ์ œ ์›์ธ

  • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ localhost: Docker ์ปจํ…Œ์ด๋„ˆ๋Š” ๋…๋ฆฝ์ ์ธ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ์˜ localhost๋Š” ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ๋‹ค.
  • Actuator ์„œ๋น„์Šค๊ฐ€ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋”๋ผ๋„, Prometheus ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ๋Š” localhost:8080์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ƒํƒœ๊ฐ€ ๋‹ค์šด์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.
prometheus.yml

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: [ "localhost:9090" ]
  - job_name: "spring-actuator"
    metrics_path: '/actuator/prometheus'
    scrape_interval: 1s
    static_configs:
      - targets: [ "host.docker.internal:8080" ]
docker-compose up -d

โ“ ๋ฌธ์ œ ์›์ธ

  • ๊ทธ๋ผํŒŒ๋‚˜์—์„œ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋ฅผ ๋ฐ์ดํ„ฐ์†Œ์Šค๋กœ ๋“ฑ๋กํ•˜๋ ค๊ณ  ํ•  ๋•Œ localhost:9090๋กœ ์„ค์ •์„ ํ•œ๋‹ค๋ฉด ๋ฐ‘์— ์ฒ˜๋Ÿผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ localhost:9090 ๋Œ€์‹  http://prometheus:9090 ๊ฐ™์€ ์‹์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ(ํ˜น์€ ์„œ๋น„์Šค) ์ด๋ฆ„์„ ํ˜ธ์ŠคํŠธ๋กœ ์จ์•ผํ•œ๋‹ค.

โ—๏ธ Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ๋Š” localhost๊ฐ€ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ, ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋กœ์ปฌ(ํ˜ธ์ŠคํŠธ) ๋จธ์‹ ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด host.docker.internal ์„ ์‚ฌ์šฉ

์ฐธ๊ณ  :

profile
๋…ธ๋ ฅ์€ ๋ฐฐ์‹ ํ•˜์ง€ ์•Š์•„ ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€