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

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

【问题讨论】:

    标签: spring-boot microservices amazon-sqs amazon-ecs zipkin


    【解决方案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);
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 2021-12-07
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多