π§ λ§μ΄ν¬λ‘λ―Έν°
μλΉμ€λ₯Ό μ΄μν λλ μ ν리μΌμ΄μ μ CPU, λ©λͺ¨λ¦¬, 컀λ₯μ μ¬μ©, κ³ κ° μμ²μμ κ°μ λ§μ μ§ν(metric)λ€μ νμΈνλ κ²μ΄ νμν©λλ€.
κ·ΈλμΌ μ΄λμ μ΄λ€ λ¬Έμ κ° λ°μνλμ§ μ¬μ μ λμλ ν μ μκ³ , μ€μ λ¬Έμ κ° λ°μνλλΌλ μμΈμ λΉ λ₯΄κ² νμ ν΄μ λμ²ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄ λͺ¨λν°λ§μ ν΅ν΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ κ°λ μ°Όλ€λ κ²μ λ°κ²¬νλ€λ©΄, λ©λͺ¨λ¦¬ λ¬Έμ μ κ΄λ ¨μλ κ³³μ λΉ λ₯΄κ² μ°Ύμμ λμν μ μμ κ²μ λλ€.
νμ¬ μλ§μ λͺ¨λν°λ§ ν΄μ΄ μλ―μ¬, μμ€ν μ λ€μν μ 보λ₯Ό μ΄ λͺ¨λν°λ§ ν΄μ μ λ¬ν΄μ μ¬μ©νκ² λ©λλ€.
λ€μμ λ§μ΄ μ¬μ©λλ λͺ¨λν°λ§ ν΄λ€μ μμμ λλ€.
μμ κ°μ λͺ¨λν°λ§ ν΄λ€μ μ¬μ©νκΈ° μν΄μλ, μμ€ν μ λ€μν μ§νλ€μ κ°κ°μ λͺ¨λν°λ§ ν΄μ λ§λλ‘ λ§λ€μ΄μ 보λ΄μ£Όμ΄μΌ ν©λλ€.
(λμ²΄λ‘ μ΄ κ³Όμ μ λΌμ΄λΈλ¬λ¦¬ λ±μ ν΅ν΄μ μλνλλ κ²½μ°κ° λ§μ΅λλ€.)
π λͺ¨λν°λ§ ν΄μ μ§ν μ λ¬
μλ₯Ό λ€μ΄μ CPU, JVM, CON(컀λ₯μ ) μ 보 λ±μ JMX ν΄μ μ λ¬νλ€κ³ κ°μ νκ² μ΅λλ€.
κ·Έλ¬λ©΄ κ°κ°μ μ 보λ€μ JMX λͺ¨λν°λ§ ν΄μ΄ μ ν νμμ λ§μΆμ΄ μΈ‘μ νκ³ μ λ¬ν΄μΌ ν©λλ€.
κ·Έλ°λ° μ΄ μν©μμ λ§μ½ λͺ¨λν°λ§ ν΄μ λ³κ²½νκ² λλ©΄ μ΄λ»κ² λ κΉμ?
κΈ°μ‘΄μ μΈ‘μ νλ μ½λλ₯Ό λͺ¨λ λ³κ²½ν ν΄μ λ§λλ‘ λ€μ λ³κ²½ν΄μΌ ν©λλ€.
κ°λ°μ μ μ₯μμλ λ¨μν λͺ¨λν°λ§ ν΄μ λ³κ²½νμ λΏμΈλ°, μ§νλ₯Ό μΈ‘μ νλ μ½λκΉμ§ λͺ¨λ λ³κ²½ν΄μΌ νλ λ¬Έμ κ° λ°μν©λλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νλ κ²μ΄ λ°λ‘ λ§μ΄ν¬λ‘λ―Έν°(Micrometer)λΌλ λΌμ΄λΈλ¬λ¦¬μ λλ€.
π§ λ§μ΄ν¬λ‘λ―Έν° μΆμν
λ§μ΄ν¬λ‘λ―Έν°λ CPU, JVM λ±λ± μ¬λ¬κ°μ§ λ©νΈλ¦(μΈ‘μ μ§ν)μ λν νμ€ μΈ‘μ λ°©μμ μ 곡ν©λλ€.
κ°λ°μλ ν΄λΉ νμ€μ λ§μΆ°μ μ 보λ₯Ό μ λ¬νκΈ°λ§ νλ©΄, μ¬λ¬ λ§μ΄ν¬λ‘λ―Έν° κ΅¬ν체λ€μ μ ννμ¬ μ¬μ©ν μ μκ² λ©λλ€.
μ΄λ¬ν μ΄μ λ‘ λ§μ΄ν¬λ‘λ―Έν°λ μ ν리μΌμ΄μ λ©νΈλ¦ νμ¬λ(Facade)λΌκ³ λΆλ¦½λλ€.
λ³΄ν΅ μ΄λ¬ν μΆμνλ μ€νλ§μ΄ μ§μ λ§λ€μ΄μ μ 곡νμ§λ§, λ§μ΄ν¬λ‘λ―Έν°λΌλ μ΄λ―Έ μ λ§λ€μ΄μ§ μΆμνκ° μκΈ° λλ¬Έμ μ€νλ§μ μ΄λ₯Ό νμ©ν©λλ€. μ€νλ§λΆνΈ μ‘μΆμμ΄ν°λ λ§μ΄ν¬λ‘λ―Έν°λ₯Ό κΈ°λ³ΈμΌλ‘ λ΄μ₯ν΄μ μ¬μ©ν©λλ€.
κ°λ°μλ λ§μ΄ν¬λ‘λ―Έν°κ° μ ν νμ€ λ°©λ²μΌλ‘ λ©νΈλ¦(μΈ‘μ μ§ν)λ₯Ό μ λ¬νλ©΄ λ©λλ€.
κ·Έλ¦¬κ³ μ¬μ©νλ λͺ¨λν°λ§ ν΄μ λ§λ ꡬν체λ₯Ό μ ννλ©΄ λ©λλ€.
μ΄νμ λͺ¨λν°λ§ ν΄μ΄ λ³κ²½λμ΄λ ν΄λΉ ꡬνμ²΄λ§ λ³κ²½νλ©΄ λ©λλ€.
μ ν리μΌμ΄μ μ½λλ λͺ¨λν°λ§ ν΄μ΄ λ³κ²½λμ΄λ κ·Έλλ‘ μ μ§ν μ μμ΅λλ€.
λ§μ΄ν¬λ‘λ―Έν°κ° μ 곡νλ μ¬λ¬ λͺ¨λν°λ§ ν΄λ€μ λν μ 보λ λ§μ΄ν¬λ‘λ―Έν° κ³΅μ λ¬Έμμ λμ μμ΅λλ€.
https://micrometer.io/docs
π§ λ©νΈλ¦ νμΈνκΈ°
CPU, JVM, CON(컀λ₯μ ) λ±λ± μ λ§μ μ§νλ€μ΄ μ‘΄μ¬ν©λλ€.
μ΄λ¬ν μ§νλ€μ κ°λ°μκ° νλνλ μ§μ μμ§νκΈ°λ μ΄λ €μΈ κ²μ λλ€.
μ΄λ₯Ό λκΈ° μν΄ λ§μ΄ν¬λ‘λ―Έν°λ λ€μν μ§ν μμ§ κΈ°λ₯μ μ΄λ―Έ λ§λ€μ΄μ μ 곡ν©λλ€.
κ·Έλ¦¬κ³ μ€νλ§ λΆνΈ μ‘μΆμμ΄ν°λ λ§μ΄ν¬λ‘λ―Έν°κ° μ 곡νλ μ§ν μμ§μ @AutoConfigurationμ ν΅ν΄ μλμΌλ‘ λ±λ‘ν΄μ€λλ€.
λ°λΌμ μ€νλ§ λΆνΈ μ‘μΆμμ΄ν°λ₯Ό μ¬μ©νλ€λ©΄, μ λ§μ λ©νΈλ¦(μ§ν)λ€μ νΈλ¦¬νκ² μ¬μ©ν μ μκ² λλ κ²μ λλ€.
μ΄μ λΆν° κΈ°λ³Έμ μΌλ‘ μ 곡λλ λ©νΈλ¦λ€μ νμΈν΄λ³΄κ² μ΅λλ€.
(μμ§ λͺ¨λν°λ§ ν΄μ μ°κ²°ν κ²μ μλκ³ , λ±λ‘λ λ©νΈλ¦λ€μ νμΈν΄λ³΄λ κ³Όμ μ λλ€.)
π metrics μλν¬μΈνΈ
μ‘μΆμμ΄ν°μ 'metrics' μλν¬μΈνΈλ₯Ό μ¬μ©νλ©΄ κΈ°λ³ΈμΌλ‘ μ 곡λλ λ©νΈλ¦λ€μ νμΈν μ μμ΅λλ€.
http://localhost:8080/actuator/metrics
κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€.
μ‘μΆμμ΄ν°κ° λ§μ΄ν¬λ‘λ―Έν°λ₯Ό ν΅ν΄μ λ±λ‘ν κΈ°λ³Έ λ©νΈλ¦λ€μ νμΈν μ μμ΅λλ€.
π metric μμΈν νμΈνκΈ°
`metrics` μλν¬μΈνΈλ λ€μκ³Ό κ°μ ν¨ν΄μ μ¬μ©ν΄μ λ μμΈν μ 보λ₯Ό νμΈν μ μμ΅λλ€.
http://localhost:8080/actuator/metrics/{name}
μλ₯Ό λ€μ΄ JVM λ©λͺ¨λ¦¬ μ¬μ©λμ λ€μκ³Ό κ°μ μ£Όμλ₯Ό ν΅ν΄ νμΈν μ μμ΅λλ€.
http://localhost:8080/actuator/metrics/jvm.memory.used
κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€.
π Tag νν°
μ μ¬μ§μμ availableTagsλ₯Ό 보면 λ€μκ³Ό κ°μ νλͺ©μ νμΈν μ μμ΅λλ€.
tag:area,
- values [heap, nonheap]
tag:id,
- values [G1 Survivor Space, ...]
ν΄λΉ Tagλ₯Ό κΈ°λ°μΌλ‘ μ 보λ₯Ό νν°λ§ν΄μ νμΈν μ μμ΅λλ€.
μ΄λ νμμ tag=KEY:VALUE μ¬μΌ ν©λλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ΅λλ€.
http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:heap
http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:nonheap
νκ°μ§ μμλ₯Ό λ μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.
HTTP μμ² κ΄λ ¨ λ©νΈλ¦μ λ€μ μ£Όμμμ νμΈν μ μμ΅λλ€.
http://localhost:8080/actuator/metrics/http.server.requests
μ΄λ Tagλ₯Ό ν΅ν΄μ HTTP μμ² κ΄λ ¨ μΌλΆ λ΄μ©μ νν°λ§ν΄λ³΄κ² μ΅λλ€.
/log μμ²λ§ νν°
http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:/log
/logμμ²μ΄λ©΄μ HTTP Status κ° 200μΈ κ²λ€
http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:/log&tag=status:200
π§ λ€μν λ©νΈλ¦
λ§μ΄ν¬λ‘λ―Έν°μ μ‘μΆμμ΄ν°κ° κΈ°λ³ΈμΌλ‘ μ 곡νλ λ€μν λ©νΈλ¦μ κ°λ΅ν μμ보λλ‘ νκ² μ΅λλ€.
μ’ λ₯λ μλμ κ°μ΅λλ€.
- JVM
- μμ€ν
- μ ν리μΌμ΄μ μμ
- μ€νλ§ MVC
- ν°μΊ£
- λ°μ΄ν° μμ€(DataSource)
- λ‘κ·Έ
- κΈ°ν λ±λ±..
- μ¬μ©μκ° μ§μ λ©νΈλ¦μ μ μνλ κ²λ κ°λ₯ν©λλ€.
π€ JVM λ©νΈλ¦
JVM κ΄λ ¨λ λ©νΈλ¦μ jvm. μΌλ‘ μμν©λλ€.
- λ©λͺ¨λ¦¬ λ° λ²νΌ ν μΈλΆ μ 보
- κ°λΉμ§ 컬λ μ κ΄λ ¨ν ν΅κ³
- μ€λ λ νμ©
- λ‘λ λ° μΈλ‘λλ ν΄λμ€μ μ
- JVM λ²μ μ 보
- JIT μ»΄νμΌ μκ°
π€ μμ€ν λ©νΈλ¦
μμ€ν λ©νΈλ¦μ `system.`, `process.`, `disk.` μΌλ‘ μμν©λλ€.
- CPU λ©νΈλ¦
- νμΌ λμ€ν¬λ¦½ν° λ©νΈλ¦
- κ°λ μκ° λ©νΈλ¦
- μ¬μ© κ°λ₯ν λμ€ν¬ 곡κ°
π€ μ ν리μΌμ΄μ μμ λ©νΈλ¦
- application.started.time : μ ν리μΌμ΄μ μ μμνλλ° κ±Έλ¦¬λ μκ° (ApplicationStartedEventλ‘ μΈ‘μ )
- application.ready.time : μ ν리μΌμ΄μ μ΄ μμ²μ μ²λ¦¬ν μ€λΉκ° λλλ° κ±Έλ¦¬λ μκ° (ApplicationReadyEventλ‘ μΈ‘μ )
μ€νλ§μ λ΄λΆμ μ¬λ¬ μ΄κΈ°ν λ¨κ³κ° μκ³ κ° λ¨κ³λ³λ‘ λ΄λΆμμ μ ν리μΌμ΄μ μ΄λ²€νΈλ₯Ό λ°νν©λλ€.
- ApplicationStartedEvent : μ€νλ§ μ»¨ν μ΄λκ° μμ ν μ€νλ μνμΌλ λ°νλ©λλ€. μ΄νμ CommandLineRunner κ° νΈμΆλ©λλ€.
- ApplicationReadyEvent : CommandLineRunnerκ° μ€νλ μ΄νμ νΈμΆλ©λλ€.
π€ μ€νλ§ MVC λ©νΈλ¦
μ€νλ§ MVCκ° μ²λ¦¬νλ λͺ¨λ μμ²μ λ€λ£Ήλλ€.
λ©νΈλ¦ μ΄λ¦: http.server.requests
TAGλ₯Ό μ¬μ©ν΄μ λ€μ μ 보λ₯Ό λΆλ₯ν΄μ νμΈν μ μμ΅λλ€.
- uri: μμ² URI
- method: GET, POSTμ κ°μ HTTP λ©μλ
- status: 200, 400, 500κ³Ό κ°μ HTTP μν μ½λ
- exception: μμΈ
- outcome: μνμ½λλ₯Ό κ·Έλ£ΉμΌλ‘ λͺ¨μμ νμΈ
- 1xx:INFORMATIONAL, 2xx:SUCCESS, 3xx:REDIRECTION, 4xx:CLIENT_ERROR, 5xx:SERVER_ERROR
π€ λ°μ΄ν°μμ€ λ©νΈλ¦
DataSource, 컀λ₯μ νμ κ΄ν λ©νΈλ¦μ νμΈν μ μμ΅λλ€.
'jdbc.connections.' μΌλ‘ μμν©λλ€.
μ΅λ 컀λ₯μ , μ΅μ 컀λ₯μ , νμ± μ»€λ₯μ , λκΈ° 컀λ₯μ μ λ±μ νμΈν μ μμ΅λλ€.
(ν카리 컀λ₯μ νμ μ¬μ©νλ©΄ 'hikaricp.' μ ν΅ν΄ ν카리 컀λ₯μ νμ μμΈν λ©νΈλ¦μ νμΈν μ μμ΅λλ€.)
π€ λ‘κ·Έ λ©νΈλ¦
'logback.events' : logback λ‘κ·Έμ λν λ©νΈλ¦μ νμΈν μ μμ΅λλ€.
trace, debug, info, warn, error κ°κ°μ λ‘κ·Έ λ 벨μ λ°λ₯Έ λ‘κ·Έ μλ₯Ό νμΈν μ μμ΅λλ€.
μλ₯Ό λ€μ΄ error λ‘κ·Έ μκ° κΈκ²©ν λμμ§λ€λ©΄ μνν μ νΈλ‘ λ°μλ릴 μ μμ΅λλ€.
π€ ν°μΊ£ λ©νΈλ¦
ν°μΊ£ λ©νΈλ¦μ 'tomcat.' μΌλ‘ μμν©λλ€.
ν°μΊ£ λ©νΈλ¦μ λͺ¨λ μ¬μ©νλ €λ©΄ λ€μ μ΅μ μ μΌμΌν©λλ€. (μ΅μ μ μΌμ§ μμΌλ©΄ 'tomcat.session.' κ΄λ ¨ μ λ³΄λ§ λ ΈμΆλ©λλ€.)
βοΈ application.yml
server:
tomcat:
mbeanregistry:
enabled: true
μμ κ°μ΄ μ€μ νλ©΄ λ€μκ³Ό κ°μ λ€μν μ§νλ€μ νμΈν μ μμ΅λλ€.
tomcat.threads.config.max μ΅λ μ€λ λ μ(λμ μ²λ¦¬ κ°λ₯ν μμ² μ)λ₯Ό 보μ¬μ£Όλ©°,
tomcat.threads.busyλ νμ¬ μλνλ μ€λ λ μλ₯Ό 보μ¬μ€λλ€.
π€ κΈ°ν
- HTTP ν΄λΌμ΄μΈνΈ(RestTemplate, WebClient)
- μΊμ
- μμ μ€νκ³Ό μ€μΌμ€
- μ€νλ§ λ°μ΄ν° 리ν¬μ§ν 리
- λͺ½κ³ DB
- λ λμ€
- ...
π€ μ¬μ©μ μ μ λ©νΈλ¦
μ¬μ©μκ° μ§μ λ©νΈλ¦μ μ μν μλ μμ΅λλ€.
μλ₯Ό λ€μ΄ μ£Όλ¬Έμ, μ·¨μμλ₯Ό λ©νΈλ¦μΌλ‘ λ§λ€ μ μμ΅λλ€.
μ¬μ©μ μ μ λ©νΈλ¦μ λ§λ€κΈ° μν΄μλ λ§μ΄ν¬λ‘λ―Έν°μ μ¬μ©λ²μ λ¨Όμ μ΄ν΄ν΄μΌ νλλ°, μ΄λΆλΆμ λ€μμ μμλ³΄κ² μ΅λλ€
π€ μ 리
μ‘μΆμμ΄ν°λ₯Ό ν΅ν΄ λ§μ λ©νΈλ¦μ΄ μλμΌλ‘ λ§λ€μ΄μ§λ κ²μ νμΈνμ΅λλ€.
κ·Έλ°λ° μ΄λ¬ν λ©νΈλ¦λ€μ μ΄λκ°μ μ§μν΄μ 보κ΄ν΄μΌ κ³Όκ±°μ λ°μ΄ν°λ€λ νμΈν μ μμ κ²μ λλ€.
λ°λΌμ λ©νΈλ¦μ μ§μμ μΌλ‘ μμ§νκ³ λ³΄κ΄ν λ°μ΄ν°λ² μ΄μ€κ° νμν©λλ€.
κ·Έλ¦¬κ³ μ΄λ¬ν λ©νΈλ¦λ€μ κ·Έλνλ₯Ό ν΅ν΄μ νλμ μ½κ² νμΈν μ μλ λμ보λλ νμν©λλ€.
μ°Έκ³ : μ‘μΆμμ΄ν°κ° μ§μνλ λ€μν λ©νΈλ¦μ λ€μ 곡μ λ©λ΄μΌμ μμ΅λλ€.
https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.supported
π Reference
[μ€νλ§ λΆνΈ - ν΅μ¬ μ리μ νμ©. μΉμ 9] - κΉμνλ
'ποΈ Spring > λͺ¨λν°λ§' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[κ·ΈλΌνλ] - [2] 곡μ λμ보λ μ¬μ©νκΈ° (0) | 2023.06.11 |
---|---|
[κ·ΈλΌνλ] - [1] κ·ΈλΌνλ(Grafana) λμ보λ μμ± (2) | 2023.06.10 |
[νλ‘λ©ν μ°μ€] - νλ‘λ©ν μ°μ€(Prometheus) (0) | 2023.05.21 |
[μ‘μΆμμ΄ν°] - μ‘μΆμμ΄ν°(Actuator) μμνκΈ° (0) | 2023.05.09 |