当前位置: 首页 > 知识库问答 >
问题:

集成AWSJavaSDK 2. x与Spring Sleuth

柳深
2023-03-14

我第一次使用Spring Boot,正在为我的应用程序设置分布式跟踪。我已经将Spring Cloud Slueth添加到我的应用程序中,当调用我的endpoint时,我可以看到生成的跨度和跟踪,但是我很难让它与Aws Sdk 2. x集成(使用Dynamo异步客户端)。我有几个关于集成的问题:

  1. 通过aws sdk跟踪http调用的最佳方式是什么。我能做到这一点的唯一方法是实现ExecutionInterceptor并手动创建一个跨度:
@Component
@Log4j2
public class AwsExecutionInterceptor implements ExecutionInterceptor {
    public static final String CLIENT_CALL_SPAN = "ClientCallSpan";
    public static final ExecutionAttribute<Span> ATTRIBUTE = new ExecutionAttribute<>(
            CLIENT_CALL_SPAN);
    private final Tracer tracer;

    @Autowired
    public AwsExecutionInterceptor(Tracer tracer) {
        this.tracer = tracer;
    }

    @Override
    public void beforeExecution(Context.BeforeExecution context, ExecutionAttributes executionAttributes) {

        Span clientCallSpan = this.tracer.nextSpan().name("clientCall").start();
        log.info("Starting new span");
        executionAttributes.putAttribute(ATTRIBUTE, clientCallSpan);
    }

    @Override
    public void afterExecution(Context.AfterExecution context, ExecutionAttributes executionAttributes) {
        Span span = executionAttributes.getAttribute(ATTRIBUTE);
        span.end();
        log.info("Span closed");
    }
}
public class AwsExecutorConfig {

    @Bean("AwsClientExecutor")
    public Executor executor() {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 50,
                                                             10, TimeUnit.SECONDS,
                                                             new LinkedBlockingQueue<>(10_000));

        executor.allowCoreThreadTimeOut(true);
        return executor;
    }
}
@Autowired
public DynamoConfig(AwsExecutionInterceptor executionInterceptor,
                    @Qualifier("AwsClientExecutor") Executor executor) {

  @Bean(destroyMethod = "close")
  public DynamoDbAsyncClient dynamoDbAsyncClient() {
    var builder = DynamoDbAsyncClient.builder();
    builder.overrideConfiguration(
        ClientOverrideConfiguration.builder()
                                   .addExecutionInterceptor(executionInterceptor).build());

    builder.asyncConfiguration(
            b -> b.advancedOption(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR, 
                                  executor));
    return builder.build();
  }
}

有了这个,我可以从sdk中看到如下日志,

2021-07-20 10:26:04.369 DEBUG [,c9ae653fd2254266,c9ae653fd2254266] 2873 --- [pool-2-thread-5] s.a.a.m.internal.DefaultMetricCollector  : Collected metrics records: MetricCollection(...)

但其他日志没有任何痕迹,例如:

2021-07-20 10:26:04.360 DEBUG [,,] 2873 --- [tyEventLoop-0-2] software.amazon.awssdk.request           : Received successful response: 200
2021-07-20 10:26:04.361 TRACE [,,] 2873 --- [tyEventLoop-0-2] software.amazon.awssdk.request           : Parsing service response JSON.
2021-07-20 10:26:04.361 DEBUG [,,] 2873 --- [tyEventLoop-0-2] software.amazon.awssdk.requestId         : x-amzn-RequestId : af0d9968-3202-480f-9e3c-8312ae6963c8
2021-07-20 10:26:04.361 DEBUG [,,] 2873 --- [tyEventLoop-0-2] software.amazon.awssdk.requestId         : x-amz-id-2 : not available
2021-07-20 10:26:04.367 TRACE [,,] 2873 --- [tyEventLoop-0-2] software.amazon.awssdk.request           : Done parsing service response.

spring cloud sleuth文档提到了与Netty Http客户端的集成,但我不确定如何使用AWS SDK实现这一点。如果您有任何帮助,我们将不胜感激

共有1个答案

郑高驰
2023-03-14

这是一个非常复杂的问题,让我试着给你一些背景知识,并解释你能做什么/寻找什么。

Spring Cloud Sleuth是对分布式跟踪库(如OpenZipkin的Brave)的抽象。这意味着您可以使用Sleuth的API来检测代码,并且可以在后台更改跟踪库。这也意味着您可以使用自己选择的跟踪库的内置工具(例如,您可以使用Sleuth为代码提供工具,但也可以添加Brave的MySQL工具,这两种工具将协同工作)。

(Brave不是唯一一个由Sleuth支持的追踪库。Sleuth也有OTel支持,但其中一个还不是GA,所以我们不建议在生产中使用。)

由于上述原因,您可以在以下几个地方查看仪器支持:

  1. Spring Cloud Sleuth工具有一堆Spring框架支持的东西(AWS不是那样的,Spring Cloud AWS现在是一个社区支持的项目),但是正如你所说的netty客户端是:docs
  2. Brave有很多库的仪器支持,如果有什么可以重用的,你可以看看那里(例如:在不同的回购中有一些AWS支持)
  3. 库本身可以有Brave的支持(我不认为AWS SDK是今天的情况)

我建议您使用Sleuth API来插入代码,在这里您可以找到如何创建和结束跨度。如您所见,如果您想为第三方库提供仪器,这可能会很棘手,但您可以做以下几件事:

  1. 类似于上面使用拦截器所做的事情(这假设有这样一个组件,您可以使用它来注入自己的代码)。仅供参考:您的实现不会创建“范围”(参见文档)(创建和结束跨度)

日志集成通常是通过将跟踪数据放入MDC来实现的,跟踪数据通常是通过html" target="_blank">线程本地传播的。因此,如果您在执行过程中更改线程,您的跟踪数据就会丢失,进入线程池就像从头开始一个全新的跨度(没有父跨度)。幸运的是,Sleuth有一个解决方案,您需要将您的执行器包装到Sleuth提供的组件中,Sleuth将为您将上下文传播到您的线程池中,请参见:线程池支持

请检查文档中的HttpClient部分,它需要是一个bean,以便Sleuth可以对其进行检测。

 类似资料:
  • 我刚开始使用Nutch 1.11和Solr 5.3.1。 我想用Nutch抓取数据,然后用Solr索引并准备搜索。 希望通过新的自动模式特性,我可以将自己设置为restful,但是,我得到了以下错误(从日志文件复制): 我记得这个 与url有关,但我仔细检查了我使用的url,我认为它是正确的。 错误消息:

  • 问题内容: 我正在使用最新的稳定Spring版本()。 将Hibernate从5.1升级到5.2,并将依赖项更改为适当的hibernate文档后:https : //github.com/hibernate/hibernate- orm/wiki/Migration-Guide—5.2 我没有收到任何编译错误,但是我的所有测试都因以下堆栈跟踪而失败: 问题答案: 中增加了支持,其稳定版本将于下周推

  • 问题内容: 据我了解,Windows和OS X方面的Qt和GTK只是本地GUI库的包装,就像OS X围绕Cocoa的包装和Windows Win32的包装一样。但是,我的问题是,它们如何与Linux集成?桌面环境开发人员是否必须为Qt或GTK实现特殊的库,或者它如何工作?我环顾四周,但找不到真正的答案。 问题答案: 在Linux(台式机和笔记本电脑)上,X11服务器通常会显示图形屏幕(至少在201

  • 0.9.2 新版功能. 这些函数提高了初始化 Django 配置中环境变量的效率,运行后即可从 Django 项目或者 Django 本身中提取环境变量,而不需要每次使用 fabfile 时都亲自设置环境变量,或者使用 manage.py 插件。 目前,这些函数仅支持 Fabric 和 fabfile 以及它能引用到的 Django 库交互。听起来限制了你的使用,其实不然。在下面的例子中,你可以像

  • 我是新点燃的。 步骤1:我在两个VM(ubuntu)中安装了Ignite 2.6.0,在一个VM中启动了节点。下面有COMAND。bin/ignite.sh examples/config/example-ignite.xml 步骤2:我的所有配置都在example-default.xml中 步骤3:在其他VM中执行包含datagrid逻辑的client.jar(该VM既是客户机也是节点)。 步骤

  • 问题内容: 我正在尝试将Lucene与EclipseLink结合使用,并想知道那里是否有任何好的集成库?我已经看过太阳耀斑,看起来像石灰,它可以满足我的要求,但是它已经过时了(尽管我使用的是EclipseLink的较旧版本,但我使用的是Lucene 4.10)这可能有用,但是我找不到任何文档,有关如何使用它的示例或教程。 任何建议将不胜感激(我也不相信我们也可以切换到Hibernate) 提前致谢