1313
1414import io .netty .channel .EventLoop ;
1515import io .vertx .core .*;
16+ import io .vertx .core .internal .ContextInternal ;
1617import io .vertx .core .internal .PromiseInternal ;
18+ import io .vertx .core .internal .VertxInternal ;
1719import io .vertx .core .internal .net .NetSocketInternal ;
20+ import io .vertx .core .internal .pool .*;
1821import io .vertx .core .net .SocketAddress ;
1922import io .vertx .core .spi .metrics .ClientMetrics ;
2023import io .vertx .core .spi .metrics .PoolMetrics ;
2124import io .vertx .core .spi .tracing .VertxTracer ;
2225import io .vertx .core .tracing .TracingPolicy ;
23- import io .vertx .core .internal .pool .*;
24- import io .vertx .core .internal .ContextInternal ;
25- import io .vertx .core .internal .VertxInternal ;
2626import io .vertx .sqlclient .SqlConnectOptions ;
27+ import io .vertx .sqlclient .impl .tracing .QueryReporter ;
28+ import io .vertx .sqlclient .spi .DatabaseMetadata ;
2729import io .vertx .sqlclient .spi .connection .Connection ;
2830import io .vertx .sqlclient .spi .connection .ConnectionContext ;
31+ import io .vertx .sqlclient .spi .connection .ConnectionFactory ;
2932import io .vertx .sqlclient .spi .protocol .CommandBase ;
3033import io .vertx .sqlclient .spi .protocol .QueryCommandBase ;
31- import io .vertx .sqlclient .impl .tracing .QueryReporter ;
32- import io .vertx .sqlclient .spi .connection .ConnectionFactory ;
33- import io .vertx .sqlclient .spi .DatabaseMetadata ;
3434
3535import java .util .List ;
3636import java .util .function .Function ;
@@ -184,6 +184,27 @@ private void dequeueMetric(Object metric) {
184184 }
185185 }
186186
187+ private Object beginMetric () {
188+ if (metrics != null ) {
189+ try {
190+ return metrics .begin ();
191+ } catch (Exception e ) {
192+ //
193+ }
194+ }
195+ return NO_METRICS ;
196+ }
197+
198+ private void endMetric (Object metric ) {
199+ if (metrics != null && metric != NO_METRICS ) {
200+ try {
201+ metrics .end (metric );
202+ } catch (Exception e ) {
203+ //
204+ }
205+ }
206+ }
207+
187208 // TODO : try optimize without promise
188209 public <R > void execute (CommandBase <R > cmd , Completable <R > handler ) {
189210 ContextInternal context = vertx .getOrCreateContext ();
@@ -193,7 +214,9 @@ public <R> void execute(CommandBase<R> cmd, Completable<R> handler) {
193214 p .future ().compose (lease -> {
194215 dequeueMetric (metric );
195216 PooledConnection pooled = lease .get ();
217+ pooled .timerMetric = beginMetric ();
196218 Connection conn = pooled .conn ;
219+
197220 Future <R > future ;
198221 if (afterAcquire != null ) {
199222 future = afterAcquire .apply (conn )
@@ -205,6 +228,7 @@ public <R> void execute(CommandBase<R> cmd, Completable<R> handler) {
205228 future = pp ;
206229 }
207230 return future .andThen (ar -> {
231+ endMetric (pooled .timerMetric );
208232 pooled .refresh ();
209233 lease .recycle ();
210234 });
@@ -247,6 +271,7 @@ public void complete(Lease<PooledConnection> lease, Throwable failure) {
247271 private void handle (Lease <PooledConnection > lease ) {
248272 dequeueMetric (metric );
249273 PooledConnection pooled = lease .get ();
274+ pooled .timerMetric = beginMetric ();
250275 pooled .lease = lease ;
251276 handler .succeed (pooled );
252277 }
@@ -306,6 +331,7 @@ public class PooledConnection implements Connection, ConnectionContext {
306331 private ConnectionContext holder ;
307332 private Promise <ConnectResult <PooledConnection >> poolCallback ;
308333 private Lease <PooledConnection > lease ;
334+ private Object timerMetric ;
309335 public long idleEvictionTimestamp ;
310336 public long lifetimeEvictionTimestamp ;
311337
@@ -446,6 +472,7 @@ private void doClose(ConnectionContext holder, Completable<Void> promise) {
446472 }
447473
448474 private void cleanup (Completable <Void > promise ) {
475+ endMetric (timerMetric );
449476 Lease <PooledConnection > l = this .lease ;
450477 this .lease = null ;
451478 refresh ();
0 commit comments