Skip to content

Commit 16a1b06

Browse files
author
Zhen
committed
Added connection acquired count and timedOutToAcquire count on connection pool metrics
Change the histogram only record value generated by successful requests.
1 parent f6dc900 commit 16a1b06

18 files changed

+206
-110
lines changed

driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import org.neo4j.driver.internal.messaging.PullAllMessage;
3535
import org.neo4j.driver.internal.messaging.ResetMessage;
3636
import org.neo4j.driver.internal.messaging.RunMessage;
37-
import org.neo4j.driver.internal.metrics.ListenerEvent;
37+
import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent;
3838
import org.neo4j.driver.internal.metrics.MetricsListener;
3939
import org.neo4j.driver.internal.spi.Connection;
4040
import org.neo4j.driver.internal.spi.ResponseHandler;
@@ -57,7 +57,7 @@ public class NettyConnection implements Connection
5757

5858
private final AtomicReference<Status> status = new AtomicReference<>( Status.OPEN );
5959
private final MetricsListener metricsListener;
60-
private final ListenerEvent inUseEvent;
60+
private final ConnectionListenerEvent inUseEvent;
6161

6262
public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, MetricsListener metricsListener )
6363
{
@@ -69,7 +69,7 @@ public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, M
6969
this.releaseFuture = new CompletableFuture<>();
7070
this.clock = clock;
7171
this.metricsListener = metricsListener;
72-
this.inUseEvent = metricsListener.createListenerEvent();
72+
this.inUseEvent = metricsListener.createConnectionListenerEvent();
7373
metricsListener.afterAcquiredOrCreated( this.serverAddress, this.inUseEvent );
7474
}
7575

driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,22 +87,18 @@ public CompletionStage<Connection> acquire( BoltServerAddress address )
8787
assertNotClosed();
8888
ChannelPool pool = getOrCreatePool( address );
8989

90-
ListenerEvent acquireEvent = metricsListener.createListenerEvent();
90+
ListenerEvent.PoolListenerEvent acquireEvent = metricsListener.createPoolListenerEvent();
9191
metricsListener.beforeAcquiringOrCreating( address, acquireEvent );
9292
Future<Channel> connectionFuture = pool.acquire();
9393

9494
return Futures.asCompletionStage( connectionFuture ).handle( ( channel, error ) ->
9595
{
96-
try
97-
{
98-
processAcquisitionError( error );
99-
assertNotClosed( address, channel, pool );
100-
return new NettyConnection( channel, pool, clock, metricsListener );
101-
}
102-
finally
103-
{
104-
metricsListener.afterAcquiringOrCreating( address, acquireEvent );
105-
}
96+
processAcquisitionError( address, error );
97+
assertNotClosed( address, channel, pool );
98+
NettyConnection nettyConnection = new NettyConnection( channel, pool, clock, metricsListener );
99+
100+
metricsListener.afterAcquiredOrCreated( address, acquireEvent );
101+
return nettyConnection;
106102
} );
107103
}
108104

@@ -210,7 +206,7 @@ private EventLoopGroup eventLoopGroup()
210206
return bootstrap.config().group();
211207
}
212208

213-
private void processAcquisitionError( Throwable error )
209+
private void processAcquisitionError( BoltServerAddress serverAddress, Throwable error )
214210
{
215211
Throwable cause = Futures.completionExceptionCause( error );
216212
if ( cause != null )
@@ -219,6 +215,7 @@ private void processAcquisitionError( Throwable error )
219215
{
220216
// NettyChannelPool returns future failed with TimeoutException if acquire operation takes more than
221217
// configured time, translate this exception to a prettier one and re-throw
218+
metricsListener.afterTimedOutToAcquireOrCreate( serverAddress );
222219
throw new ClientException(
223220
"Unable to acquire connection from the pool within configured maximum time of " +
224221
settings.connectionAcquisitionTimeout() + "ms" );

driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
import org.neo4j.driver.internal.BoltServerAddress;
2828
import org.neo4j.driver.internal.async.ChannelConnector;
29-
import org.neo4j.driver.internal.metrics.ListenerEvent;
29+
import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent;
3030

3131
import static java.util.Objects.requireNonNull;
3232

@@ -60,22 +60,21 @@ public NettyChannelPool( BoltServerAddress address, ChannelConnector connector,
6060
@Override
6161
protected ChannelFuture connectChannel( Bootstrap bootstrap )
6262
{
63-
ListenerEvent creatingEvent = handler.beforeChannelCreating( address );
63+
ConnectionListenerEvent creatingEvent = handler.channelCreating( address );
6464
ChannelFuture channelFuture = connector.connect( address, bootstrap );
6565
channelFuture.addListener( future ->
6666
{
6767
if ( future.isSuccess() )
6868
{
6969
// notify pool handler about a successful connection
7070
Channel channel = channelFuture.channel();
71-
handler.channelCreated( channel );
71+
handler.channelCreated( channel, creatingEvent );
7272
channel.closeFuture().addListener( closeFuture -> handler.channelClosed( channel ) );
7373
}
7474
else
7575
{
7676
handler.channelFailedToCreate( address );
7777
}
78-
handler.afterChannelCreating( address, creatingEvent );
7978
} );
8079
return channelFuture;
8180
}

driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import java.util.concurrent.atomic.AtomicInteger;
2727

2828
import org.neo4j.driver.internal.BoltServerAddress;
29-
import org.neo4j.driver.internal.metrics.ListenerEvent;
29+
import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent;
3030
import org.neo4j.driver.internal.metrics.MetricsListener;
3131
import org.neo4j.driver.v1.Logger;
3232
import org.neo4j.driver.v1.Logging;
@@ -65,26 +65,27 @@ public void channelAcquired( Channel channel )
6565
@Override
6666
public void channelCreated( Channel channel )
6767
{
68-
log.debug( "Channel %s created", channel );
69-
incrementInUse( channel );
70-
metricsListener.afterCreated( serverAddress( channel ) );
68+
throw new IllegalStateException( "A fatal error happened in this driver as this method should never be called. " +
69+
"Contact the driver developer." );
7170
}
7271

73-
public void channelFailedToCreate( BoltServerAddress address )
72+
public void channelCreated( Channel channel, ConnectionListenerEvent creatingEvent )
7473
{
75-
metricsListener.afterFailedToCreate( address );
74+
log.debug( "Channel %s created", channel );
75+
incrementInUse( channel );
76+
metricsListener.afterCreated( serverAddress( channel ), creatingEvent );
7677
}
7778

78-
public ListenerEvent beforeChannelCreating( BoltServerAddress address )
79+
public ConnectionListenerEvent channelCreating( BoltServerAddress address )
7980
{
80-
ListenerEvent creatingEvent = metricsListener.createListenerEvent();
81+
ConnectionListenerEvent creatingEvent = metricsListener.createConnectionListenerEvent();
8182
metricsListener.beforeCreating( address, creatingEvent );
8283
return creatingEvent;
8384
}
8485

85-
public void afterChannelCreating( BoltServerAddress address, ListenerEvent creatingEvent )
86+
public void channelFailedToCreate( BoltServerAddress address )
8687
{
87-
metricsListener.afterCreating( address, creatingEvent );
88+
metricsListener.afterFailedToCreate( address );
8889
}
8990

9091
public void channelClosed( Channel channel )

driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionMetricsListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public interface ConnectionMetricsListener
2323
{
2424
void beforeCreating( ListenerEvent listenerEvent );
2525

26-
void afterCreating( ListenerEvent listenerEvent );
26+
void afterCreated( ListenerEvent listenerEvent );
2727

2828
void acquiredOrCreated( ListenerEvent listenerEvent );
2929

driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
*/
1919
package org.neo4j.driver.internal.metrics;
2020

21+
import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent;
22+
2123
public interface ConnectionPoolMetricsListener
2224
{
2325
void beforeCreating();
@@ -28,8 +30,10 @@ public interface ConnectionPoolMetricsListener
2830

2931
void afterClosed();
3032

31-
void beforeAcquiringOrCreating( ListenerEvent listenerEvent );
33+
void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent );
34+
35+
void afterAcquiredOrCreated( PoolListenerEvent listenerEvent );
3236

33-
void afterAcquiringOrCreating( ListenerEvent listenerEvent );
37+
void afterTimedOutToAcquireOrCreate();
3438
}
3539

driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,56 +33,70 @@ public abstract class InternalAbstractMetrics implements Metrics, MetricsListene
3333
{
3434

3535
@Override
36-
public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent )
36+
public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent creatingEvent )
3737
{
38+
3839
}
3940

4041
@Override
41-
public void afterCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent )
42+
public void afterCreated( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent creatingEvent )
4243
{
44+
4345
}
4446

4547
@Override
46-
public void afterCreated( BoltServerAddress serverAddress )
48+
public void afterFailedToCreate( BoltServerAddress serverAddress )
4749
{
50+
4851
}
4952

5053
@Override
51-
public void afterFailedToCreate( BoltServerAddress serverAddress )
54+
public void afterClosed( BoltServerAddress serverAddress )
5255
{
56+
5357
}
5458

5559
@Override
56-
public void afterClosed( BoltServerAddress serverAddress )
60+
public void afterTimedOutToAcquireOrCreate( BoltServerAddress serverAddress )
5761
{
62+
5863
}
5964

6065
@Override
61-
public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent )
66+
public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent.PoolListenerEvent acquireEvent )
6267
{
68+
6369
}
6470

6571
@Override
66-
public void afterAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent )
72+
public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent.PoolListenerEvent acquireEvent )
6773
{
74+
6875
}
6976

7077
@Override
71-
public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent inUseEvent )
78+
public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent inUseEvent )
7279
{
80+
7381
}
7482

7583
@Override
76-
public void afterReleased( BoltServerAddress serverAddress, ListenerEvent inUseEvent )
84+
public void afterReleased( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent inUseEvent )
7785
{
86+
7887
}
7988

8089
@Override
81-
public ListenerEvent createListenerEvent()
90+
public ListenerEvent.PoolListenerEvent createPoolListenerEvent()
8291
{
8392
return null;
8493
}
8594

95+
@Override
96+
public ListenerEvent.ConnectionListenerEvent createConnectionListenerEvent()
97+
{
98+
return null;
99+
}
86100

87101
@Override
88102
public void addMetrics( BoltServerAddress address, ConnectionPoolImpl connectionPool )

driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionMetrics.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void beforeCreating( ListenerEvent connEvent )
6666
}
6767

6868
@Override
69-
public void afterCreating( ListenerEvent connEvent )
69+
public void afterCreated( ListenerEvent connEvent )
7070
{
7171
// finished conn creation
7272
long elapsed = connEvent.elapsed();

driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.concurrent.atomic.AtomicLong;
2626

2727
import org.neo4j.driver.internal.BoltServerAddress;
28+
import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent;
2829
import org.neo4j.driver.internal.metrics.spi.ConnectionPoolMetrics;
2930
import org.neo4j.driver.internal.metrics.spi.Histogram;
3031
import org.neo4j.driver.internal.metrics.spi.PoolStatus;
@@ -38,10 +39,14 @@ public class InternalConnectionPoolMetrics implements ConnectionPoolMetrics, Con
3839
private final BoltServerAddress address;
3940
private final ConnectionPool pool;
4041

41-
private AtomicLong created = new AtomicLong();
42-
private AtomicLong closed = new AtomicLong();
43-
private AtomicInteger creating = new AtomicInteger();
44-
private AtomicLong failedToCreate = new AtomicLong();
42+
private final AtomicLong closed = new AtomicLong();
43+
44+
private final AtomicInteger creating = new AtomicInteger();
45+
private final AtomicLong created = new AtomicLong();
46+
private final AtomicLong failedToCreate = new AtomicLong();
47+
48+
private final AtomicLong acquired = new AtomicLong();
49+
private final AtomicLong timedOutToAcquire = new AtomicLong();
4550

4651
private InternalHistogram acquisitionTimeHistogram;
4752

@@ -82,16 +87,24 @@ public void afterClosed()
8287
}
8388

8489
@Override
85-
public void beforeAcquiringOrCreating( ListenerEvent listenerEvent )
90+
public void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent )
8691
{
8792
listenerEvent.start();
8893
}
8994

9095
@Override
91-
public void afterAcquiringOrCreating( ListenerEvent listenerEvent )
96+
public void afterAcquiredOrCreated( PoolListenerEvent listenerEvent )
9297
{
9398
long elapsed = listenerEvent.elapsed();
9499
acquisitionTimeHistogram.recordValue( elapsed );
100+
101+
this.acquired.incrementAndGet();
102+
}
103+
104+
@Override
105+
public void afterTimedOutToAcquireOrCreate()
106+
{
107+
this.timedOutToAcquire.incrementAndGet();
95108
}
96109

97110
@Override
@@ -143,12 +156,24 @@ public long failedToCreate()
143156
return failedToCreate.get();
144157
}
145158

159+
@Override
160+
public long timedOutToAcquire()
161+
{
162+
return timedOutToAcquire.get();
163+
}
164+
146165
@Override
147166
public long closed()
148167
{
149168
return closed.get();
150169
}
151170

171+
@Override
172+
public long acquired()
173+
{
174+
return this.acquired.get();
175+
}
176+
152177
@Override
153178
public Histogram acquisitionTimeHistogram()
154179
{
@@ -158,7 +183,8 @@ public Histogram acquisitionTimeHistogram()
158183
@Override
159184
public String toString()
160185
{
161-
return format( "[created=%s, closed=%s, creating=%s, failedToCreate=%s inUse=%s, idle=%s, poolStatus=%s, acquisitionTimeHistogram=%s]", created(),
162-
closed(), creating(), failedToCreate(), inUse(), idle(), poolStatus(), acquisitionTimeHistogram() );
186+
return format( "[created=%s, closed=%s, creating=%s, failedToCreate=%s, acquired=%s, " +
187+
"timedOutToAcquire=%s, inUse=%s, idle=%s, poolStatus=%s, acquisitionTimeHistogram=%s]",
188+
created(), closed(), creating(), failedToCreate(), acquired(), timedOutToAcquire(), inUse(), idle(), poolStatus(), acquisitionTimeHistogram() );
163189
}
164190
}

0 commit comments

Comments
 (0)