스프링 부트와 슬루스를 활용한 분산 추적 시스템 개발: 로그 분석 및 모니터링

스프링 부트와 슬루스: 분산 추적 시스템 구축

스프링 부트는 개발자들이 빠르게 웹 애플리케이션을 만들 수 있도록 지원하는 프레임워크이다. 분산 시스템에서는 여러 대의 서버를 이용하기 때문에 각 서버의 상태를 파악하는 것이 중요하다. 이를 위해서는 분산 추적 시스템을 구축해야 한다. 스프링 부트와 슬루스를 활용하면 분산 추적 시스템을 구축할 수 있다.

슬루스(Sleuth)는 스프링 클라우드에서 지원하는 분산 추적 시스템이다. 슬루스는 모든 서버의 로그를 수집하고 분석하여 시스템 전체적으로 어떤 일이 일어나고 있는지 파악할 수 있도록 도와준다. 슬루스는 각 서버에 고유한 ID를 부여하여 서버 간의 통신을 추적할 수 있도록 한다.

이번 글에서는 스프링 부트와 슬루스를 활용하여 분산 추적 시스템을 구축하는 방법에 대해 알아보겠다.

분산 시스템

로그 분석과 모니터링: 기능과 필요성

로그 분석과 모니터링은 분산 시스템에서 매우 중요한 기능이다. 로그 분석은 시스템에서 발생하는 로그를 분석하여 각 서버의 상태를 파악하고, 문제가 발생하였을 때 원인을 찾기 위한 기능이다. 모니터링은 시스템의 상태를 지속적으로 모니터링하여 여러 이슈를 빠르게 파악하고 대응할 수 있도록 도와준다.

분산 시스템에서는 여러 대의 서버를 이용하기 때문에 각 서버의 로그를 수집하고 분석하는 것이 중요하다. 이를 위해서는 분산 추적 시스템을 구축해야 한다. 스프링 부트와 슬루스를 활용하면 분산 추적 시스템을 구축할 수 있으며, 이를 통해 로그 분석과 모니터링을 수행할 수 있다.

개발자를 위한 스프링 부트와 슬루스 활용법

스프링 부트 프로젝트 생성

먼저 스프링 부트 프로젝트를 생성해야 한다. 스프링 부트 프로젝트를 생성하기 위해서는 스프링 부트 스타터 사이트에서 프로젝트 종류와 의존성을 선택한 후, 생성된 프로젝트를 다운로드 받으면 된다. 이번 예제에서는 Gradle을 사용하여 스프링 부트 프로젝트를 생성한다.

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
}

test {
    useJUnitPlatform()
}

슬루스 설정

슬루스를 활용하기 위해서는 슬루스를 설정해야 한다. 설정은 application.properties 파일에서 수행할 수 있다.

spring.application.name=my-application
spring.sleuth.sampler.probability=1.0
logging.level.org.springframework.cloud.sleuth=DEBUG
  • spring.application.name: 각 서버에 부여될 이름을 지정한다.
  • spring.sleuth.sampler.probability: 추적할 확률을 지정한다. 1.0은 모든 요청에 대해 추적을 수행함을 의미한다.
  • logging.level.org.springframework.cloud.sleuth: 로그 레벨을 지정한다. 이 설정을 통해 슬루스가 생성한 로그를 확인할 수 있다.

추적 정보 확인

슬루스를 활용하여 추적 정보를 확인하려면 로그를 확인하면 된다. 슬루스가 생성한 로그는 [application-name]-[trace-id].log 형식으로 저장된다. 로그를 확인하여 서버 간의 통신 정보와 각 서버의 상태를 파악할 수 있다.

2020-11-05 10:16:21.021 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.sleuth.instrument.web.TraceFilter  : Received a request to uri [/orders/1] that should not be sampled.
2020-11-05 10:16:21.063 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Handling span [Trace: 3c3b2c1f5cd3b9e3, Span: 3c3b2c1f5cd3b9e3, Parent: null, exportable:false]
2020-11-05 10:16:21.064 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a method tag with value [getOrder]
2020-11-05 10:16:21.064 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a class tag with value [OrderController]
2020-11-05 10:16:21.064 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a uri tag with value [/orders/{id}]
2020-11-05 10:16:21.066 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a status tag with value [200]
2020-11-05 10:16:21.067 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a method tag with value [getOrder]
2020-11-05 10:16:21.067 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a class tag with value [OrderController]
2020-11-05 10:16:21.068 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a uri tag with value [/orders/{id}]
2020-11-05 10:16:21.068 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Handling span [Trace: 3c3b2c1f5cd3b9e3, Span: e3d3b3b58b412d96, Parent: 3c3b2c1f5cd3b9e3, exportable:false]
2020-11-05 10:16:21.068 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a method tag with value [getOrder]
2020-11-05 10:16:21.068 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a class tag with value [OrderController]
2020-11-05 10:16:21.068 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a uri tag with value [/orders/{id}]
2020-11-05 10:16:21.069 DEBUG [order-service,3c3b2c1f5cd3b9e3,3c3b2c1f5cd3b9e3,false] 14168 --- [nio-8080-exec-1] o.s.c.s.instrument.web.TraceHandlerInterceptor  : Adding a status tag with value [200]

로그에서는 Trace ID와 Span ID를 확인할 수 있다. Trace ID는 서버 간의 통신을 추적하는 데 사용되고, Span ID는 특정 서버에서 수행된 작업을 추적하는 데 사용된다. Trace ID와 Span ID를 이용하여 각 서버의 상태를 파악할 수 있다.

결론

이번 글에서는 스프링 부트와 슬루스를 활용하여 분산 추적 시스템을 구축하는 방법에 대해 알아보았다. 스프링 부트와 슬루스를 활용하면 분산 시스템에서 각 서버의 상태를 파악할 수 있으며, 로그 분석과 모니터링을 수행할 수 있다. 스프링 부트와 슬루스를 활용하여 안정적인 분산 시스템을 구축해 보자.

분산 시스템