2727import io .micrometer .core .instrument .simple .SimpleMeterRegistry ;
2828import org .junit .Test ;
2929
30+ import org .springframework .aop .framework .ProxyFactory ;
3031import org .springframework .beans .BeansException ;
3132import org .springframework .beans .factory .config .BeanPostProcessor ;
3233import org .springframework .boot .actuate .autoconfigure .metrics .test .MetricsRun ;
3940import org .springframework .context .annotation .Configuration ;
4041import org .springframework .core .Ordered ;
4142import org .springframework .core .PriorityOrdered ;
43+ import org .springframework .jdbc .datasource .DelegatingDataSource ;
4244
4345import static org .assertj .core .api .Assertions .assertThat ;
4446
@@ -185,6 +187,25 @@ public void someHikariDataSourcesCanBeInstrumented() {
185187 });
186188 }
187189
190+ @ Test
191+ public void hikariProxiedDataSourceCanBeInstrumented () {
192+ this .contextRunner
193+ .withUserConfiguration (ProxiedHikariDataSourcesConfiguration .class )
194+ .withConfiguration (
195+ AutoConfigurations .of (DataSourceAutoConfiguration .class ))
196+ .run ((context ) -> {
197+ context .getBean ("proxiedDataSource" , DataSource .class )
198+ .getConnection ();
199+ context .getBean ("delegateDataSource" , DataSource .class )
200+ .getConnection ();
201+ MeterRegistry registry = context .getBean (MeterRegistry .class );
202+ registry .get ("hikaricp.connections" ).tags ("pool" , "firstDataSource" )
203+ .meter ();
204+ registry .get ("hikaricp.connections" ).tags ("pool" , "secondOne" )
205+ .meter ();
206+ });
207+ }
208+
188209 @ Test
189210 public void hikariDataSourceIsInstrumentedWithoutMetadataProvider () {
190211 this .contextRunner .withUserConfiguration (OneHikariDataSourceConfiguration .class )
@@ -199,6 +220,14 @@ public void hikariDataSourceIsInstrumentedWithoutMetadataProvider() {
199220 });
200221 }
201222
223+ private static HikariDataSource createHikariDataSource (String poolName ) {
224+ String url = "jdbc:hsqldb:mem:test-" + UUID .randomUUID ();
225+ HikariDataSource hikariDataSource = DataSourceBuilder .create ().url (url )
226+ .type (HikariDataSource .class ).build ();
227+ hikariDataSource .setPoolName (poolName );
228+ return hikariDataSource ;
229+ }
230+
202231 @ Configuration
203232 static class BaseConfiguration {
204233
@@ -242,12 +271,20 @@ public DataSource secondOne() {
242271 return createHikariDataSource ("secondOne" );
243272 }
244273
245- private HikariDataSource createHikariDataSource (String poolName ) {
246- String url = "jdbc:hsqldb:mem:test-" + UUID .randomUUID ();
247- HikariDataSource hikariDataSource = DataSourceBuilder .create ().url (url )
248- .type (HikariDataSource .class ).build ();
249- hikariDataSource .setPoolName (poolName );
250- return hikariDataSource ;
274+ }
275+
276+ @ Configuration
277+ static class ProxiedHikariDataSourcesConfiguration {
278+
279+ @ Bean
280+ public DataSource proxiedDataSource () {
281+ return (DataSource ) new ProxyFactory (
282+ createHikariDataSource ("firstDataSource" )).getProxy ();
283+ }
284+
285+ @ Bean
286+ public DataSource delegateDataSource () {
287+ return new DelegatingDataSource (createHikariDataSource ("secondOne" ));
251288 }
252289
253290 }
@@ -257,11 +294,7 @@ static class OneHikariDataSourceConfiguration {
257294
258295 @ Bean
259296 public DataSource hikariDataSource () {
260- String url = "jdbc:hsqldb:mem:test-" + UUID .randomUUID ();
261- HikariDataSource hikariDataSource = DataSourceBuilder .create ().url (url )
262- .type (HikariDataSource .class ).build ();
263- hikariDataSource .setPoolName ("hikariDataSource" );
264- return hikariDataSource ;
297+ return createHikariDataSource ("hikariDataSource" );
265298 }
266299
267300 }
0 commit comments