개요
예전에 모니터링을 적용하기 위해 기술 블로그를 통해 정리한 적이 있지만, 이번에 강의를 통해 다시 배운 내용을 정리해 볼 것이다.
모니터링(Monitoring)
시스템, 애플리케이션, 인프라의 성능과 상태를 지속적으로 관찰하고 데이터를 수집하여 이상 징후나 오류를 감지하는 프로세스.
- 문제를 신속하게 해결하고 시스템 가용성을 유지할 수 있다.
주요 목적
- 가용성 확보: 서비스 중단을 방지하고 안정적인 운영 보장
- 성능 최적화: 성능 저하 원인을 발견하고 개선
- 장애 탐지: 시스템 오류 발생 시 빠르게 탐지 및 대응
- 비용 관리: 리소스 사용량을 추적하여 비용 효율성을 개선
종류(범위)
- 시스템 모니터링
- CPU, 메모리, 디스크 사용량 등 인프라 자원을 추적
- 대표 도구: Prometheus, Grafana, Nagios
- 애플리케이션 모니터링(APM)
- 애플리케이션 성능과 트랜잭션 추적
- 대표 도구: New Relic, AppDynamics, Spring Boot Actuator
- 로그 모니터링
- 로그 데이터를 수집하고 분석하여 오류나 이벤트 탐지
- 대표 도구: ELK Stack(Elasticsearch, Logstash, Kibana), Graylog
- 네트워크 모니터링
- 네트워크 트래픽, 대역폭 사용량, 패킷 손실 감시
- 대표 도구: Zabbix, SolarWinds
- 보안 모니터링
- 침입 탐지, 취약점 관리, 보안 이벤트 추적
- 대표 도구: Splunk, Wazuh
모니터링 구성 요소
- 데이터 수집(Agent/Exporter): 시스템 또는 애플리케이션에서 데이터를 수집하는 역할
- 데이터 저장(Database/TSDB): 수집된 데이터를 저장하고 관리
- 데이터 시각화(Dashboard): 데이터를 시각적으로 표시하여 상태를 쉽게 파악
- 알림 및 경고(Alerting): 특정 임계값 초과 시 알림 전송
MSA 프로젝트 모니터링 적용 사례
- Spring Cloud 기반 MSA 프로젝트에 적용할 수 있는 모니터링 도구
- Eureka Server Health Check: 서비스 등록/해제 상태 확인
- Spring Boot Actuator: 애플리케이션 상태 점검(엔드포인트, 메트릭 제공)
- Prometheus & Grafana: 시스템 메트릭 수집 및 시각화
- Zipkin: 분산 추적을 통해 요청 경로 분석
- ELK Stack: 로그 수집 및 검색
Spring Boot 모니터링 도구
Spring Boot Actuator
Spring Boot 애플리케이션의 상태와 성능을 모니터링할 수 있는 라이브러리, 운영 환경에서 애플리케이션의 내부 상태를 확인하고 관리할 수 있는 다양한 엔드포인트를 제공.
주요 기능
- 엔드포인트 제공: 상태 확인(/actuator/health), 메트릭(/actuator/metrics), 로그 수준 조정 등
- 보안 통합: 엔드포인트 접근 권한 관리
- 확장 가능: 사용자 정의 엔드포인트 추가 가능
엔드포인트
- /actuator/health: 애플리케이션 상태 확인
- /actuator/metrics: 메트릭 정보 확인(CPU, 메모리, HTTP 요청 수 등)
- /actuator/env: 환경 변수 확인
사용 방법
- Spring Boot Actuator 의존성 추가(build.gradle)
- Actuator 설정(application.yml)
- 애플리케이션 실행 후 Actuator 엔드포인트 접속 및 확인
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'
application.yml
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
endpoint 접속
Prometheus
오픈소스 시스템 모니터링 및 경고 도구, 주로 시계열(Time-Series) 데이터 수집과 저장을 위해 사용된다.
주요 기능
- 메트릭 수집 및 저장: 시계열 데이터를 효율적으로 관리
- 다양한 Exporter 지원: 애플리케이션 및 인프라 메트릭 수집 가능
- PromQL 언어 지원: 데이터 쿼리 및 분석 가능
- 경고 기능(Alerting): 특정 임계값 초과 시 알림 전송
사용 예시
- Spring Boot Actuator 메트릭 수집
- Kubernetes 클러스터 자원 모니터링
사용 방법
- prometheus 의존성 추가(build.gradle)
- prometheus 설정(yml)
- promethues docker 설치
- 애플리케이션 실행 후 엔드포인트 접속 및 확인
build.gradle
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
application.yml
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
prometheus:
access: unrestricted
- prometheus access
- unrestricted(엔드포인트에 대한 무제한 엑세스 허용)
- read_only(엔드포인트에 대한 읽기 전용 엑세스 허용)
- none(엔드포인트에 대한 엑세스 불가)
promethues.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
prometheus docker 설치 및 실행 명령어
docker run -d --name=prometheus -p 9090:9090 -v Path\prometheus\prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
- Window와 Mac의 Path는 다름(Window는 드라이브부터 Path 입력 및 \ 사용, Mac은 루트 폴더부터 입력 및 / 사용)
docker ps를 통해 정상 실행 확인 및 접속
Grafana
데이터를 시각화하고 대시보드를 생성하는 도구, Prometheus, Loki, InfluxDB 등 다양한 데이터 소스와 통합.
주요 기능
- 대시보드 생성: 실시간 데이터 시각화
- 데이터 소스 통합: Prometheus, Loki, Elasticsearch 등 지원
- 알림 시스템 연동: 특정 임계값에 도달하면 알림 전송
- 유연한 사용자 관리: 역할 기반 권한 관리 지원
사용 예시
- 애플리케이션 성능 대시보드
- 네트워크 트래픽 및 리소스 사용량 시각화
사용 방법
- docker로 grafana 설치
- grafana 엔드포인트 접속
- 로그인(비밀번호 수정)
- 데이터 소스 추가 및 대시보드 설정
docker 명령어
docker run -d --name=grafana -p 3000:3000 grafana/grafana
실행 상태 확인 후 엔드포인트 접속
비밀번호 변경(Skip 가능)
data source 추가
- Connection http://host.docker.internal:{port}로 설정(docker에서 prometheus 실행)
- 저장 및 테스트 성공 버튼을 눌러 확인
Dashboard 생성
Create dashboard → Import Dashboard
- ID(사용하려는 대시보드 ID) 입력 후 Load(grafana.com/dashboards 주소에 접속해서 대시보드 종류 확인 및 ID 복사 가능)
대시보드 확인
- 대시보드에서 애플리케이션 상태를 확인할 수 있다.
Loki
로그 수집 및 관리 시스템으로, Grafana Labs에서 개발한 오픈소스 프로젝트.
Prometheus가 메트릭을 수집하듯이, Loki는 로그 데이터를 수집하지만 메트릭과 달리 텍스트 기반 로그 데이터를 관리.
주요 기능
- 로그 수집 및 저장: 애플리케이션 로그 수집
- 데이터 인덱싱 최소화: 효율적인 로그 저장 구조
- Grafana 통합 지원: 로그 데이터를 대시보드에서 시각화 가능
- 멀티테넌시 지원: 여러 애플리케이션 로그를 중앙 관리
사용 예시
- 애플리케이션 로그 모니터링
- 장애 및 오류 탐지
- Grafana 대시보드에 로그 데이터 시각화
사용 방법
- loki 의존성 추가
- loki 설정(yml)
- docker로 loki 설치
- 애플리케이션 구성
- grafana 설정(data source 추가, 로그 설정)
- 애플리케이션 실행 및 확인
build.gradle
implementation 'com.github.loki4j:loki-logback-appender:1.5.1'
loki-confing.yml
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
instance_addr: 127.0.0.1
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2020-10-24
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
docker loki 설치 명령어
docker run --name loki -d -v Path\loki:/mnt/config -p 3100:3100 grafana/loki:3.0.0 --config.file=/mnt/config/loki-config.yml
- yml 파일이 있는 폴더까지 Path로 입력
컨테이너 실행 확인
애플리케이션 구성
controller
package com.monitor.sample;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
public class SampleController {
private static final Logger logger = LoggerFactory.getLogger(SampleController.class);
@GetMapping("/")
public String hello(HttpServletResponse response) throws IOException {
logger.info("Attempted access to / endpoint resulted in 403 Forbidden");
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied");
return null;
}
}
logback.xml
<configuration>
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<http>
<url>http://localhost:3100/loki/api/v1/push</url>
</http>
<format>
<label>
<pattern>app=my-app,host=${HOSTNAME}</pattern>
</label>
<message class="com.github.loki4j.logback.JsonLayout" />
</format>
</appender>
<root level="DEBUG">
<appender-ref ref="LOKI" />
</root>
</configuration>
- 로그 테스트를 위한 간단한 애플리케이션 구성
애플리케이션 실행 및 endpoint 접속
grafana loki 설정
Exploere 설정
- Labdel - app 설정
- Line contains INFO(로그 설정), Line contanis SampleController(사용하는 컨트롤러) 설정
- Run Query를 눌러 실행 및 로그 확인
정리
- 모니터링의 중요성 및 기능, Spring Boot에서 사용하는 모니터링 도구들을 사용하는 방법에 대해 배웠다.
- 위 도구들을 사용해 애플리케이션의 정보를 간편하게 얻을 수 있고, 설정에 따라 원하는 정보를 얻을 수 있다는 사실을 배웠다.
- 프로젝트에 실제로 적용해 보고 모니터링을 통해 성능 개선이나 오류 해결에 사용하는 경험을 해보고 싶다.
'자바 심화 > TIL' 카테고리의 다른 글
모니터링 - Slack Alert 보내기 (1) | 2024.12.20 |
---|---|
프로젝트 회고 (0) | 2024.12.18 |
Open Route Service API 사용 (1) | 2024.12.16 |
프로젝트 문제 해결(역직렬화, git 에러) (0) | 2024.12.12 |
DDD(Domain-Driven Design) (1) | 2024.12.09 |