본문

와탭모니터링
비동기 애플리케이션 모니터링하는 방법

작성일 2023년 11월 10일
main

비동기 애플리케이션 모니터링하는 방법

비동기 애플리케이션은 동시에 여러 작업을 수행할 수 있으므로, 하나의 작업이 완료되는 동안 다른 작업을 진행할 수 있습니다. 이로 인해 전체 작업의 처리 시간을 단축할 수 있으며 사용자 경험을 향상할 수 있습니다.

비동기 방식은 동기보다 복잡하지만, 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있습니다. 비동기 애플리케이션의 분산되고 이벤트 중심적인 특성은 효율성 측면에서 많은 장점은 있지만 복잡도가 높아져 애플리케이션 모니터링하는데 어려움을 갖고 있습니다. 비동기 애플리케이션 모니터링의 몇 가지 어려움은 다음과 같습니다.

왜 비동기 애플리케이션 모니터링이 어렵나?

  • 순차적 추적의 어려움: 비동기식 워크플로우는 선형적이고 순차적인 경로를 따르지 않기 때문에 실행 흐름을 추적하기가 어렵습니다. 기존 모니터링 도구는 애플리케이션 프로세스에 대한 명확한 엔드투엔드 뷰를 제공하지 못할 수 있습니다.
  • 복잡한 이벤트 처리: 비동기 애플리케이션은 상호 관련된 이벤트와 트리거가 많은 복잡한 이벤트 중심 아키텍처를 포함하는 경우가 많습니다. 이러한 이벤트와 그 종속성을 모니터링하는 것은 쉽지 않을 뿐만 아니라 애플리케이션 성능에 어떤 영향을 미치는지 이해하는 것도 어려울 수 있습니다.
  • 확장성 및 병렬 처리: 비동기식 애플리케이션은 높은 수준의 동시성 및 병렬 처리를 처리하도록 설계되었습니다. 모니터링 도구는 성능에 영향을 주지 않으면서 여러 동시 프로세스 및 스레드에서 데이터를 수집할 수 있도록 적절히 확장되어야 합니다.
  • 지연 시간 및 비동기 호출: 비동기 워크플로우에서 지연 시간을 추적하기는 까다로울 수 있습니다. 비동기 작업은 여러 단계와 대기 시간이 포함될 수 있기 때문에 동기 작업보다 완료하는 데 걸리는 시간을 측정하는 것이 더 어려울 수 있습니다.
  • 데이터의 세분성: 일부 모니터링 도구는 높은 수준의 지표를 제공할 수 있지만 비동기 워크플로우 내에서 세분화된 세부 정보를 이해하기도 어려울 수 있습니다. 비동기 작업 실행에 대한 자세한 데이터를 캡처할 수 있는 도구가 필수적입니다.
  • 이벤트 순서: 비동기 시스템에서 이벤트의 올바른 순서를 보장하는 것은 매우 중요합니다. 모니터링 도구는 순서가 맞지 않거나 지연된 이벤트와 관련된 문제를 식별하고 해결하는 데 도움이 되어야 합니다.
  • 병목 현상 파악: 비동기 시스템에서 성능 병목 현상을 감지하는 것은 워크플로우의 여러 부분에서 속도 저하가 발생할 수 있으므로 복잡할 수 있습니다. 효과적인 모니터링은 병목현상의 정확한 위치를 찾아내는 데 도움이 되어야 합니다.
  • 오류 처리 및 예외 추적: 비동기 애플리케이션에서 오류와 예외를 처리하는 것은 오류가 비동기적으로 전파될 수 있기 때문에 까다로운 작업입니다. 모니터링 도구는 오류 처리에 대한 인사이트를 제공하고 문제를 식별하고 해결하는 데 도움을 주어야 합니다.
  • 분산 시스템: 비동기 애플리케이션에는 여러 구성 요소가 서로 다른 서버에서 실행되는 분산 시스템이 포함되는 경우가 많습니다. 이러한 분산된 구성 요소를 모니터링하고 상호 작용을 추적하는 것은 복잡할 수 있습니다.
  • 장기 실행 작업: 일부 비동기 작업은 장기간 실행될 수 있으며, 이러한 장기 실행 작업의 리소스 소비 및 상태를 모니터링하는 것은 애플리케이션 성능을 유지하는 데 매우 중요할 수 있습니다.
  • 데이터 볼륨 및 보존: 비동기 애플리케이션은 특히 이벤트 로그에서 상당한 양의 데이터를 생성할 수 있습니다. 모니터링 도구는 생성되는 데이터의 양을 처리하고 데이터 보존 및 집계를 위한 메커니즘을 제공해야 합니다.
  • 이상 징후 탐지: 비동기 애플리케이션의 이상 징후를 식별하는 것은 예상되는 동작이 잘 정의되어 있지 않을 수 있기 때문에 어려울 수 있습니다. 모니터링 도구는 고급 이상 징후 탐지 기술을 사용하여 예기치 않은 패턴과 표준에서 벗어난 편차를 식별해야 합니다.

이러한 문제를 해결하려면 비동기 애플리케이션용도 트랜잭션 추적이 가능한 솔루션을 사용해야 하는데요. 와탭 애플리케이션은 어떻게 비동기 애플리케이션 분산 추적이 가능한 걸까요?

와탭은 어떻게 비동기 애플리케이션 모니터링을 지원하나?

와탭은 Java 바이트코드를 조작하여 오픈소스 라이브러리 또는 프레임워크를 추적합니다. 예를 들어 reactor 기반의 spring-webflux를 추적하기 위해 바이트코드 조작과 reactor 라이브러리가 제공하고 있는 Operator를 활용하여 오픈소스 라이브러리에 추적 코드를 추가하여 트랜잭션 추적하고 있습니다.

애플리케이션을 비동기로 구성하는 경우 하나의 트랜잭션에서 복수의 비동기 오픈소스를 활용하는 경우가 많은데요. 예로 spring-boot 웹 트랜잭션에서 tomcat, spring-cloud-gatway, redis, kafka, r2dbc 등을 호출하는 경우가 빈번합니다. 이럴 때 와탭 자바에이전트는 각 오픈소스 라이브러리에 추적 코드를 추가하여 비동기 트랜잭션을 연계추적하여 모니터링할 수 있도록 지원하고 있습니다.

1. 와탭에서 외부 프레임워크나 오픈소스 연계 추적하는 방법

사용자의 애플리케이션에서 프레임워크나 오픈소스를 사용하는 경우 와탭 Java 에이전트를 통해서 추적할 수 있도록 설정을 제공합니다. Java 에이전트 설정 파일(whatap.conf)에 weaving 옵션을 추가해 사용할 수 있습니다.

main

위의 예시처럼 프레임워크나 오픈소스로 spring-boot-3.x, feign-client-11, okhttp3-4.4 사용한다면 다음과 같이 옵션을 설정하세요.

main

추가로 와탭이 추적할 수 있는 프레임워크 또는 오픈소스 리소스는 와탭 독스 링크를 참고해 주세요.

함께보면 좋은 링크: 와탭이 연계 추적을 지원하는 프레임워크/오픈소스

2. Java 애플리케이션에서 사용자 정의 CompletableFuture 연계 추적하는 방법

1. CompletableFuture 메서드 추가

사용자의 Java 애플리케이션 프로젝트에 에이전트로 hooking 할 CompletableFuture 메서드를 추가하세요.

  • 메서드 이름: trace로 통일
  • ReturnType: SupplierConsumerRunnableFuture
   package io.home.test.util;import java.util.concurrent.Future;import java.util.function.Consumer;import java.util.function.Supplier;publicclass W {publicstaticSupplier trace(Supplier f) {return f;}publicstaticConsumer trace(Consumer f) {return f;}publicstaticRunnable trace(Runnable f) {return f;}publicstaticFuture trace(Future f) {return f;}}
   

2. 에이전트 설정 추가

에이전트 설정을 위해 whatap.conf 파일에 다음 옵션을 추가하세요.

whatap.conf

   hook_completablefuture_patterns=io.home.test.util.W.*
   
  • Context가 있는 경우 trace 메서드를 추가해 트랜잭션을 연결하세요.
  • Context가 없는 경우 hook_service_patterns 옵션으로 서비스를 시작해야 합니다.

3. 사용 예시

  • 원본
   public CompletableFuture serviceATimeout() {return CompletableFuture.supplyAsync(() -> {RestTemplaterestTemplate=newRestTemplate();return restTemplate.getForObject("http://localhost:8081/api/serviceB/timeout", String.class);});}
   
  • io.home.test.util.W.trace() 적용
   // io.home.test.util.W.trace() 적용public CompletableFuture serviceATimeout() {return CompletableFuture.supplyAsync(W.trace(() -> {RestTemplaterestTemplate=newRestTemplate();return restTemplate.getForObject("http://localhost:8081/api/serviceB/timeout", String.class);}));}
   

비동기 애플리케이션이 추적하기가 어려웠다면 와탭 애플리케이션 모니터링을 이용해 보세요. 와탭은 메트릭에 대한 실시간 인사이트를 제공하여 문제를 해결하고 비동기 애플리케이션의 성능을 최적화할 수 있습니다.

비동기 애플리케이션 추적은 와탭과 함께
와탭 애플리케이션 모니터링 알아보기
오은미[email protected]
Marketing TeamTeam Leader

지금 바로
와탭을 경험해 보세요.