
io.smilego.tenant.logging.amqp.RabbitMQTracingAspect Maven / Gradle / Ivy
package io.smilego.tenant.logging.amqp;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.smilego.tenant.TenantContext;
import io.smilego.tenant.logging.LogContextHolder;
import io.smilego.tenant.logging.LogUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.MDC;
import org.springframework.amqp.core.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import java.util.Arrays;
@Aspect
@Slf4j
@RequiredArgsConstructor
@Order(5)
public class RabbitMQTracingAspect {
@Value("${espheroLoggingContext.enabled}")
private boolean espheroLoggingContext;
@Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)")
public Object aroundConsumerPointcut(ProceedingJoinPoint joinPoint) {
Span currentSpan = Span.current();
SpanContext spanContext = currentSpan.getSpanContext();
String traceId = spanContext.getTraceId();
Object proceed = null;
MDC.put("tenantId", TenantContext.getTenantId());
currentSpan.setAttribute("tenantId", TenantContext.getTenantId());
Object[] args = joinPoint.getArgs();
AmqpListenerLog amqpListenerLog = (AmqpListenerLog) LogContextHolder.getInstance().initAqmpListener(traceId);
Arrays.stream(args)
.filter(arg -> arg instanceof Message)
.findFirst()
.ifPresent(message ->
{
String queueName = ((Message) message).getMessageProperties().getConsumerQueue();
amqpListenerLog.setQueueName(queueName);
currentSpan.setAttribute("queueName", queueName);
}
);
try {
proceed = joinPoint.proceed();
} catch (Throwable e) {
// amqpListenerLog.setStackTrace(String.format("%s.%s:%s", e.getClass().getName(), e.getMessage(), LogUtils.getStackTrace(e)));
log.error(e.getMessage(), e);
}
finally {
if(espheroLoggingContext) amqpListenerLog.write();
MDC.clear();
}
// }
return proceed;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy