스프링 클라우드 슬루스와 프로메테우스를 활용한 분산 모니터링 방법

스프링 클라우드 슬루스란?

분산 시스템에서 서비스의 연관성과 서로 간의 의존성 분석을 효과적으로 할 수 있도록 지원하는 오픈소스 분산 추적 시스템인 스프링 클라우드 슬루스(Spring Cloud Sleuth)는 스프링 클라우드 프로젝트의 일환으로 개발되었습니다. 스프링 클라우드 슬루스는 Zipkin과 연동하여 서비스 간 호출 관계를 추적하고, 이를 시각화하여 볼 수 있도록 도와줍니다.

Spring Cloud Sleuth

스프링 클라우드 슬루스는 애플리케이션에서 발생하는 요청에 대한 Trace ID, Span ID 등의 메타데이터를 수집하여 Zipkin 서버로 전송합니다. 이를 통해 애플리케이션의 분산 시스템의 서비스 간 호출 관계 추적을 효과적으로 할 수 있습니다.

또한 스프링 클라우드 슬루스는 MDC(Mapped Diagnostic Context)를 지원하며, 로깅 시 Trace ID와 Span ID를 함께 기록하여 로그 분석 시 추적을 용이하게 합니다.

프로메테우스란?

프로메테우스(Prometheus)는 오픈소스 시스템 모니터링 및 경보(alerting) 시스템으로, Google의 Borgmon을 기반으로 개발되었습니다. 프로메테우스는 간단하고 모듈식으로 설계되어 있어, 대규모 분산 시스템에서도 효과적으로 사용할 수 있습니다.

Prometheus

프로메테우스는 클라이언트 라이브러리를 제공하여, 애플리케이션에서 발생하는 메트릭(metric)을 수집할 수 있습니다. 또한, 서버 측에서는 수집된 메트릭을 저장하고, 쿼리하여 조회할 수 있습니다.

프로메테우스는 강력한 쿼리 언어인 PromQL을 제공하여, 다양한 메트릭에 대한 쿼리를 쉽게 작성할 수 있습니다. 또한, 대시보드를 제공하여 시각적으로 메트릭을 확인할 수 있습니다.

분산 모니터링 방법론

분산 시스템에서 애플리케이션의 상태를 모니터링하는 것은 매우 중요합니다. 하지만, 분산 시스템에서는 여러 서비스가 상호작용하고, 서비스 간 호출 관계가 복잡해지기 때문에, 모든 서비스의 로그를 분석하는 것은 어렵습니다.

이러한 문제를 해결하기 위해, 분산 추적 시스템과 메트릭 수집 시스템을 함께 사용하여 분산 모니터링을 수행할 수 있습니다.

분산 추적 시스템은 서비스 간 호출 관계를 추적하고, 이를 시각화하여 볼 수 있도록 도와줍니다. 또한, 로깅 시 Trace ID와 Span ID를 함께 기록하여 로그 분석 시 추적을 용이하게 합니다.

메트릭 수집 시스템은 애플리케이션의 상태를 측정하여, 이를 저장하고, 쿼리하여 조회할 수 있도록 도와줍니다. 메트릭을 수집하면, 애플리케이션의 성능, 가용성 등을 모니터링할 수 있습니다.

스프링 클라우드 슬루스와 프로메테우스 활용하기

스프링 클라우드 슬루스와 프로메테우스는 각각 분산 추적 시스템과 메트릭 수집 시스템으로, 이 두 시스템을 함께 사용하여 분산 모니터링을 수행할 수 있습니다.

스프링 클라우드 슬루스는 Zipkin과 연동하여 서비스 간 호출 관계를 추적하고, 이를 시각화하여 볼 수 있도록 도와줍니다. 또한, MDC를 지원하여 로깅 시 Trace ID와 Span ID를 함께 기록하여 로그 분석 시 추적을 용이하게 합니다.

프로메테우스는 클라이언트 라이브러리를 제공하여, 애플리케이션에서 발생하는 메트릭을 수집할 수 있습니다. 또한, 서버 측에서는 수집된 메트릭을 저장하고, 쿼리하여 조회할 수 있습니다.

스프링 클라우드 슬루스와 프로메테우스를 함께 사용하면, 애플리케이션의 상태를 종합적으로 모니터링할 수 있습니다. 스프링 클라우드 슬루스를 이용하여 서비스 간 호출 관계를 추적하고, 프로메테우스를 이용하여 메트릭을 수집하여 저장하고, 쿼리하여 조회할 수 있습니다.

스프링 클라우드 슬루스와 프로메테우스 연동하기

스프링 클라우드 슬루스와 프로메테우스를 연동하기 위해서는, 스프링 부트 애플리케이션에 프로메테우스 클라이언트 라이브러리를 추가해야 합니다.

먼저, build.gradle에 프로메테우스 클라이언트 라이브러리를 추가합니다.

implementation 'io.prometheus:simpleclient_spring_boot:0.11.0'
implementation 'io.prometheus:simpleclient_hotspot:0.11.0'

다음으로, 애플리케이션 클래스에 @EnablePrometheusEndpoint@EnableSpringBootMetricsCollector 어노테이션을 추가합니다.

@SpringBootApplication
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

이제 애플리케이션을 실행하면, http://localhost:8080/actuator/prometheus 엔드포인트를 통해 메트릭을 조회할 수 있습니다.

$ curl http://localhost:8080/actuator/prometheus
# HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process
# TYPE process_cpu_usage gauge
process_cpu_usage 0.03299999999999999
# HELP process_start_time_seconds Start time of the Java Virtual Machine process
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.628565525548E9
# HELP process_uptime_seconds The uptime of the Java virtual machine
# TYPE process_uptime_seconds gauge
process_uptime_seconds 3.168
# HELP jvm_gc_pause_seconds Time spent in GC pause
# TYPE jvm_gc_pause_seconds summary
...

이제 스프링 클라우드 슬루스와 프로메테우스를 연동하기 위해, application.properties에 다음과 같이 설정합니다.

spring.sleuth.sampler.probability=1.0
spring.zipkin.base-url=http://localhost:9411
management.endpoint.metrics.enabled=true
management.metrics.export.prometheus.enabled=true

이제 스프링 부트 애플리케이션을 실행하면, 스프링 클라우드 슬루스와 프로메테우스가 함께 실행되며, 서비스 간 호출 관계와 메트릭을 모니터링할 수 있습니다.

결론

스프링 클라우드 슬루스와 프로메테우스를 함께 사용하여, 분산 시스템에서 애플리케이션의 상태를 종합적으로 모니터링할 수 있습니다. 스프링 클라우드 슬루스를 이용하여 서비스 간 호출 관계를 추적하고, 프로메테우스를 이용하여 메트릭을 수집하여 저장하고, 쿼리하여 조회할 수 있습니다. 이를 통해, 분산 시스템에서 발생하는 문제를 빠르게 파악하고, 대응할 수 있습니다.