์Šคํ”„๋ง Actuator Endpoint (health, info, logger, httpexchanges)

2023. 5. 15. 11:39ใ†์ธํ”„๋Ÿฐ/์Šคํ”„๋ง ๋ถ€ํŠธ - ํ•ต์‹ฌ ์›๋ฆฌ์™€ ํ™œ์šฉ

728x90

 

์Šคํ”„๋ง๋ถ€ํŠธ Actuator (tistory.com)

 

์Šคํ”„๋ง๋ถ€ํŠธ Actuator

1๏ธโƒฃ Spring Actuator ์‹ค๋ฌด์—์„œ๋Š” ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค ํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ๋Œ€๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ๋งŒ๋“  ์„œ๋น„์Šค์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ง€ํ‘œ๋“ค์„ ์‹ฌ์–ด์„œ ๊ฐ์‹œํ•˜๋Š” ํ™œ๋™์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฐ ํ™œ

hyejin.tistory.com

์ €๋ฒˆ ๊ธ€์—์„œ ์Šคํ”„๋ง ์•ก์ธ„์—์ดํ„ฐ, ์‚ฌ์šฉ ๋ฐฉ๋ฒ•, ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์•ค๋“œํฌ์ธํŠธ์— ๋Œ€ํ•ด์„œ ์ข…๋ฅ˜๋ฅผ ๋ดค๋Š”๋ฐ ๊ทธ ์ค‘ ์ž์ฃผ? ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. 

 

 

1๏ธโƒฃ health 

health ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฌธ์ œ๋ฅผ ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

http://localhost:8080/actuator/health 

์•„๋ฌด ์„ค์ • ์—†์ด health ๋ฅผ ๋ณด๋ฉด ๋‹จ์ˆœํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•˜๋Š”์ง€ ์ƒํƒœ๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ถ”๊ฐ€๋กœ ์„ค์ •ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์‘๋‹ตํ•˜๋Š”์ง€, ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    shutdown:
      enabled: true
    health:
      show-details: always

management.endpoint.health.show-details ๋ฅผ always๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ํ—ฌ์Šค ์ •๋ณด๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

-> ์ด๋ ‡๊ฒŒ ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์ด ์ž์„ธํ•˜๊ฒŒ ๋…ธ์ถœ๋˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋…ธ์ถœ๋˜๋Š”๊ฒŒ ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค๋ฉด show-detail ์˜ต์…˜์€ ๋„๊ณ  show-components ์˜ต์…˜์„ ํ‚ค๋ฉด ๋œ๋‹ค.  ๊ทธ๋Ÿฌ๋ฉด ๋ฐ‘์— ์ƒ์„ธํ•œ ์ •๋ณด๋Š” ์•ˆ๋‚˜์˜ค๊ณ  status ์ •๋„๋งŒ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. 

 

 

* ๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ ํ—ฌ์Šค ์ปดํฌ๋„ŒํŠธ ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ „์ฒด ์ƒํƒœ๋Š” DOWN์ด ๋œ๋‹ค. 

 

 

 

2๏ธโƒฃ info 

info ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•œ๋‹ค. 

 

๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ •๋ณด๋“ค๋กœ๋Š” 

- java  : ์ž๋ฐ” ๋Ÿฐํƒ€์ž„ ์ •๋ณด 

- os : OS ์ •๋ณด 

- env : Environment ์—์„œ info ๋กœ  ์‹œ์ž‘ํ•˜๋Š” ์ •๋ณด 

- build : ๋นŒ๋“œ ์ •๋ณด -> META-INF/build-info.properties ํŒŒ์ผ ํ•„์š” 

- git : git ์ •๋ณด -> git.properties ํŒŒ์ผ ํ•„์š” 

 

๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ java, os, env ๋Š” ๋น„ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธํ•˜๋ ค๋ฉด ํ™œ์„ฑํ™”ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    shutdown:
      enabled: true
    health:
      show-details: always
  info:
    java:
      enabled: true
    os:
      enabled: true
    env:
      enabled: true

 management.info.java, os, env ๋ฅผ true๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ํ™œ์„ฑํ™”๋œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  /actuator/info ํ•˜๋ฉด java, os, env ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

build ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜๋ ค๋ฉด META-INF/build-info.propertiesํŒŒ์ผ์ด ํ•„์š”ํ•œ๋ฐ 

springBoot {
    buildInfo()
}

build.gradle์— ์œ„์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  build ํ•ด์ฃผ๋ฉด ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  git ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜๋ ค๋ฉด git.properties ํŒŒ์ผ์ด ํ•„์š”ํ•˜๊ณ , 

id "com.gorylenko.gradle-git-properties" version "2.4.1" //git info

build.gradle์— plugin์œผ๋กœ ์ด๊ฑธ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

(๊ทธ๋ฆฌ๊ณ  ๋‹น์—ฐํ•œ๊ฑด๋ฐ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ๊นƒ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.) 

 

 

 

3๏ธโƒฃ logger 

logger ์•ค๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊น…๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ๋˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ logging level์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

LogController 

@Slf4j
@RestController
public class LogController
{
   
   @GetMapping("/log")
   public String log()
   {
      log.trace("trace log");
      log.debug("debug log");
      log.info("info log");
      log.warn("warn log");
      log.error("error log");
      
      return "ok";
   }
}

 

application.yml

logging:
  level:
    hello.controller: debug

applicationi.yml์— hello.controller ํŒจํ‚ค์ง€ ํฌํ•จ ํ•˜์œ„ ํŒจํ‚ค์ง€๋Š” debug ๋ ˆ๋ฒจ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

๊ทธ ๋‹ค์Œ http://localhost:8080/log ํ•˜๋ฉด 

debug ๋ ˆ๋ฒจ๊นŒ์ง€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

http://localhost:8080/actuator/loggers ๋ฅผ ํ•˜๋ฉด 

์ด๋ ‡๊ฒŒ ๋กœ๊น…๊ณผ ๊ด€๋ จ๋œ  ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , 

์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•œ LogController๋Š” ๋ ˆ๋ฒจ์ด debug์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ณ„๋„ ์„ค์ • ์—†์œผ๋ฉด info๊ฐ€ ๊ธฐ๋ณธ) 

 

 

๊ทธ๋ฆฌ๊ณ  ๋” ์ž์„ธํžˆ 

http://localhost:8080/actuator/loggers/hello.controller

{๋กœ๊ฑฐ ์ด๋ฆ„} ์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

* ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ 

๊ทธ๋ฆฌ๊ณ  loggers ์•ค๋“œํฌ์ธํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.  

 

http://localhost:8080/actuator/loggers/{๋กœ๊ฑฐ์ด๋ฆ„} ์„ POST๋กœ ์š”์ฒญํ•˜๊ณ  

configuredLevel์„ ์›ํ•˜๋Š” ๋ ˆ๋ฒจ๋กœ ์ง€์ •ํ•ด์„œ ์š”์ฒญํ•˜๊ณ , ์š”์ฒญ ์„ฑ๊ณตํ•˜๋ฉด 204 ์‘๋‹ต์ด ์˜จ๋‹ค. 

 

 

 

 

 

4๏ธโƒฃ HTTP ์š”์ฒญ ์‘๋‹ต ๊ธฐ๋ก : httpexchanges 

httpexchanges ์•ค๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด์„œ HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ๊ณผ๊ฑฐ ๊ธฐ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

HttpExchangeRepository ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋ฉด httpexchanges ์•ค๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

(์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๊ธฐ๋ณธ์œผ๋กœ InMemoryHttpExchangeRepository ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณต) 

 

 

@SpringBootApplication
public class ActuatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActuatorApplication.class, args);
    }
    
    @Bean
    public InMemoryHttpExchangeRepository httpExchangeRepository()
    {
        return new InMemoryHttpExchangeRepository();
    }

}

InMemoryHttpExchangeRepository๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ค€ ๋‹ค์Œ 

 

http://localhost:8080/actuator/httpexchanges ์‹คํ–‰ํ•ด๋ณด๋ฉด 

์ง€๊ธˆ๊นŒ์ง€ ์‹คํ–‰ํ–ˆ๋˜ HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

(์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ–ˆ๋˜ /log ๋„ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. )

 

* ๊ทผ๋ฐ httpexchanges ๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ณ  ๊ธฐ๋Šฅ์— ์ œํ•œ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , 

์‹ค์ œ ์šด์˜ ์„œ๋น„์Šค์—์„œ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์ด๋‚˜ ํ•€ํฌ์ธํŠธ, Zipkin ๊ฐ™์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. 

 

 

 

5๏ธโƒฃ ์•ก์ธ„์—์ดํ„ฐ์™€ ๋ณด์•ˆ 

๋ณด๋ฉด ์•ก์ธ„์—์ดํ„ฐ๋Š” ํŽธ๋ฆฌํ•˜๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€ ์ •๋ณด๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋…ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. 

๊ทธ๋ž˜์„œ ๊ณต๊ฐœ๋œ ๊ณณ์— ์•ก์ธ„์—์ดํ„ฐ์˜ ์•ค๋“œ ํฌ์ธํŠธ๋“ค์„ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. 

 

-> ์•ก์ธ„์—์ดํ„ฐ์˜ ์•ค๋“œํฌ์ธํŠธ๋“ค์€ ์™ธ๋ถ€ ์ธํ„ฐ๋„ท์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ง‰๊ณ , ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋‚ด๋ถ€๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค. 

 

* ์•ก์ธ„์—์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํฌํŠธ์—์„œ ์‹คํ–‰ 

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    shutdown:
      enabled: true
    health:
      show-details: always
  info:
    java:
      enabled: true
    os:
      enabled: true
    env:
      enabled: true
  server:
    port: 9292

management.server.port = 9292 ๋กœ ์„ค์ •ํ•ด์„œ ์•ก์ธ„์—์ดํ„ฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€๋Š” ๋‹ค๋ฅธ ํฌํŠธ์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. 

 

 

* ์•ก์ธ„์—์ดํ„ฐ URL ๊ฒฝ๋กœ์— ์ธ์ฆ ์„ค์ • 

์œ„์— ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ํฌํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋ฉด /actuator ๊ฒฝ๋กœ์— ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ ๋˜๋Š” ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด์„œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•˜๋‹ค. 

 

 

* ์•ค๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ 

/actuator ๊ฒฝ๋กœ ๋Œ€์‹ ์— ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. 

management.endpoints.web.base-path = "" ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90