비동기 애플리케이션은 동시에 여러 작업을 수행할 수 있으므로, 하나의 작업이 완료되는 동안 다른 작업을 진행할 수 있습니다. 이로 인해 전체 작업의 처리 시간을 단축할 수 있으며 사용자 경험을 향상할 수 있습니다.
비동기 방식은 동기보다 복잡하지만, 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있습니다. 비동기 애플리케이션의 분산되고 이벤트 중심적인 특성은 효율성 측면에서 많은 장점은 있지만 복잡도가 높아져 애플리케이션 모니터링하는데 어려움을 갖고 있습니다. 비동기 애플리케이션 모니터링의 몇 가지 어려움은 다음과 같습니다.
이러한 문제를 해결하려면 비동기 애플리케이션용도 트랜잭션 추적이 가능한 솔루션을 사용해야 하는데요. 와탭 애플리케이션은 어떻게 비동기 애플리케이션 분산 추적이 가능한 걸까요?
와탭은 Java 바이트코드를 조작하여 오픈소스 라이브러리 또는 프레임워크를 추적합니다. 예를 들어 reactor 기반의 spring-webflux를 추적하기 위해 바이트코드 조작과 reactor 라이브러리가 제공하고 있는 Operator를 활용하여 오픈소스 라이브러리에 추적 코드를 추가하여 트랜잭션 추적하고 있습니다.
애플리케이션을 비동기로 구성하는 경우 하나의 트랜잭션에서 복수의 비동기 오픈소스를 활용하는 경우가 많은데요. 예로 spring-boot 웹 트랜잭션에서 tomcat, spring-cloud-gatway, redis, kafka, r2dbc 등을 호출하는 경우가 빈번합니다. 이럴 때 와탭 자바에이전트는 각 오픈소스 라이브러리에 추적 코드를 추가하여 비동기 트랜잭션을 연계추적하여 모니터링할 수 있도록 지원하고 있습니다.
사용자의 애플리케이션에서 프레임워크나 오픈소스를 사용하는 경우 와탭 Java 에이전트를 통해서 추적할 수 있도록 설정을 제공합니다. Java 에이전트 설정 파일(whatap.conf)에 weaving 옵션을 추가해 사용할 수 있습니다.
위의 예시처럼 프레임워크나 오픈소스로 spring-boot-3.x, feign-client-11, okhttp3-4.4 사용한다면 다음과 같이 옵션을 설정하세요.
추가로 와탭이 추적할 수 있는 프레임워크 또는 오픈소스 리소스는 와탭 독스 링크를 참고해 주세요.
함께보면 좋은 링크: 와탭이 연계 추적을 지원하는 프레임워크/오픈소스
사용자의 Java 애플리케이션 프로젝트에 에이전트로 hooking 할 CompletableFuture 메서드를 추가하세요.
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;}}
에이전트 설정을 위해 whatap.conf 파일에 다음 옵션을 추가하세요.
whatap.conf
hook_completablefuture_patterns=io.home.test.util.W.*
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() 적용public CompletableFuture serviceATimeout() {return CompletableFuture.supplyAsync(W.trace(() -> {RestTemplaterestTemplate=newRestTemplate();return restTemplate.getForObject("http://localhost:8081/api/serviceB/timeout", String.class);}));}
비동기 애플리케이션이 추적하기가 어려웠다면 와탭 애플리케이션 모니터링을 이용해 보세요. 와탭은 메트릭에 대한 실시간 인사이트를 제공하여 문제를 해결하고 비동기 애플리케이션의 성능을 최적화할 수 있습니다.