All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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