개발

스프링부트 모니터링 하는법(Actuator, prometheus, grafana)

뭘하지 2023. 3. 20. 17:41
반응형

스프링 부트에서 각종 매트릭 정보를 사용하여 모니터링이 가능하다고 한다.

매트릭 정보를 쉽게 제공해주는 액츄에이터(Actuator)

매트릭 정보를 수집, 저장해 주는 프로메테우스(Prometheus)

수집된 매트릭 정보들을 사용하여 사용자에게 보기좋게 대시보드를 제공하는 그라파나(Grafana)가 있다.

 

김영한님 강의를 볼 때 마다 이와 같은 말을 많이 한다. ‘전투에서 실패한 지휘관은 용서 할 수 있지만 경계에 실패하는 지휘관은 용서 할 수 없다.’ 장애는 언제든지 발생 할 수 있으나 그것에 대한 모니터링(경계)를 잘하고 대응하는게 중요하다고 한다.

 

스프링 스타터에서 제공하는 액츄레이터 사용을 위해 셋팅.

build.gradle 파일에 추가

implementation 'org.springframework.boot:spring-boot-starter-actuator' //actuator 추가

기본 호출주소

http://localhost:8080/actuator

기본적으로 많은 정보들을 제공하고 주로 사용 될 수도 있을 것 같은 기능들에 대해서 정리한다.

health 관련 설정

application.yml 파일내 설정

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
		 #show-components: always // 심플하게 보고싶다면..!

서버 실행 후 localhost:8080/actuator/health 호출 시 서버 관련 정보를 보여준다.

  • db와의 연결상태
  • disk상태
  • 서버 ping 상태
{
  "status": "UP",
  "components": {
    "db": {
      "status": "UP",
      "details": {
        "database": "H2",
        "validationQuery": "isValid()"
      }
    },
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 990622687232,
        "free": 860976947200,
        "threshold": 10485760,
        "path": "C:\\\\Users\\\\USER\\\\Downloads\\\\boot-source-20230228\\\\start\\\\actuator\\\\.",
        "exists": true
      }
    },
    "ping": {
      "status": "UP"
    }
  }
}

 

로그 관련 설정

아래와같은 컨트롤러가 있다고 가정 할 때

@Slf4j
@RestController
public class TestController {

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

보통 운영서버의 경우 로그를 너무 많이 남기게되면 서버에 부하가 걸리기때문에 로그 level을 info로 많이 설정하게되는데 예상치 못한 에러발생시, debugtrace로 변경해야 한다.. 하지만 그런경우 application.properties나 기타 설정파일에서 로그 레벨을 변경한 뒤 재시작해야하는게 보통인데 재시작없이 변경 가능하다.

일단 해당 컨트롤러만 딱 잡아서 확인해본 로그 레벨을 확인 해본 결과 (localhost:8080/actuator/loggers/hello.TestController)

{
  "effectiveLevel": "INFO"
}

전체를 보려면 그냥 localhost:8080/actuator/loggers 를 입력하면 된다.

그리고 해당 컨트롤러만 log레벨을 trace로 변경하고싶다면..?!

포스트맨으로 post요청을 해당 바디값을 넣고 요청하면된다.

body요청 값

{
    "configuredLevel": "TRACE"
}

서버에서 trace까지 찍히는 모습

 

액츄에이터 관련 보안!!!!

보안권장되는 것은 기본포트를 변경하고 해당 포트는 nginx나 그런 웹서버 설정을 통해 내부 IP만 접근 가능하도록 막아버리는걸 권장하는듯 하다.

management:
  server:
    port: 9092
  1. application.yml 파일에서 톰캣과 별도로 액츄레이터만 포트변경 가능 설정!
  2. 모두에게 해당 정보들이 오픈되는건 과하다…

액츄레이터 기본 접근경로를 변경하려면..?

application.yml 파일에서 변경가능

management:
  endpoints:
    web:
      base-path: "/manage"

localhost:8080/actuator/info —> localhost:8080/manage/info 로 변경하여 접근가능하게됨.

 

개인적인 생각

서버 상태를 체크하는 경우에 어디부분이 문제가 생겼는지 확인 할 수 있어서 좋을듯 하지만 공개적으로 사용하는 서버에서 적용 할 때는 보안과 관련하여 신경을 써야 할 것 같다.

서버 재시작 없이 로그 레벨을 변경 한다거나 별도의 모니터링 솔루션이 없는데 빠르게 뭔가 확인해야 하는 경우 액츄레이터를 사용하는건 나쁘지 않을 듯 하다..!

액츄에이터에서 톰캣과 관련된 매트릭정보 또한 제공해준다.

여기서 제공되는 정보를 가지고 모니터링 툴과 연결하여 다양한 지표들을 확인 할 수 있다.

application.yml 기준

#톰캣 관련 설정
server:
  tomcat:
    mbeanregistry:
      enabled: true

아래처럼 추가로 /actuator/metrics 에 표시되는걸 확인 가능하다.

"tomcat.cache.access",
"tomcat.cache.hit",
"tomcat.connections.config.max",
"tomcat.connections.current",
"tomcat.connections.keepalive.current",
"tomcat.global.error",
"tomcat.global.received",
"tomcat.global.request",
"tomcat.global.request.max",
"tomcat.global.sent",
"tomcat.servlet.error",
"tomcat.servlet.request",
"tomcat.servlet.request.max",
"tomcat.sessions.active.current",
"tomcat.sessions.active.max",
"tomcat.sessions.alive.max",
"tomcat.sessions.created",
"tomcat.sessions.expired",
"tomcat.sessions.rejected",
"tomcat.threads.busy",
"tomcat.threads.config.max",
"tomcat.threads.current"

매트릭의 경우 실시간 정보를 확인하게 해주는 것이고, 과거 데이터나 이런걸 확인하려면 데이터베이스에 해당 정보들이 저장되는 과정이 필요하다.

그리고 위 정보들을 언제까지고 Json 데이터로 볼 수 없기 때문에 대쉬보드 형태로 봐야할텐데.. 그걸 지원하는 툴이 많이 존재한다.

 

프로메테우스, 그라나파가 그 예시 이다.

프토메테우스!

매트릭을 순간만 확인하는게 아니라 매트릭 수집 및 DB저장하는 역할을 수행한다..!

그라나파!

프로메테우스로 수집된 데이터(DB)를 조회하여 대쉬보드 형태로 보기좋게 도와주는 툴.

기본적인 구조는 다음과 같다.

  1. 스프링 액츄에이터 에서 마이크로미터를 사용하여 프로메테우스에 매트릭 정보를 제공한다. (마이크로미터 프로메테우스 구현체 적용)
  2. 프로메테우스는 해당 지표를 수집 및 저장 한다.(내부DB)
  3. 그라파나로 해당 지표를 사용하여 매트릭 정보들을 그래프로 그려낸다.

기본적인 아키텍처는 다음과 같음.(https://prometheus.io/docs/introduction/overview/)

아키텍처

프로메테우스 다운로드 및 실행

다운로드 주소 : https://prometheus.io/download/

 

Download | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

윈도우를 사용하고 있기 때문에 윈도우용 zip 파일을 다운로드 받고 실행을 위해 prometheus.exe 를 실행한다.

따로 설치하는게 귀찮다면 docker desktop 을 설치하여 도커 이미지를 가져온뒤 설치하면 된다.

(기본포트 9090)

사용하는 사람이 많아보이는 ubuntu/prometheus:latest 이미지를 가져와서 사용했다.

 

프로메테우스를 사용하기 위한 절차

  1. 애플리케이션 설정
  2. 프로메테우스가 매트릭 정보를 가져 갈 수 있도록 프로메테우스 포멧에 맞춰 설정
  3. 프로메테우스가 설정
  4. 프로메테우스가 주기적으로 정보를 수집 하도록 설정

프로메테우스를 사용하기 위해 build.gradle 에 추가한다.

implementation 'io.micrometer:micrometer-registry-prometheus' // prometheus 추가

그리고 액츄에이터를 보면 /actuator/prometheus 하위에 프로메테우스가 추가된다.

그리고 prometheus.yml 에 매트릭 수집을 위한 설정추가

	#추가
  - job_name: "spring-actuator" # job이름 아무거나 가능
    metrics_path: '/actuator/prometheus' # 타켓서버 수집 url
    scrape_interval: 1s #수집주기 보통 10초~1분
    static_configs:
      - targets: ['localhost:8080'] # 타켓서버 주소

 위 설정을 바탕으로 1초 마다 localhost:8080으로 떠있는 스프링부트 어플리케이션에 접속하여 '/actuator/prometheus' 에 있는 매트릭 정보를 수집한다.

 

그리고 정보 보기가 불편하기 때문에 그라파나를 설치한다.

https://grafana.com/grafana/download

 

Download Grafana | Grafana Labs

Overview of how to download and install different versions of Grafana on different operating systems.

grafana.com

압축을 푼 곳에서 bin 폴더로 이동 후 grafana-server.exe 실행

실행시 localhost:3000 기본포트이고 최초접속은 admin / admin 이다.

최초 접속 화면 모습

프로메테우스에 접근하기 위해 Data Source를 설정한다.

참고로 프로메테우스가 아닌 직접 DB(Mysql)을 연결하여 대시보드를 생성하고 보여주고 싶다면 연결하면 된다!!

그리고 대시보드의 경우 직접 하나씩 등록도 가능하고 이미 다른사람이 만들어서 공유해둔 대시보드를 사용도 가능하다.

https://grafana.com/grafana/dashboards

 

Dashboards | Grafana Labs

 

grafana.com

 

대시보드를 import 한다.

import 선택창

대시보드가 적용된 모습

공유받은 대시보드 적용모습

불러온 대시보드를 수정하고 싶다면..? 설정에서 변경해주면된다.

대시보드 수정

많이 사용되고 유용한 대시보드 2개!

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

 

JVM (Micrometer) | Grafana Labs

Edit Delete Confirm Cancel

grafana.com

 

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

 

Spring Boot 2.1 System Monitor | Grafana Labs

Edit Delete Confirm Cancel

grafana.com

 

중요한점은 프로메테우스로 메트릭 정보를 수집하고 그라파나로 실시간 또는 대략적인 지표를 확인하는데 사용가능 하다는 점이다.

여러가지 이유로 100% 신뢰 할 수 있는 지표는 아니지만 운영하는데 문제를 발견하는 방향으로 사용한다면 90% 이상의 신뢰성을 가진 모니터링 툴이 되는 것이다..!

반응형