Skip to content

Commit 4626caa

Browse files
author
Zhen
committed
Adding connection metrics
1 parent 0b33ab4 commit 4626caa

22 files changed

+494
-120
lines changed

driver/pom.xml

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
<groupId>io.netty</groupId>
3030
<artifactId>netty-handler</artifactId>
3131
</dependency>
32+
<dependency>
33+
<groupId>org.hdrhistogram</groupId>
34+
<artifactId>HdrHistogram</artifactId>
35+
</dependency>
3236

3337
<!-- Test dependencies -->
3438
<dependency>
@@ -71,16 +75,6 @@
7175
<groupId>com.fasterxml.jackson.core</groupId>
7276
<artifactId>jackson-databind</artifactId>
7377
</dependency>
74-
<dependency>
75-
<groupId>org.hdrhistogram</groupId>
76-
<artifactId>HdrHistogram</artifactId>
77-
<version>2.1.2</version>
78-
</dependency>
79-
<dependency>
80-
<groupId>org.hdrhistogram</groupId>
81-
<artifactId>HdrHistogram</artifactId>
82-
<version>2.1.2</version>
83-
</dependency>
8478
</dependencies>
8579

8680
<build>
@@ -218,13 +212,18 @@
218212
<artifactSet>
219213
<includes>
220214
<include>io.netty:*</include>
215+
<include>org.HdrHistogram:*</include>
221216
</includes>
222217
</artifactSet>
223218
<relocations>
224219
<relocation>
225220
<pattern>io.netty</pattern>
226221
<shadedPattern>org.neo4j.driver.internal.shaded.io.netty</shadedPattern>
227222
</relocation>
223+
<relocation>
224+
<pattern>org.HdrHistogram</pattern>
225+
<shadedPattern>org.neo4j.driver.internal.shaded.org.HdrHistogram</shadedPattern>
226+
</relocation>
228227
</relocations>
229228
<shadeTestJar>true</shadeTestJar>
230229
</configuration>

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
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.DriverMetricsListener;
38+
import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent;
3739
import org.neo4j.driver.internal.spi.Connection;
3840
import org.neo4j.driver.internal.spi.ResponseHandler;
3941
import org.neo4j.driver.internal.util.Clock;
@@ -54,8 +56,10 @@ public class NettyConnection implements Connection
5456
private final Clock clock;
5557

5658
private final AtomicReference<Status> status = new AtomicReference<>( Status.OPEN );
59+
private final DriverMetricsListener metricsListener;
60+
private final ConnectionListenerEvent inUseEvent;
5761

58-
public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock )
62+
public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, DriverMetricsListener driverMetricsListener )
5963
{
6064
this.channel = channel;
6165
this.messageDispatcher = ChannelAttributes.messageDispatcher( channel );
@@ -64,6 +68,9 @@ public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock )
6468
this.channelPool = channelPool;
6569
this.releaseFuture = new CompletableFuture<>();
6670
this.clock = clock;
71+
this.metricsListener = driverMetricsListener;
72+
this.inUseEvent = driverMetricsListener.createConnectionListenerEvent();
73+
driverMetricsListener.afterAcquiredOrCreated( this.serverAddress, this.inUseEvent );
6774
}
6875

6976
@Override
@@ -124,6 +131,7 @@ public CompletionStage<Void> release()
124131
{
125132
if ( status.compareAndSet( Status.OPEN, Status.RELEASED ) )
126133
{
134+
metricsListener.afterReleased( this.serverAddress, this.inUseEvent );
127135
ChannelReleasingResetResponseHandler handler = new ChannelReleasingResetResponseHandler( channel,
128136
channelPool, messageDispatcher, clock, releaseFuture );
129137

@@ -137,6 +145,7 @@ public void terminateAndRelease( String reason )
137145
{
138146
if ( status.compareAndSet( Status.OPEN, Status.TERMINATED ) )
139147
{
148+
metricsListener.afterReleased( this.serverAddress, this.inUseEvent );
140149
setTerminationReason( channel, reason );
141150
channel.close();
142151
channelPool.release( channel );

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
import org.neo4j.driver.internal.async.ChannelConnector;
3838
import org.neo4j.driver.internal.async.NettyConnection;
3939
import org.neo4j.driver.internal.metrics.DriverMetricsListener;
40-
import org.neo4j.driver.internal.metrics.ListenerEvent;
40+
import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent;
4141
import org.neo4j.driver.internal.spi.Connection;
4242
import org.neo4j.driver.internal.spi.ConnectionPool;
4343
import org.neo4j.driver.internal.util.Clock;
@@ -55,26 +55,26 @@ public class ConnectionPoolImpl implements ConnectionPool
5555
private final PoolSettings settings;
5656
private final Clock clock;
5757
private final Logger log;
58-
private DriverMetricsListener driverMetrics;
58+
private DriverMetricsListener driverMetricsListener;
5959

6060
private final ConcurrentMap<BoltServerAddress,ChannelPool> pools = new ConcurrentHashMap<>();
6161
private final AtomicBoolean closed = new AtomicBoolean();
6262

6363
public ConnectionPoolImpl( ChannelConnector connector, Bootstrap bootstrap, PoolSettings settings,
64-
DriverMetricsListener metricsHandler, Logging logging, Clock clock )
64+
DriverMetricsListener metricsListener, Logging logging, Clock clock )
6565
{
66-
this( connector, bootstrap, new NettyChannelTracker( metricsHandler, logging ), settings, metricsHandler, logging, clock );
66+
this( connector, bootstrap, new NettyChannelTracker( metricsListener, logging ), settings, metricsListener, logging, clock );
6767
}
6868

6969
ConnectionPoolImpl( ChannelConnector connector, Bootstrap bootstrap, NettyChannelTracker nettyChannelTracker,
70-
PoolSettings settings, DriverMetricsListener driverMetrics, Logging logging, Clock clock )
70+
PoolSettings settings, DriverMetricsListener metricsListener, Logging logging, Clock clock )
7171
{
7272
this.connector = connector;
7373
this.bootstrap = bootstrap;
7474
this.nettyChannelTracker = nettyChannelTracker;
7575
this.channelHealthChecker = new NettyChannelHealthChecker( settings, clock, logging );
7676
this.settings = settings;
77-
this.driverMetrics = driverMetrics;
77+
this.driverMetricsListener = metricsListener;
7878
this.clock = clock;
7979
this.log = logging.getLog( ConnectionPool.class.getSimpleName() );
8080
}
@@ -87,8 +87,8 @@ public CompletionStage<Connection> acquire( BoltServerAddress address )
8787
assertNotClosed();
8888
ChannelPool pool = getOrCreatePool( address );
8989

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

9494
return Futures.asCompletionStage( connectionFuture ).handle( ( channel, error ) ->
@@ -97,11 +97,11 @@ public CompletionStage<Connection> acquire( BoltServerAddress address )
9797
{
9898
processAcquisitionError( error );
9999
assertNotClosed( address, channel, pool );
100-
return new NettyConnection( channel, pool, clock );
100+
return new NettyConnection( channel, pool, clock, driverMetricsListener );
101101
}
102102
finally
103103
{
104-
driverMetrics.afterAcquired( address, acquireEvent );
104+
driverMetricsListener.afterAcquiringOrCreating( address, acquireEvent );
105105
}
106106
} );
107107
}
@@ -192,7 +192,7 @@ private ChannelPool getOrCreatePool( BoltServerAddress address )
192192
else
193193
{
194194
// We added a new pool as a result we add a new metrics for the pool too
195-
driverMetrics.addPoolMetrics( address, this );
195+
driverMetricsListener.addMetrics( address, this );
196196
}
197197
}
198198

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +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.ConnectionListenerEvent;
2930

3031
import static java.util.Objects.requireNonNull;
3132

@@ -59,7 +60,7 @@ public NettyChannelPool( BoltServerAddress address, ChannelConnector connector,
5960
@Override
6061
protected ChannelFuture connectChannel( Bootstrap bootstrap )
6162
{
62-
handler.channelCreating( address );
63+
ConnectionListenerEvent creatingEvent = handler.beforeChannelCreating( address );
6364
ChannelFuture channelFuture = connector.connect( address, bootstrap );
6465
channelFuture.addListener( future ->
6566
{
@@ -74,6 +75,7 @@ protected ChannelFuture connectChannel( Bootstrap bootstrap )
7475
{
7576
handler.channelFailedToCreate( address );
7677
}
78+
handler.afterChannelCreating( address, creatingEvent );
7779
} );
7880
return channelFuture;
7981
}

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

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import org.neo4j.driver.internal.BoltServerAddress;
2929
import org.neo4j.driver.internal.metrics.DriverMetricsListener;
30+
import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent;
3031
import org.neo4j.driver.v1.Logger;
3132
import org.neo4j.driver.v1.Logging;
3233

@@ -37,50 +38,59 @@ public class NettyChannelTracker implements ChannelPoolHandler
3738
private final Map<BoltServerAddress,AtomicInteger> addressToInUseChannelCount = new ConcurrentHashMap<>();
3839
private final Map<BoltServerAddress,AtomicInteger> addressToIdleChannelCount = new ConcurrentHashMap<>();
3940
private final Logger log;
40-
private DriverMetricsListener metricsHandler;
41+
private DriverMetricsListener metricsListener;
4142

42-
public NettyChannelTracker( DriverMetricsListener metricsHandler, Logging logging )
43+
public NettyChannelTracker( DriverMetricsListener metricsListener, Logging logging )
4344
{
44-
this.metricsHandler = metricsHandler;
45+
this.metricsListener = metricsListener;
4546
this.log = logging.getLog( getClass().getSimpleName() );
4647
}
4748

4849
@Override
4950
public void channelReleased( Channel channel )
5051
{
5152
log.debug( "Channel %s released back to the pool", channel );
52-
channelInactive( channel );
53+
decrementInUse( channel );
54+
incrementIdle( channel );
5355
}
5456

5557
@Override
5658
public void channelAcquired( Channel channel )
5759
{
5860
log.debug( "Channel %s acquired from the pool", channel );
59-
channelActive( channel );
61+
incrementInUse( channel );
62+
decrementIdle( channel );
6063
}
6164

6265
@Override
6366
public void channelCreated( Channel channel )
6467
{
6568
log.debug( "Channel %s created", channel );
6669
incrementInUse( channel );
67-
metricsHandler.afterCreatedSuccessfully( serverAddress( channel ) );
70+
metricsListener.afterCreated( serverAddress( channel ) );
6871
}
6972

7073
public void channelFailedToCreate( BoltServerAddress address )
7174
{
72-
metricsHandler.afterFailedToCreate( address );
75+
metricsListener.afterFailedToCreate( address );
7376
}
7477

75-
public void channelCreating( BoltServerAddress address )
78+
public ConnectionListenerEvent beforeChannelCreating( BoltServerAddress address )
7679
{
77-
metricsHandler.beforeCreating( address );
80+
ConnectionListenerEvent creatingEvent = metricsListener.createConnectionListenerEvent();
81+
metricsListener.beforeCreating( address, creatingEvent );
82+
return creatingEvent;
83+
}
84+
85+
public void afterChannelCreating( BoltServerAddress address, ConnectionListenerEvent creatingEvent )
86+
{
87+
metricsListener.afterCreating( address, creatingEvent );
7888
}
7989

8090
public void channelClosed( Channel channel )
8191
{
8292
decrementIdle( channel );
83-
metricsHandler.afterClosed( serverAddress( channel ) );
93+
metricsListener.afterClosed( serverAddress( channel ) );
8494
}
8595

8696
public int inUseChannelCount( BoltServerAddress address )
@@ -95,18 +105,6 @@ public int idleChannelCount( BoltServerAddress address )
95105
return count == null ? 0 : count.get();
96106
}
97107

98-
private void channelActive( Channel channel )
99-
{
100-
incrementInUse( channel );
101-
decrementIdle( channel );
102-
}
103-
104-
private void channelInactive( Channel channel )
105-
{
106-
decrementInUse( channel );
107-
incrementIdle( channel );
108-
}
109-
110108
private void incrementInUse( Channel channel )
111109
{
112110
increment( channel, addressToInUseChannelCount );
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) 2002-2018 "Neo Technology,"
3+
* Network Engine for Objects in Lund AB [http://neotechnology.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
package org.neo4j.driver.internal.metrics;
20+
21+
22+
public interface ConnectionMetricsListener
23+
{
24+
void beforeCreating( ListenerEvent listenerEvent );
25+
26+
void afterCreating( ListenerEvent listenerEvent );
27+
28+
void acquiredOrCreated( ListenerEvent listenerEvent );
29+
30+
void released(ListenerEvent listenerEvent);
31+
}

driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolListener.java renamed to driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java

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

21-
public interface ConnectionPoolListener
21+
public interface ConnectionPoolMetricsListener
2222
{
2323
void beforeCreating();
2424

25-
void afterCreatedSuccessfully();
25+
void afterCreated();
2626

2727
void afterFailedToCreate();
2828

2929
void afterClosed();
3030

31-
void beforeAcquire( ListenerEvent listenerEvent );
31+
void beforeAcquiringOrCreating( ListenerEvent listenerEvent );
3232

33-
void afterAcquire( ListenerEvent listenerEvent );
33+
void afterAcquiringOrCreating( ListenerEvent listenerEvent );
3434
}
3535

0 commit comments

Comments
 (0)