Как настроить AWS X-Ray SQL Инструментарий для проектов на базе Hikari без использования Tomcat JDB C? - PullRequest
1 голос
/ 13 марта 2020

Документация AWS для AWS X-Ray в настоящее время не дает никаких решений для Java проектов, в которых не используется Tomcat JDB C.

Чтобы обрабатывать запросы к базе данных с помощью spring-boot-data-jpa, вам также необходимо включить Tomcat JDB C в качестве зависимости, настроить объект источника данных Tomcat вместе с вашим Hikari и включить перехватчик XRay как JDB C перехватчик либо:

  • Добавление его в вашу конфигурацию, используя:

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

  • Как свойство:

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

Gradle:

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 JDB C в качестве дополнительной зависимости, если это возможно.

Нет ли способа обойти это без использования Tomcat?

Другие примечания:

  • Пружинный пыльник 2.1.7

  • Gradle 6.0.1

  • AWS SDK для Java 2.4.0

1 Ответ

2 голосов
/ 13 марта 2020

Оказывается, у кого-то еще был этот вопрос . AWS разработчики работали над этим в ветви функций , которая была объединена в Novemeber 2019 для SDK версии 2.3.0.

Мне еще предстоит найти документацию для этой новой функции поэтому после некоторого изучения кода PR мне удалось обнаружить, что он даже более прост, чем предыдущая реализация.

Просто добавьте следующую зависимость вместо postgres speci c one к вашему build.gradle file (или аналогичный):

    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"

Затем просто создайте объект TracingDataSource в вашей конфигурации DataSource и передайте ему свой исходный объект javax.sql.DataSource. Это должно быть сделано в любом аннотированном классе @Configuration, который вы используете для создания вашего компонента DataSource.

    @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 здесь тоже не поможет.

...