如何使用camel-zipkin和camel-rabbitmq跟踪消息
我使用不同的交换和队列实现了不同的微服务,其中内部通信通过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-zipkin
进行跟踪,使用log4j2
进行日志记录
例:
- Service1将消息发布到RabbitMQ(即Exchange 1->队列1) 其中Service2使用消息
- Service2将消息发布到RabbitMQ(即Exchange 1->队列2) 其中Service3使用消息等
1.5.12.版本
和Camel2.21.5版本
,具有以下依赖项(Camel):
- 驼形弹簧靴起动器
- 骆驼兔起动器
- 驼芯
- 骆驼泉
- 驼色齐普金起子
- 骆驼试验
- 驼峰试验弹簧
<?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