根据 Sleuth 文档,AWS SQS 仅在消费者端“本机”支持:
https://docs.spring.io/spring-cloud-sleuth/docs/current-SNAPSHOT/reference/html/#spring-cloud-aws-messaging-sqs
为了在 AWS SQS 上添加无缝跟踪,我使用了 Brave SQS 工具(又名 SqsMessageTracing)并且不得不添加另一个依赖项:
<dependency>
<groupId>io.zipkin.aws</groupId>
<artifactId>brave-instrumentation-aws-java-sdk-sqs</artifactId>
<version>0.21.2</version>
</dependency>
并具有以下配置:
@Configuration
public class SQSConfig {
@Autowired
private Tracing tracing;
@Autowired
private AWSCredentialsProvider awsCredentialsProvider;
@Autowired
private RegionProvider regionProvider;
@Bean
public AmazonSQSAsync amazonSQS() {
SqsMessageTracing sqsMessageTracing = SqsMessageTracing.create(tracing);
return AmazonSQSAsyncClientBuilder.standard()
.withRegion(regionProvider.getRegion().getName())
.withCredentials(awsCredentialsProvider)
.withRequestHandlers(sqsMessageTracing.requestHandler())
.build();
}
@Bean
public QueueMessagingTemplate queueMessagingTemplate(AmazonSQSAsync sqsClient) {
QueueMessagingTemplate template = new QueueMessagingTemplate(sqsClient);
template.setMessageConverter(getMappingJackson2MessageConverter());
return template;
}
}
这只是因为我不想自己进行 SQS 生产者检测,也不想以编程方式添加跟踪标头。
可以在此处找到有关 Brave 仪器的少量参考:
https://github.com/spring-cloud/spring-cloud-sleuth/issues/1550#issuecomment-589686583
我的 SQS 消息生产者如下所示:
@Component
public class MessageAdapter {
@Autowired
private final QueueMessagingTemplate queueMessagingTemplate;
public void sendSqsMessage(Object payload) {
HashMap<String, Object> headers = new HashMap<>();
headers.put("message-group-id", UUID.randomUUID().toString());
queueMessagingTemplate.convertAndSend("sqs-queue-1", payload, headers);
}
}
最后说明
不需要,但我也排除了
org.springframework.cloud.aws.autoconfigure.context.ContextInstanceDataAutoConfiguration
因为它在应用程序启动时执行 AWS 环境配置扫描,这对我来说不是必需的(并且还引发了冗长的错误日志)
@SpringBootApplication
// Unwanted autoconfiguration, which raises a lengthy warning at startup,
// brought in by Brave AWS SQS instrumentation
@EnableAutoConfiguration(exclude = ContextInstanceDataAutoConfiguration.class)
public class MainSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MainSpringBootApplication.class);
}
}