Spring Boot Actuator : 어플리케이션의 상태, 성능을 점검할 수 있도록 다양한 엔드포인트 제공 / 메트릭 데이터를 수집, 제공
Prometheus : 수집된 메트릭을 보관할 DB
Grafana : 수집된 메트릭을 시각화 할 대시보드
메소드의 에러, 성능 병목 현상, 리소스 낭비 절약
로그 분석으로 이상 징후 등 식별
- 사용자가 에러를 발견 후 신고하기 전에 우리가 식별해야 한다!
요청이 많아지는 순간을 알림으로 받고, 예상하여 어플리케이션 확장 등으로 대응
백엔드 개발자인 우리에게 제일 중요한 부분!Spring Boot 애플리케이션의 상태와 성능을 모니터링하고 관리할 수 있도록 다양한 엔드포인트를 제공하는 기능
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
Actuator는 기본적으로 여러 엔드포인트를 제공합니다. 이러한 엔드포인트는 /actuator 경로 하위에 위치하며, 각각의 엔드포인트는 다양한 정보를 제공합니다.
spring.application.name=sample
server.port=8080
#모든 엔드포인트 노출 설정
management.endpoints.web.exposure.include=*
#헬스 체크 엔드포인트 상세 정보 표시 설정
management.endpoint.health.show-details=always
# 이 설정은 /actuator/health 엔드포인트에서 헬스 체크 정보를 항상 상세히 보여주도록 설정합니다. 기본적으로, 헬스 체크 엔드포인트는 요약된 상태 정보만 제공하며, 상세 정보는 노출되지 않습니다.
# never: 헬스 체크 상세 정보를 절대 표시하지 않습니다.
# always: 모든 사용자에게 헬스 체크 상세 정보를 항상 표시합니다.
# when_authorized: 인증된 사용자에게만 헬스 체크 상세 정보를 표시합니다.
모든 엔드포인트를 노출하는 것은 운영 환경에서 위험하다. 필요한 엔드포인트만 노출하고, 항상 노출하는 것 보다는 인증된 사용자에게 노출하자
# 애플리케이션의 기본 포트를 8080으로 설정
server.port=8080
# Actuator 엔드포인트를 19090 포트에서 서비스하도록 설정
management.server.port=19090
Spring Security를 사용하여 민감한 엔드포인트에 접근 제어를 설정
예를 들어, /actuator 경로에 대한 보안 설정을 추가
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// /actuator/ 하위의 모든 접근은 authenticated 필요
http.authorizeRequests()
.antMatchers("/actuator/**").authenticated()
.and()
.httpBasic();
}
}
예시: Node Exporter (서버의 시스템 메트릭 수집), PostgreSQL Exporter (PostgreSQL 메트릭 수집), Spring boot의 micrometer-registry-prometheus 디펜던시
예를 들어 배치 작업, 스크립트 실행, 크론 작업 등
데이터를 시각화하기 위해 자주 사용되는 대시보드 도구입니다.Prometheus 의존성 추가
application.properties 추가
management.endpoint.prometheus.enabled=true
http://localhost:8080/actuator/prometheus
에 접속하여 프로메테우스 매트릭스를 확인 가능
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
host.docker.internalhost.docker.internal은 Docker에서 제공하는 특수한 DNS 이름으로, Docker 컨테이너가 호스트 머신(즉, Docker를 실행하는 컴퓨터 / docker로 띄운 프로젝트가 아닌 Spring Boot 프로젝트)의 네트워크 서비스에 접근할 수 있도록 합니다.
이를 통해 컨테이너 내부에서 호스트 머신의 네트워크 주소를 참조할 수 있습니다.
docker run -d --name=prometheus -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
docker run: Docker에서 새로운 컨테이너를 생성하고 실행하는 명령입니다.
-d: 이 옵션은 컨테이너를 백그라운드에서 실행하게 합니다. 즉, 터미널을 차지하지 않고 뒤에서 실행되는 상태를 유지합니다.
--name=prometheus: 생성될 컨테이너의 이름을 prometheus로 지정
-p 9090:9090: Docker 컨테이너의 네트워크 포트 설정입니다.
첫 번째 9090은 호스트 머신(컴퓨터)의 포트이고,
두 번째 9090은 컨테이너 내부에서 Prometheus가 실행되는 포트입니다.
즉, 호스트의 9090 포트로 접속하면, 컨테이너의 9090 포트에서 Prometheus 서비스에 접근할 수 있습니다.
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml: 볼륨을 마운트하는 옵션입니다.
호스트 머신에 있는 설정 파일(/path/to/prometheus.yml)을 컨테이너 내부의 /etc/prometheus/prometheus.yml에 연결합니다. /path/~ 부분은 본인의 프로젝트 경로에 맞게 수정/ (cd 명령으로 promethus로 이동하고, pwd 명령으로 확인할 수 있다.)
Prometheus는 이 파일을 통해 설정을 읽습니다.
호스트에서 설정 파일을 수정하면, 컨테이너 내부에서도 설정이 즉시 반영됩니다.
prom/prometheus: 사용할 Docker 이미지 이름입니다. prom/prometheus는 Prometheus를 실행할 수 있는 이미지를 의미합니다.
요약하자면, 이 명령은 Prometheus를 Docker 컨테이너로 실행하고, 호스트와 포트를 연결해 웹 인터페이스로 접근할 수 있게 하며, 설정 파일을 외부에서 제공하도록 구성한 것입니다.
대시보드를 생성하고, 데이터를 그래프나 차트 형태로 표현하며, 알림 기능을 제공하여 모니터링을 강화할 수 있습니다.위 데이터 소스들을 시각화 할 수 있다.
docker run -d --name=grafana -p 3000:3000 grafana/grafana
docker ps, localhost:3000 으로 확인 > admin/admin으로 로그인
http://host.docker.internal:9090
그라파나도 docker 내부의 컨테이너이므로 host를 찾고, 그 내부의 promethus 찾도록 하는 경로 설정 (스프링 애플리케이션이 호스트 PC에서 실행되어 접근하기 위함)
내부 다른 설정들도 실제 사용 시에는 설정해야 한다.
Create Dashboard 버튼 > import dashboard 를 클릭
그라파나에서 제공하는 대시보드를 사용 / 검색창에 Spring Boot 버전 적절한 것 찾아서 사용 (Id 카피 후 붙여넣기) / import 창에서 19004 클릭, Load / promethus 아래에서 데이터소스 선택 후 Import
