Skip to content

Add customizers to R2DBC ProxyConnectionFactory / ConnectionFactoryDecorator #40010

@pauljohe-dnb

Description

@pauljohe-dnb

Would it be possible to make it easy to apply customizers to R2DBC observability?

For example, consider this fuctional interface:

@FunctionalInterface
public interface ProxyConnectionFactoryBuilderCustomizer {
    void customize(ConnectionFactory connectionFactory, ProxyConnectionFactory.Builder builder);
}

The current listener org.springframework.boot.actuate.autoconfigure.r2dbc.R2dbcObservationAutoConfiguration could be re-written:

@Bean
ConnectionFactoryDecorator connectionFactoryDecorator(ObjectProvider<ProxyConnectionFactoryBuilderCustomizer> customizers) {
    return (connectionFactory) -> {
        var builder = ProxyConnectionFactory.builder(connectionFactory);
        customizers.forEach(customizer -> customizer.customize(connectionFactory, builder));
        return builder.build();
    };
}

@Bean
@ConditionalOnBean(ObservationRegistry.class)
ProxyConnectionFactoryBuilderCustomizer connectionObserver(R2dbcObservationProperties properties,
                                                           ObservationRegistry observationRegistry,
                                                           ObjectProvider<QueryObservationConvention> queryObservationConvention,
                                                           ObjectProvider<QueryParametersTagProvider> queryParametersTagProvider) {
    return (connectionFactory, builder) -> {
        HostAndPort hostAndPort = extractHostAndPort(connectionFactory);
        ObservationProxyExecutionListener listener = new ObservationProxyExecutionListener(observationRegistry,
                connectionFactory, hostAndPort.host(), hostAndPort.port());
        listener.setIncludeParameterValues(properties.isIncludeParameterValues());
        queryObservationConvention.ifAvailable(listener::setQueryObservationConvention);
        queryParametersTagProvider.ifAvailable(listener::setQueryParametersTagProvider);
        builder.listener(listener);
    };
}

With this pattern, it is very easy for other applications to apply their own listeners and customizations to the ProxyConnectionFactory initalization.

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: supersededAn issue that has been superseded by another

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions