모니터링의 중요성
현대의 애플리케이션은 단순한 프로그램을 넘어
수많은 사용자 요청을 실시간으로 처리하고,
다양한 서버, 데이터베이스, API 등과 상호작용하는 복잡한 구조를 가지고 있다.
이런 환경에서는 모니터링이 선택이 아닌 필수다.
모니터링이 중요한 이유
- 문제의 조기 탐지
- 에러, 성능 저하, 장애 등을 실시간으로 파악하여 빠르게 대응할 수 있다.
- 예시 : 서버 CPU가 과부하되기 직전에 알림을 받아 서비스 중단을 방지한다.
- 사용자 경험 개선
- 느린 응답, 접속 오류 등 사용자 불편 요소를 신속히 해결함으로써 사용자 만족도를 높일 수 있다.
- 예시 : 특정 페이지 로딩 속도가 느리다면 해당 부분만 집중적으로 개선한다.
- 운영 비용 절감
- 문제가 커지기 전에 대응하면 리소스 낭비와 장애 복구 비용을 줄일 수 있다.
- 데이터 기반 의사결정
- 데이터를 분석하여 향후 개발 및 인프라 계획에 반영할 수 있다.
- 예시
- 어떤 기능이 많이 사용되는가?
- 언제 트래픽이 몰리는가?
- 보안 강화
- 이상 징후를 실시간 감지하여 보안 사고를 예방할 수 있다.
- 예시 : 비정상적인 트래픽
모니터링 도구
- 로그 수집
- ELK Stack
- Graylog
- 성능 모니터링
- Prometheus
- Grafana
- 에러 추적
- Sentry
- Datadog
- 인프라 상태 감시
- Zabbix
- Nagios
Micrometer
정의
- 스프링 부트 기반 애플리케이션에서 많이 활용되는 모니터링 라이브러리
- Spring Boot 2.0부터 기본적으로 통합되어 있다.
- 다양한 모니터링 시스템에 메트릭 데이터를 쉽게 전송할 수 있도록 해준다.
- 공식 사이트
특징
- 다양한 백엔드 지원
- Prometheus, Datadog, New Relic, Graphite 등 여러 시스템과 통합 가능
- 벤더 중립적 API
- 하나의 코드로 다양한 모니터링 도구에 적용 가능
- 타이머, 카운터 등 풍부한 메트릭 타입 제공
- 시간 측정, 요청 횟수, 현재 값 등을 다양한 방식으로 수집
- Spring Boot 통합
spring-boot-actuator
와 연동하여 손쉽게 모니터링 구성 가능
- 태그(Tag) 기반 메트릭
- 메트릭에 태그를 추가하여 세부 분석 가능
장점
- Spring Boot와의 완벽한 통합
- Spring Actuator와 함께 사용할 경우 거의 설정만으로 사용할 수 있다.
- 다양한 모니터링 시스템에 대응
- 특정 모니터링 도구에 종속되지 않고 필요 시 교체가 쉽다.
- 경량 라이브러리
- 성능에 큰 영향을 주지 않으면서도 필요한 정보를 수집한다.
- 표준화된 API
- 일관된 방식으로 메트릭을 수집할 수 있어 유지보수가 쉽다.
단점
- 복잡한 메트릭 구조
- 태그를 많이 쓰면 메트릭 수가 폭발적으로 늘어나 관리가 어려워진다.
- 초기 설정과 튜닝 필요
- 다양한 백엔드를 지원하지만 각각에 맞는 설정이 필요하다.
- 실시간 로그/트레이스 제공은 어렵다.
- Micrometer는 메트릭 수집 전용이다.
- 로그나 트레이스 기능은 별도의 도구가 필요하다.
- Zipkin이나 Sleuth가 해당된다.
자주 사용되는 조합
- Prometheus
- 메트릭 수집 및 저장
- Grafana
- 시각화 대시보드
- Spring Boot Actuator
- 애플리케이션 상태/메트릭 제공
- Alertmanager
- 알림 시스템 구성
Prometheus (프로메테우스)
정의
- 시계열(Time Series) 데이터 기반의 모니터링 및 알림 시스템
- Cloud Native Computing Foundation(CNCF)에 의해 관리된다.
- 컨테이너 기반의 마이크로서비스 환경에서 많이 사용된다.
특징
- 시계열 기반 저장
- 시간 단위로 메트릭 데이터를 저장하고 분석한다.
- Pull 방식 수집
- 모니터링 대상 애플리케이션이 메트릭을 노출하면, Prometheus가 주기적으로 가져간다.
- 자체 데이터베이스 내장
- 외부 DB 없이도 데이터를 저장할 수 있다.
- PromQL 지원
- 강력한 쿼리 언어를 통한 유연한 데이터 조회
- PromQL : Prometheus Query Language
- 다양한 Exporter 제공
- 시스템, DB, 애플리케이션 등 다양한 메트릭을 수집할 수 있다.
- 알림 시스템 연동
- Alertmanager와 함께 사용하면 알림을 설정할 수 있다.
장점
- 오픈소스 & 무료
- 비용 부담 없이 사용 가능하다.
- 활발한 커뮤니티 지원이 있다.
- Kubernetes 최적화
- 서비스 디스커버리, 파드 상태 수집 등 쿠버네티스 환경에 최적화되어 있다.
- 유연한 데이터 수집
- 기본 방식은 Pull 방식이다.
- Pushgateway를 통해 Push도 가능하다.
- 확장성 높은 아키텍처
- Exporter, Alertmanager, Grafana 등과 유연하게 연동할 수 있다.
- 시각화 도구와 연계 가능
- Grafana 등과 연동해 직관적인 대시보드를 구성할 수 있다.
단점
- 장기 데이터 보존 한계
- 자체 DB는 장기 저장에 적합하지 않다.
- 수일에서 수주 정도 저장된다.
- 장기 보존을 위헤서는 외부 저장소와의 연동이 필요하다.
- 복잡한 설정
- PromQL이나 알림 규칙은 초보자에게는 학습 곡선이 있다.
- 보안 기능 부족
- 기본적으로 인증, 암호화 등의 보안 기능이 내장되어 있지 않다.
- 역방향 프록시가 필요하다.
- 스케일링 어려움
- 고가용성(HA)나 수평 확장을 위해선 Thanos, Cortex 등의 추가 구성이 필요하다.
자주 사용되는 조합
- Grafana
- 시각화 대시보드
- Alertmanager
- 알림 관리 (Slack, Email, Webhook 등)
- Node Exporter
- 시스템 메트릭 수집 (CPU, 메모리 등)
- Kube-State-Metrics
- 쿠버네티스 리소스 상태 수집
- Pushgateway
- Push 방식 메트릭 수집을 위한 중간 지점
Grafana (그라파나)
정의
- 다양한 데이터 소스를 연결하여 시각적 대시보드를 구성하고 모니터링할 수 있는 오픈소스 시각화 도구
특징
- 다양한 시각화
- 그래프, 차트, 게이지, 히트맵 등 다양한 위젯 지원
- 다중 데이터 소스 지원
- Prometheus, Graphite, Loki, MySQL, Elasticsearch 등과 연동 가능
- 사용자 및 권한 관리
- 조직 기반 사용자 관리, 뷰/편집 권한 설정
- 플러그인 시스템
- 커뮤니티 플러그인을 통해 새로운 시각화 도구나 소스 추가 가능
- 알림 기능
- 특정 조건을 기준으로 Slack, 이메일 등으로 알림 전송 가능
- 대시보드 템플릿
- JSON 기반으로 공유 및 재사용 가능
장점
- 사용자 친화적 UI
- 드래그 앤 드롭 방식의 대시보드 구성
- 손쉬운 시각화 설정
- 오픈소스
- 무료 사용 가능
- 커뮤니티
- 커뮤니티를 통해 다양한 대시보드 공유 가능
- 강력한 확장성
- 플러그인, API, 템플릿 등을 활용해 기능 확장 가능
- 모든 메트릭 통합 관리
- 다양한 시스템에서 수집한 데이터를 하나의 화면에서 통합 모니터링
- 실시간 모니터링
- 실시간 데이터 갱신과 알림 설정으로 장애 빠르게 감지 가능
단점
- 복잡한 쿼리 필요
- 시각화를 위해 PromQL, SQL, Lucene 등 데이터 소스별 쿼리를 알아야 한다.
- 대규모 구성 시 성능 이슈
- 수많은 대시보드와 패널이 있으면 브라우저나 서버에 부담이 증가한다.
- 데이터 자체는 저장하지 않음
- Grafana는 시각화 도구일 뿐 데이터는 저장하지 않는다.
- 데이터 저장은 별도 백엔드가 필요하다.
- 초기 설정 필요
- 다양한 설정이 가능한 대신에, 처음 접하는 사람에겐 진입장벽이 있다.
자주 사용되는 조합
- Prometheus
- 메트릭 수집
- Loki
- 로그 수집 및 시각화
- InfluxDB
- 시계열 데이터 저장
- Alertmanager
- Grafana 알림 보완
- Telegraf
- 다양한 시스템 메트릭 수집
Spring Boot와 Prometheus 연동하기
build.gradle
모니터링을 하려는 애플리케이션의 build.gradle에
아래와 같이 의존성을 추가하자.
// Monitoring
implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
환경설정
모니터링을 하려는 애플리케이션의 환경설정 파일을 수정하자.
management:
endpoints:
web:
exposure:
include: ..., prometheus, metrics
모니터링을 하려면 관련 정보를 빈으로 등록해줘야 한다.
만약 @Timed
애노테이션을 사용하고자 한다면 아래와 같이 등록하면 된다.
@Configuration
public class TimedConfig {
@Bean
public TimedAspect timedAspect(MeterRegistry meterRegistry) {
return new TimedAspect(meterRegistry);
}
}
모니터링 대상 지정하기
@Timed
애노테이션을 통해 모니터링 대상으로 지정한다.
아래는 예시 코드다.
@GetMapping("/welcome")
@Timed(value = "user.welcome")
public String welcome() {
log.info("[UserContoller] welcome");
return "welcome";
}
@Timed 애노테이션은
해당 메서드가 호출될 때마다 실행 시간을 측정하고
이를 메트릭으로 수집할 수 있게 해준다.
@Timed 애노테이션의 속성 설명
- value
- 메트릭 이름을 지정
- 예사 :
user.welcome
- longTask
- @Timed은 기본적으로 완료 시간을 측정한다.
- longTask가 true라면 실행 시간을 측정한다.
- description
- 메트릭에 대한 설명 작성
- extraTags
- 필터링 및 분석에 활용할 추가 태그 목록
- percentiles
- 퍼센타일 측정 여부 설정
- histogram
- 히스토그램 활성화 여부 설정
- serviceLevelObjectives
- 요청 처리 시간 목표값 설정
metrics 확인
서버를 실행해서 브라우저로 /actuator/metrics
에 접속했을 때
내가 지정한 태그가 있는지 확인해보자.
위 경우에서는 user.welcome
이 있으면 된다.
만약에 안 나온다면 해당 메소드를 한 번 실행해주자.
메트릭은 실제로 수집된 후에만 등록된다.
브라우저로 /actuator/prometheus
에 접속해보면
프로메테우스에서 데이터를 어떤 형태로 수집하는지
확인할 수 있다.
Prometheus와 Grafana 연동하기
Prometheus 설치 (Windows OS 기준)
- 다운로드 페이지로 이동한다.
- windows 버전을 다운로드 받는다.
- 본인이 관리하기 편한 곳에 다운로드 받은 파일을 옮겨서 압축 해제 한다.
Prometheus 환경설정
prometheus.yml 파일을 수정한다.
scrape_configs
하위에 데이터를 수집할 매트릭스를 연결한다.
scrape_configs:
- job_name: 'user-service'
scrape_interval: 15s
metrics_path: '/user-service/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
scrape_interval는 수집 기준이다.
15s는 15초마다 데이터를 수집하는 것을 의미한다.
metrics_path는 프로메테우스에 대한
매트릭스를 반환하는 경로를 작성하면 된다.
static_configs는 매트릭스를 수집할
서버에 대한 정보를 작성하면 된다.
Prometheus 서버 실행
prometheus.exe
를 직접 실행하거나,
CMD에서 ./prometheus --config.file=prometheus.yml
를 실행하면 된다.
서버가 실행되면 브라우저로 http://127.0.0.1:9090/
에 접속해보자.
프로메테우스 대시보드를 확인할 수 있다.
Grafana 설치 (Windows OS 기준)
- 다운로드 페이지로 이동한다.
- zip 파일을 다운로드한다.
- installer 버전도 있다.
- 본인이 관리하기 편한 곳에 다운로드 받은 파일을 옮겨서 압축 해제 한다.
Grafana 서버 실행
Prometheus는 폴더 안에 바로 서버를 실행할 수 있는 파일이 있지만,
Grafana는 좀 더 파고 들어가야 한다.
zip 파일이라면 내부의 .\bin\grafana-server.exe
를 실행하면 되고,
만약 installer로 설치했다면
C:\Program Files\GrafanaLabs\grafana\bin\grafana-server.exe
를
실행하면 된다.
서버가 실행되면 브라우저로 http://127.0.0.1:3000/
에 접속해보자.
그라파나 대시보드를 확인할 수 있다.
대시보드에 들어가보면 로그인이 필요한데,
초기 계정은 admin / admin
으로 로그인하면 된다.
실제로 사용할 때는 비밀번호를 변경하자.
데이터 소스 연동하기
좌측 메뉴에서
Connections
메뉴 하위에 있는
Add new connection
을 선택하자.
Connection
에 프로메테우스 서버의 주소를 입력하자.
이제 최하단으로 내려와서
Save & test
를 통해 설정을 저장한 뒤,
위와 같이 Successfully queried the Prometheus API.
가 나오면 성공이다.
대시보드 설정하기
좌측 메뉴에서
Dashboards
를 선택한 뒤에
Create dashboard
를 선택하자.
1번을 통해 대시보드 저장소에서 본인이 사용하고 싶은 대시보드를 검색한다.
2번에 선택한 대시보드의 주소나 ID를 입력한다.
3번을 클릭해서 저장소 정보를 저장한다.
1번을 통해 프로메테우스를 선택한다.
2번을 클릭해서 설정을 저장하면 성공이다.