首页 > 解决方案 > 如何在不使用 Tomcat JDBC 的情况下为基于 Hikari 的项目设置 AWS X-Ray SQL Instrumentation?

问题描述

AWS X-Ray的AWS 文档目前没有为不使用 Tomcat JDBC 的 Java 项目提供任何解决方案。

为了使用 来检测数据库查询spring-boot-data-jpa,您还需要包含 Tomcat JDBC 作为依赖项,并设置一个 Tomcat DataSource 对象以及您的 Hikari 对象,并通过以下任一方式将 XRay 拦截器作为 JDBC 拦截器包括在内:

dataSource.setJdbcInterceptors("com.amazonaws.xray.sql.postgres.TracingInterceptor;");

spring.datasource.jdbc-interceptors=com.amazonaws.xray.sql.postgres.TracingInterceptor

摇篮:

dependencies {
    ...
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    implementation "com.amazonaws:aws-java-sdk-core"
    implementation "com.amazonaws:aws-xray-recorder-sdk-core" // Required for core xray features
    implementation "com.amazonaws:aws-xray-recorder-sdk-spring" // Required for spring annotations
    implementation "com.amazonaws:aws-xray-recorder-sdk-sql-postgres" // required for db callouts

    implementation 'org.apache.tomcat:tomcat-jdbc:9.0.31'
    ...
}

数据库配置(春季):

    @Bean(name = "dataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        final org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
        dataSource.setUsername(getUsername());
        dataSource.setPassword(getPassword());
        dataSource.setUrl(POSTGRES_URL_PREFIX
                + getHost()
                + ":" + getPort()
                + "/" + getName()
                + "?stringtype=unspecified");
        dataSource.setDriverClassName(getDriver());
        dataSource.setJdbcInterceptors("com.amazonaws.xray.sql.postgres.TracingInterceptor;");

        final HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setDataSource(dataSource);

        return hikariDataSource;
    }

我觉得这很笨拙,如果可能的话,我宁愿不必将 Tomcat JDBC 作为附加依赖项。

不使用Tomcat就没有办法解决这个问题吗?

其他注意事项:

标签: spring-data-jpahikaricpaws-xray

解决方案


原来有人有这个问题。AWS 开发人员一直在一个功能分支中进行此工作,该功能分支已于 2019 年 11 月合并为 SDK 版本2.3.0

我还没有找到任何关于这个新特性的文档,所以在深入研究了 PR 代码之后,我发现它比以前的实现还要简单。

只需将以下依赖项而不是 postgres 特定的依赖项添加到您的build.gradle文件(或类似文件):

    implementation "com.amazonaws:aws-java-sdk-core:2.4.0"
    implementation "com.amazonaws:aws-xray-recorder-sdk-core:2.4.0"
    implementation "com.amazonaws:aws-xray-recorder-sdk-sql:2.4.0"

然后只需在您的 DataSource 配置中创建一个TracingDataSource对象,并将您的原始javax.sql.DataSource对象传递给它。这应该在@Configuration您用来创建DataSourcebean 的任何带注释的类中完成。

    @Bean(name = "dataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        final DataSource dataSource = DataSourceBuilder
                .create()
                .username(getUsername())
                .password(getPassword())
                .url(POSTGRES_URL_PREFIX
                        + getHost()
                        + ":" + getPort()
                        + "/" + getName()
                        + "?stringtype=unspecified")
                .driverClassName(getDriver())
                .build();

        final TracingDataSource tracingDataSource = new TracingDataSource(dataSource);
        return tracingDataSource;
    }

这里的所有都是它的。我真的希望这对某人有所帮助,因为我花了很多时间试图在没有 Tomcat 的情况下让它工作,而且 AWS 文档在这里也没有帮助。


推荐阅读