配置 Zipkin 以跟踪 AWS SQS 消息?

Posted

技术标签:

【中文标题】配置 Zipkin 以跟踪 AWS SQS 消息?【英文标题】:Configure Zipkin to trace the AWS SQS messages? 【发布时间】:2020-07-27 05:06:06 【问题描述】:

我在 AWS ECS 中运行微服务并监听 AWS SQS 消息。我正在使用 zipkin-aws 将跟踪发送到 AWS Kinesis 并在 S3 中收集。当有任何 REST 操作时,跟踪在 S3 中完美发送和收集。但是当微服务侦听或向 AWS 队列发送消息时,它不会捕获跟踪。任何人都可以帮助配置 zipkin 以收听 SQS 消息。

【问题讨论】:

【参考方案1】:

根据 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);
  


【讨论】:

以上是关于配置 Zipkin 以跟踪 AWS SQS 消息?的主要内容,如果未能解决你的问题,请参考以下文章

AWS SQS JMS确认

使用SQS接收SES消息

AWS Lambda 在向 SQS 发送消息之前完成

AWS SQS 消息保留期

AWS SQS FIFO或AWS DynamoDB用于处理大量消息

从 AWS SQS 获取消息的延迟