Skip to content

Commit be4cd1d

Browse files
authored
Merge pull request #470 from zhenlineo/1.6-metrics
Draft of driver metrics
2 parents e9ccc38 + f6dc900 commit be4cd1d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1866
-315
lines changed

driver/pom.xml

Lines changed: 9 additions & 0 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>
@@ -208,13 +212,18 @@
208212
<artifactSet>
209213
<includes>
210214
<include>io.netty:*</include>
215+
<include>org.hdrhistogram:*</include>
211216
</includes>
212217
</artifactSet>
213218
<relocations>
214219
<relocation>
215220
<pattern>io.netty</pattern>
216221
<shadedPattern>org.neo4j.driver.internal.shaded.io.netty</shadedPattern>
217222
</relocation>
223+
<relocation>
224+
<pattern>org.HdrHistogram</pattern>
225+
<shadedPattern>org.neo4j.driver.internal.shaded.org.HdrHistogram</shadedPattern>
226+
</relocation>
218227
</relocations>
219228
<shadeTestJar>true</shadeTestJar>
220229
</configuration>

driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
import org.neo4j.driver.internal.cluster.loadbalancing.LoadBalancingStrategy;
3939
import org.neo4j.driver.internal.cluster.loadbalancing.RoundRobinLoadBalancingStrategy;
4040
import org.neo4j.driver.internal.logging.NettyLogging;
41+
import org.neo4j.driver.internal.metrics.MetricsListener;
42+
import org.neo4j.driver.internal.metrics.InternalAbstractMetrics;
43+
import org.neo4j.driver.internal.metrics.InternalMetrics;
44+
import org.neo4j.driver.internal.metrics.spi.Metrics;
4145
import org.neo4j.driver.internal.retry.ExponentialBackoffRetryLogic;
4246
import org.neo4j.driver.internal.retry.RetryLogic;
4347
import org.neo4j.driver.internal.retry.RetrySettings;
@@ -56,6 +60,8 @@
5660
import org.neo4j.driver.v1.exceptions.ServiceUnavailableException;
5761

5862
import static java.lang.String.format;
63+
import static org.neo4j.driver.internal.metrics.InternalAbstractMetrics.DEV_NULL_METRICS;
64+
import static org.neo4j.driver.internal.metrics.spi.Metrics.isMetricsEnabled;
5965
import static org.neo4j.driver.internal.security.SecurityPlan.insecure;
6066

6167
public class DriverFactory
@@ -77,18 +83,17 @@ public final Driver newInstance( URI uri, AuthToken authToken, RoutingSettings r
7783
EventExecutorGroup eventExecutorGroup = bootstrap.config().group();
7884
RetryLogic retryLogic = createRetryLogic( retrySettings, eventExecutorGroup, config.logging() );
7985

80-
ConnectionPool connectionPool = createConnectionPool( authToken, securityPlan, bootstrap, config );
86+
InternalAbstractMetrics metrics = createDriverMetrics( config );
87+
ConnectionPool connectionPool = createConnectionPool( authToken, securityPlan, bootstrap, metrics, config );
8188

82-
InternalDriver driver = createDriver( uri, address, connectionPool, config, newRoutingSettings,
83-
eventExecutorGroup, securityPlan, retryLogic );
89+
InternalDriver driver = createDriver( uri, securityPlan, address, connectionPool, eventExecutorGroup, newRoutingSettings, retryLogic, metrics, config );
8490

8591
verifyConnectivity( driver, connectionPool, config );
8692

8793
return driver;
8894
}
8995

90-
protected ConnectionPool createConnectionPool( AuthToken authToken, SecurityPlan securityPlan,
91-
Bootstrap bootstrap, Config config )
96+
protected ConnectionPool createConnectionPool( AuthToken authToken, SecurityPlan securityPlan, Bootstrap bootstrap, MetricsListener metrics, Config config )
9297
{
9398
Clock clock = createClock();
9499
ConnectionSettings settings = new ConnectionSettings( authToken, config.connectionTimeoutMillis() );
@@ -97,7 +102,19 @@ protected ConnectionPool createConnectionPool( AuthToken authToken, SecurityPlan
97102
config.connectionAcquisitionTimeoutMillis(), config.maxConnectionLifetimeMillis(),
98103
config.idleTimeBeforeConnectionTest()
99104
);
100-
return new ConnectionPoolImpl( connector, bootstrap, poolSettings, config.logging(), clock );
105+
return new ConnectionPoolImpl( connector, bootstrap, poolSettings, metrics, config.logging(), clock );
106+
}
107+
108+
protected static InternalAbstractMetrics createDriverMetrics( Config config )
109+
{
110+
if( isMetricsEnabled() )
111+
{
112+
return new InternalMetrics( config );
113+
}
114+
else
115+
{
116+
return DEV_NULL_METRICS;
117+
}
101118
}
102119

103120
protected ChannelConnector createConnector( ConnectionSettings settings, SecurityPlan securityPlan,
@@ -106,9 +123,8 @@ protected ChannelConnector createConnector( ConnectionSettings settings, Securit
106123
return new ChannelConnectorImpl( settings, securityPlan, config.logging(), clock );
107124
}
108125

109-
private InternalDriver createDriver( URI uri, BoltServerAddress address,
110-
ConnectionPool connectionPool, Config config, RoutingSettings routingSettings,
111-
EventExecutorGroup eventExecutorGroup, SecurityPlan securityPlan, RetryLogic retryLogic )
126+
private InternalDriver createDriver( URI uri, SecurityPlan securityPlan, BoltServerAddress address, ConnectionPool connectionPool,
127+
EventExecutorGroup eventExecutorGroup, RoutingSettings routingSettings, RetryLogic retryLogic, Metrics metrics, Config config )
112128
{
113129
try
114130
{
@@ -117,10 +133,9 @@ private InternalDriver createDriver( URI uri, BoltServerAddress address,
117133
{
118134
case BOLT_URI_SCHEME:
119135
assertNoRoutingContext( uri, routingSettings );
120-
return createDirectDriver( address, config, securityPlan, retryLogic, connectionPool );
136+
return createDirectDriver( securityPlan, address, connectionPool, retryLogic, metrics, config );
121137
case BOLT_ROUTING_URI_SCHEME:
122-
return createRoutingDriver( address, connectionPool, config, routingSettings, securityPlan, retryLogic,
123-
eventExecutorGroup );
138+
return createRoutingDriver( securityPlan, address, connectionPool, eventExecutorGroup, routingSettings, retryLogic, metrics, config );
124139
default:
125140
throw new ClientException( format( "Unsupported URI scheme: %s", scheme ) );
126141
}
@@ -138,22 +153,21 @@ private InternalDriver createDriver( URI uri, BoltServerAddress address,
138153
* <p>
139154
* <b>This method is protected only for testing</b>
140155
*/
141-
protected InternalDriver createDirectDriver( BoltServerAddress address, Config config,
142-
SecurityPlan securityPlan, RetryLogic retryLogic, ConnectionPool connectionPool )
156+
protected InternalDriver createDirectDriver( SecurityPlan securityPlan, BoltServerAddress address, ConnectionPool connectionPool, RetryLogic retryLogic,
157+
Metrics metrics, Config config )
143158
{
144159
ConnectionProvider connectionProvider = new DirectConnectionProvider( address, connectionPool );
145160
SessionFactory sessionFactory = createSessionFactory( connectionProvider, retryLogic, config );
146-
return createDriver( sessionFactory, securityPlan, config );
161+
return createDriver( securityPlan, sessionFactory, metrics, config );
147162
}
148163

149164
/**
150165
* Creates new a new driver for "bolt+routing" scheme.
151166
* <p>
152167
* <b>This method is protected only for testing</b>
153168
*/
154-
protected InternalDriver createRoutingDriver( BoltServerAddress address, ConnectionPool connectionPool,
155-
Config config, RoutingSettings routingSettings, SecurityPlan securityPlan, RetryLogic retryLogic,
156-
EventExecutorGroup eventExecutorGroup )
169+
protected InternalDriver createRoutingDriver( SecurityPlan securityPlan, BoltServerAddress address, ConnectionPool connectionPool,
170+
EventExecutorGroup eventExecutorGroup, RoutingSettings routingSettings, RetryLogic retryLogic, Metrics metrics, Config config )
157171
{
158172
if ( !securityPlan.isRoutingCompatible() )
159173
{
@@ -162,17 +176,17 @@ protected InternalDriver createRoutingDriver( BoltServerAddress address, Connect
162176
ConnectionProvider connectionProvider = createLoadBalancer( address, connectionPool, eventExecutorGroup,
163177
config, routingSettings );
164178
SessionFactory sessionFactory = createSessionFactory( connectionProvider, retryLogic, config );
165-
return createDriver( sessionFactory, securityPlan, config );
179+
return createDriver( securityPlan, sessionFactory, metrics, config );
166180
}
167181

168182
/**
169183
* Creates new {@link Driver}.
170184
* <p>
171185
* <b>This method is protected only for testing</b>
172186
*/
173-
protected InternalDriver createDriver( SessionFactory sessionFactory, SecurityPlan securityPlan, Config config )
187+
protected InternalDriver createDriver( SecurityPlan securityPlan, SessionFactory sessionFactory, Metrics metrics, Config config )
174188
{
175-
return new InternalDriver( securityPlan, sessionFactory, config.logging() );
189+
return new InternalDriver( securityPlan, sessionFactory, metrics, config.logging() );
176190
}
177191

178192
/**

driver/src/main/java/org/neo4j/driver/internal/InternalDriver.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.concurrent.CompletionStage;
2222
import java.util.concurrent.atomic.AtomicBoolean;
2323

24+
import org.neo4j.driver.internal.metrics.spi.Metrics;
2425
import org.neo4j.driver.internal.security.SecurityPlan;
2526
import org.neo4j.driver.internal.util.Futures;
2627
import org.neo4j.driver.v1.AccessMode;
@@ -38,11 +39,13 @@ public class InternalDriver implements Driver
3839
private final Logger log;
3940

4041
private AtomicBoolean closed = new AtomicBoolean( false );
42+
private final Metrics metrics;
4143

42-
InternalDriver( SecurityPlan securityPlan, SessionFactory sessionFactory, Logging logging )
44+
InternalDriver( SecurityPlan securityPlan, SessionFactory sessionFactory, Metrics metrics, Logging logging )
4345
{
4446
this.securityPlan = securityPlan;
4547
this.sessionFactory = sessionFactory;
48+
this.metrics = metrics;
4649
this.log = logging.getLog( Driver.class.getSimpleName() );
4750
log.info( "Driver instance %s created", this );
4851
}
@@ -144,6 +147,11 @@ private void assertOpen()
144147
}
145148
}
146149

150+
public Metrics metrics()
151+
{
152+
return this.metrics;
153+
}
154+
147155
private static RuntimeException driverCloseException()
148156
{
149157
return new IllegalStateException( "This driver instance has already been closed" );

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.ListenerEvent;
38+
import org.neo4j.driver.internal.metrics.MetricsListener;
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 MetricsListener metricsListener;
60+
private final ListenerEvent inUseEvent;
5761

58-
public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock )
62+
public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, MetricsListener metricsListener )
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 = metricsListener;
72+
this.inUseEvent = metricsListener.createListenerEvent();
73+
metricsListener.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/ActiveChannelTracker.java

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)