如何使用camel-zipkin和camel-rabbitmq跟踪消息

如何使用camel-zipkin和camel-rabbitmq跟踪消息,rabbitmq,apache-camel,log4j2,spring-cloud-sleuth,zipkin,Rabbitmq,Apache Camel,Log4j2,Spring Cloud Sleuth,Zipkin,我使用不同的交换和队列实现了不同的微服务,其中内部通信通过camel和rabbitMQ进行。我使用camel-zipkin进行跟踪,使用log4j2进行日志记录 例: Service1将消息发布到RabbitMQ(即Exchange 1->队列1) 其中Service2使用消息 Service2将消息发布到RabbitMQ(即Exchange 1->队列2) 其中Service3使用消息等 我正在使用Springboot1.5.12.版本和Camel2.21.5版本,具有以下依赖项(Came

我使用不同的交换和队列实现了不同的微服务,其中内部通信通过camel和rabbitMQ进行。我使用
camel-zipkin
进行跟踪,使用
log4j2
进行日志记录

例:

  • Service1将消息发布到RabbitMQ(即Exchange 1->队列1) 其中Service2使用消息
  • Service2将消息发布到RabbitMQ(即Exchange 1->队列2) 其中Service3使用消息等
我正在使用Springboot
1.5.12.版本
和Camel
2.21.5版本
,具有以下依赖项(Camel):

  • 驼形弹簧靴起动器
  • 骆驼兔起动器
  • 驼芯
  • 骆驼泉
  • 驼色齐普金起子
  • 骆驼试验
  • 驼峰试验弹簧
我需要两个问题的建议

  • span id、跟踪id未打印在日志中。我在log4j2.xml中添加了必要的占位符
  • 每当将消息发送到exchange时,都会生成唯一的span id和跟踪id 我的问题是:

  • 是否可以为从服务1到服务N的整个数据遍历使用唯一的traceID
  • 如何将跨度id、跟踪id打印到日志
  • 示例代码:

    Pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.12.RELEASE</version>
            <relativePath /> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.camel</groupId>
        <artifactId>example</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>example</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <camel.version>2.21.5</camel.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
    
            <!-- Camel Dependency -->
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-spring-boot-starter</artifactId>
                <version>${camel.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-rabbitmq-starter</artifactId>
                <version>${camel.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-core</artifactId>
                <version>${camel.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-spring</artifactId>
                <version>${camel.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-zipkin-starter</artifactId>
                <version>${camel.version}</version>
            </dependency>
    
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-test</artifactId>
                <version>${camel.version}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-test-spring</artifactId>
                <version>${camel.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
    RabbitMQConfig

    
    
    @EnableRabbit
    @Profile("default")
    @Configuration
    public class RabbitMQConfig {
    
        @Value("${camel.component.rabbitmq.hostname}")
        private String host;
    
        @Value("${camel.component.rabbitmq.port-number:5672}")
        private int port;
    
        @Value("${camel.component.rabbitmq.username}")
        private String username;
    
        @Value("${camel.component.rabbitmq.password}")
        private String password;
    
        @Value("${camel.component.rabbitmq.vhost}")
        private String virtualHost;
    
    
        @Bean
        public ConnectionFactory connectionFactory() {
            CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
            connectionFactory.setUsername(username);
            connectionFactory.setPassword(password);
            connectionFactory.setVirtualHost(virtualHost);
            connectionFactory.setCacheMode(CacheMode.CONNECTION);
    
            return connectionFactory;
        }
    
        @Bean
        public Channel amqpChannel(ConnectionFactory connectionFactory) throws IOException {
            Connection connection = connectionFactory.createConnection();
            Channel channel = connection.createChannel(false);
            Map<String, Object> args = new HashMap<>();
            args.put("x-delayed-type", "direct");
            channel.exchangeDeclare("example-service", "x-delayed-message", true, false, args);
    
            return channel;
        }
    }
    
    
    路由生成器

    
    @Component
    public class AppRouteBuilder extends RouteBuilder {
    
        @Autowired
        private MessageActivity messageActivity;
    
        @Autowired
        private SmsActivity smsActivity;
    
        @Override
        public void configure() throws Exception {
            // TODO Auto-generated method stub
    
            from("rabbitmq:example-service?routingKey=example-service.ers.send&queue=example-service-ers-send")
                    .bean(messageActivity).end();
    
            from("rabbitmq:example-service?routingKey=example-service.sms.send&queue=example-service-sms-send")
                    .bean(smsActivity).end();
        }
    
    }
    
    消息活动

    @Service
    public class MessageActivity {
    
        private static final Logger log = LoggerFactory.getLogger(MessageActivity.class);
    
        @Autowired
        protected ProducerTemplate producer;
    
        public void doAction() {
    
            log.debug("Hello in message activity ");
    
            producer.requestBody("rabbitmq:example-service?routingKey=example-service.sms.send&queue=example-service-sms-send", "Hello from message");
    
        }
    }
    
    SmsActivity

    @Service
    public class SmsActivity {
    
        private static final Logger log = LoggerFactory.getLogger(SmsActivity.class);
    
        public void doAction() {
    
            log.debug("Hello in sms activity ");
        }
    }
    
    
    输出

    2019-12-03T21:07:54.316+07:00|2|INFO|example-service|,,|50382|http-nio-8080-exec-2|o.a.c.c.C.[.[.[/]|Initializing Spring FrameworkServlet 'dispatcherServlet'
    2019-12-03T21:07:54.452+07:00|2|DEBUG|example-service|,,|50382|http-nio-8080-exec-2|c.c.e.MessageController|In controller sending message 
    2019-12-03T21:07:54.552+07:00|2|DEBUG|example-service|,,|50382|Camel (camel-1) thread #4 - RabbitMQConsumer|c.c.e.b.MessageActivity|Hello in message activity 
    2019-12-03T21:07:54.580+07:00|2|DEBUG|example-service|,,|50382|Camel (camel-1) thread #6 - RabbitMQConsumer|c.c.e.b.SmsActivity|Hello in sms activity 
    

    似乎您想要添加的是日志跨度和日志跟踪相关信息。默认情况下,Camel不会为您执行此操作。查看如何在Camel中启用MDC日志记录。请注意,MDC在线程本地上下文上工作,因此,只有在处理线程上预先设置了MDC时,才会显示信息。关于创建新的跨度或跟踪,请查看何时生成新的ID。为camel-zipkin相关类(如
    ZipkinTracer
    )启用调试日志可能会揭示一些更深刻的见解。实际上,每次发布到rabbitmq时,它都在创建新的span和跟踪,我希望避免这种情况。我还想记录span(X-B3-SpanId)和trace(X-B3-TraceId),类似于我们使用springcloudstarterzipkin时的情况。
    @Service
    public class SmsActivity {
    
        private static final Logger log = LoggerFactory.getLogger(SmsActivity.class);
    
        public void doAction() {
    
            log.debug("Hello in sms activity ");
        }
    }
    
    
    2019-12-03T21:07:54.316+07:00|2|INFO|example-service|,,|50382|http-nio-8080-exec-2|o.a.c.c.C.[.[.[/]|Initializing Spring FrameworkServlet 'dispatcherServlet'
    2019-12-03T21:07:54.452+07:00|2|DEBUG|example-service|,,|50382|http-nio-8080-exec-2|c.c.e.MessageController|In controller sending message 
    2019-12-03T21:07:54.552+07:00|2|DEBUG|example-service|,,|50382|Camel (camel-1) thread #4 - RabbitMQConsumer|c.c.e.b.MessageActivity|Hello in message activity 
    2019-12-03T21:07:54.580+07:00|2|DEBUG|example-service|,,|50382|Camel (camel-1) thread #6 - RabbitMQConsumer|c.c.e.b.SmsActivity|Hello in sms activity