Skip to content

Micrometer metrics #1137

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 28 commits into from
Mar 8, 2022
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
e2a4e73
[WIP] Micrometer metrics instrumentation
shakuzen Dec 14, 2021
bd80f38
Bring it to life.
meistermeier Jan 19, 2022
ce3af7e
Update Micrometer metrics
injectives Jan 25, 2022
ec5dbf3
Merge branch '5.0' into micrometer-metrics
injectives Jan 28, 2022
faf764b
Make MetricsAdapter a supported, public api.
michael-simons Feb 2, 2022
f56e4bc
Saving a file before commiting seems to be relevant.
michael-simons Feb 2, 2022
6957633
Not messing up the file while saven even more so.
michael-simons Feb 3, 2022
afc433f
Make interfaces internal again, provide an enum to select the provide…
michael-simons Feb 3, 2022
f2ca0df
Move micrometer-core optional tag to dependency declaration
injectives Feb 3, 2022
fec69a2
Update Config javadoc and remove imports of internal metrics classes
injectives Feb 3, 2022
70bab1d
Update withMetricsEnabled(boolean) implementation
injectives Feb 3, 2022
0e0e61e
Enable ConfigBuilder.withMetricsAdapter documentation
injectives Feb 3, 2022
2167eeb
Update driver/src/main/java/org/neo4j/driver/ConnectionPoolMetrics.java
injectives Feb 3, 2022
0c8fe23
Update ConnectionPoolMetrics documentation
injectives Feb 3, 2022
479f14f
Update MetricsAdapter documentation
injectives Feb 3, 2022
d942e0d
Update formatting in ConfigTest
injectives Feb 3, 2022
acf04ad
Update wording
injectives Feb 7, 2022
674f5cc
Updated wording
injectives Feb 7, 2022
575682c
Formatting
injectives Feb 7, 2022
921ac63
Update driver/src/main/java/org/neo4j/driver/internal/metrics/DevNull…
injectives Feb 7, 2022
85cbcd0
Update driver/src/main/java/org/neo4j/driver/internal/metrics/Microme…
injectives Feb 8, 2022
40db7b6
Merge branch '5.0' into micrometer-metrics
injectives Feb 22, 2022
6ff57ac
Merge branch '5.0' into micrometer-metrics
injectives Feb 28, 2022
a0d1d95
Fix compilation error
injectives Feb 28, 2022
c692db1
Update failing test
injectives Feb 28, 2022
520aab6
Fix GetConnectionPoolMetrics access
injectives Feb 28, 2022
acad532
Delete redundant counters based on review feedback
injectives Mar 7, 2022
6ece62a
Merge branch '5.0' into micrometer-metrics
injectives Mar 8, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions bundle/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@
<artifactId>slf4j-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>svm</artifactId>
Expand Down
5 changes: 5 additions & 0 deletions driver/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@
</dependency>

<!-- Optional and / or provided dependencies -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
Expand Down
32 changes: 31 additions & 1 deletion driver/src/main/java/org/neo4j/driver/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@
*/
package org.neo4j.driver;

import io.micrometer.core.instrument.MeterRegistry;

import java.io.File;
import java.io.Serializable;
import java.net.InetAddress;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

Expand All @@ -32,6 +35,7 @@
import org.neo4j.driver.internal.handlers.pulln.FetchSizeUtil;
import org.neo4j.driver.internal.retry.RetrySettings;
import org.neo4j.driver.net.ServerAddressResolver;
import org.neo4j.driver.util.Experimental;
import org.neo4j.driver.util.Immutable;

import static java.lang.String.format;
Expand Down Expand Up @@ -95,6 +99,7 @@ public class Config implements Serializable
private final boolean isMetricsEnabled;
private final int eventLoopThreads;
private final String userAgent;
private final MeterRegistry meterRegistry;

private Config( ConfigBuilder builder )
{
Expand All @@ -119,6 +124,7 @@ private Config( ConfigBuilder builder )

this.eventLoopThreads = builder.eventLoopThreads;
this.isMetricsEnabled = builder.isMetricsEnabled;
this.meterRegistry = builder.meterRegistry;
}

/**
Expand Down Expand Up @@ -259,6 +265,11 @@ public boolean isMetricsEnabled()
return isMetricsEnabled;
}

public Optional<MeterRegistry> meterRegistry()
{
return Optional.ofNullable( meterRegistry );
}

/**
* @return the user_agent configured for this driver
*/
Expand Down Expand Up @@ -289,6 +300,7 @@ public static class ConfigBuilder
private boolean isMetricsEnabled = false;
private long fetchSize = FetchSizeUtil.DEFAULT_FETCH_SIZE;
private int eventLoopThreads = 0;
private MeterRegistry meterRegistry;

private ConfigBuilder() {}

Expand Down Expand Up @@ -699,7 +711,8 @@ public ConfigBuilder withResolver( ServerAddressResolver resolver )
}

/**
* Enable driver metrics. The metrics can be obtained afterwards via {@link Driver#metrics()}.
* Enable driver metrics backed by internal basic implementation. The metrics can be obtained afterwards via {@link Driver#metrics()}.
*
* @return this builder.
*/
public ConfigBuilder withDriverMetrics()
Expand All @@ -708,6 +721,23 @@ public ConfigBuilder withDriverMetrics()
return this;
}

/**
* Enable driver metrics backed by Micrometer instrumentation. The metrics can be obtained afterwards via Micrometer means and {@link
* Driver#metrics()}.
* <p>
* You must have Micrometer on classpath to use this option.
*
* @param meterRegistry meter registry to register metrics with.
* @return this builder.
*/
@Experimental
public ConfigBuilder withMicrometerDriverMetrics( MeterRegistry meterRegistry )
{
this.meterRegistry = Objects.requireNonNull( meterRegistry, "meterRegistry" );
this.isMetricsEnabled = true;
return this;
}

/**
* Disable driver metrics. When disabled, driver metrics cannot be accessed via {@link Driver#metrics()}.
* @return this builder.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@
public interface ConnectionPoolMetrics
{
/**
* An unique id that identifies this pool metrics.
* @return An unique name
* A unique id that identifies this pool metrics.
*
* @return A unique name
*/
String id();

Expand Down Expand Up @@ -59,7 +60,7 @@ public interface ConnectionPoolMetrics
/**
* A counter to record how many connections have been successfully created with this pool since the pool is created.
* This number increases every time when a connection is successfully created.
* @return The amount of connections have ever been created by this pool.
* @return The amount of connections has ever been created by this pool.
*/
long created();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.neo4j.driver.internal.logging.NettyLogging;
import org.neo4j.driver.internal.metrics.InternalMetricsProvider;
import org.neo4j.driver.internal.metrics.MetricsProvider;
import org.neo4j.driver.internal.metrics.MicrometerMetricsProvider;
import org.neo4j.driver.internal.retry.ExponentialBackoffRetryLogic;
import org.neo4j.driver.internal.retry.RetryLogic;
import org.neo4j.driver.internal.retry.RetrySettings;
Expand Down Expand Up @@ -118,7 +119,9 @@ protected static MetricsProvider createDriverMetrics( Config config, Clock clock
{
if( config.isMetricsEnabled() )
{
return new InternalMetricsProvider( clock, config.logging() );
return config.meterRegistry()
.<MetricsProvider>map( MicrometerMetricsProvider::new )
.orElseGet( () -> new InternalMetricsProvider( Clock.SYSTEM, config.logging() ) );
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ public interface ConnectionPoolMetricsListener
/**
* Invoked before a connection is creating.
*/
void beforeCreating( ListenerEvent listenerEvent );
void beforeCreating( ListenerEvent<?> listenerEvent );

/**
* Invoked after a connection is created successfully.
*/
void afterCreated( ListenerEvent listenerEvent );
void afterCreated( ListenerEvent<?> listenerEvent );

/**
* Invoked after a connection is failed to create due to timeout, any kind of error.
Expand All @@ -42,9 +42,10 @@ public interface ConnectionPoolMetricsListener

/**
* Invoked before acquiring or creating a connection.
*
* @param acquireEvent
*/
void beforeAcquiringOrCreating( ListenerEvent acquireEvent );
void beforeAcquiringOrCreating( ListenerEvent<?> acquireEvent );

/**
* Invoked after a connection is being acquired or created regardless weather it is successful or not.
Expand All @@ -53,9 +54,10 @@ public interface ConnectionPoolMetricsListener

/**
* Invoked after a connection is acquired or created successfully.
*
* @param acquireEvent
*/
void afterAcquiredOrCreated( ListenerEvent acquireEvent );
void afterAcquiredOrCreated( ListenerEvent<?> acquireEvent );

/**
* Invoked after it is timed out to acquire or create a connection.
Expand All @@ -64,26 +66,28 @@ public interface ConnectionPoolMetricsListener

/**
* After a connection is acquired from the pool.
*
* @param inUseEvent
*/
void acquired( ListenerEvent inUseEvent );
void acquired( ListenerEvent<?> inUseEvent );

/**
* After a connection is released back to pool.
*
* @param inUseEvent
*/
void released( ListenerEvent inUseEvent );
void released( ListenerEvent<?> inUseEvent );

ConnectionPoolMetricsListener DEV_NULL_POOL_METRICS_LISTENER = new ConnectionPoolMetricsListener()
{
@Override
public void beforeCreating( ListenerEvent listenerEvent )
public void beforeCreating( ListenerEvent<?> listenerEvent )
{

}

@Override
public void afterCreated( ListenerEvent listenerEvent )
public void afterCreated( ListenerEvent<?> listenerEvent )
{

}
Expand All @@ -101,7 +105,7 @@ public void afterClosed()
}

@Override
public void beforeAcquiringOrCreating( ListenerEvent acquireEvent )
public void beforeAcquiringOrCreating( ListenerEvent<?> acquireEvent )
{

}
Expand All @@ -113,7 +117,7 @@ public void afterAcquiringOrCreating()
}

@Override
public void afterAcquiredOrCreated( ListenerEvent acquireEvent )
public void afterAcquiredOrCreated( ListenerEvent<?> acquireEvent )
{

}
Expand All @@ -125,13 +129,13 @@ public void afterTimedOutToAcquireOrCreate()
}

@Override
public void acquired( ListenerEvent inUseEvent )
public void acquired( ListenerEvent<?> inUseEvent )
{

}

@Override
public void released( ListenerEvent inUseEvent )
public void released( ListenerEvent<?> inUseEvent )
{

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ public abstract class InternalAbstractMetrics implements Metrics, MetricsListene
{

@Override
public void beforeCreating( String poolId, ListenerEvent creatingEvent )
public void beforeCreating( String poolId, ListenerEvent<?> creatingEvent )
{

}

@Override
public void afterCreated( String poolId, ListenerEvent creatingEvent )
public void afterCreated( String poolId, ListenerEvent<?> creatingEvent )
{

}
Expand All @@ -56,7 +56,7 @@ public void afterClosed( String poolId )
}

@Override
public void beforeAcquiringOrCreating( String poolId, ListenerEvent acquireEvent )
public void beforeAcquiringOrCreating( String poolId, ListenerEvent<?> acquireEvent )
{

}
Expand All @@ -68,7 +68,7 @@ public void afterAcquiringOrCreating( String poolId )
}

@Override
public void afterAcquiredOrCreated( String poolId, ListenerEvent acquireEvent )
public void afterAcquiredOrCreated( String poolId, ListenerEvent<?> acquireEvent )
{

}
Expand All @@ -80,19 +80,19 @@ public void afterTimedOutToAcquireOrCreate( String poolId )
}

@Override
public void afterConnectionCreated( String poolId, ListenerEvent inUseEvent )
public void afterConnectionCreated( String poolId, ListenerEvent<?> inUseEvent )
{

}

@Override
public void afterConnectionReleased( String poolId, ListenerEvent inUseEvent )
public void afterConnectionReleased( String poolId, ListenerEvent<?> inUseEvent )
{

}

@Override
public ListenerEvent createListenerEvent()
public ListenerEvent<?> createListenerEvent()
{
return ListenerEvent.DEV_NULL_LISTENER_EVENT;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public class InternalConnectionPoolMetrics implements ConnectionPoolMetrics, Con
}

@Override
public void beforeCreating( ListenerEvent connEvent )
public void beforeCreating( ListenerEvent<?> connEvent )
{
creating.incrementAndGet();
connEvent.start();
Expand All @@ -77,13 +77,13 @@ public void afterFailedToCreate()
}

@Override
public void afterCreated( ListenerEvent connEvent )
public void afterCreated( ListenerEvent<?> connEvent )
{
created.incrementAndGet();
creating.decrementAndGet();
long elapsed = connEvent.elapsed();
long sample = ((TimeRecorderListenerEvent) connEvent).getSample();

totalConnectionTime.addAndGet( elapsed );
totalConnectionTime.addAndGet( sample );
}

@Override
Expand All @@ -93,7 +93,7 @@ public void afterClosed()
}

@Override
public void beforeAcquiringOrCreating( ListenerEvent acquireEvent )
public void beforeAcquiringOrCreating( ListenerEvent<?> acquireEvent )
{
acquireEvent.start();
acquiring.incrementAndGet();
Expand All @@ -106,12 +106,12 @@ public void afterAcquiringOrCreating()
}

@Override
public void afterAcquiredOrCreated( ListenerEvent acquireEvent )
public void afterAcquiredOrCreated( ListenerEvent<?> acquireEvent )
{
acquired.incrementAndGet();
long elapsed = acquireEvent.elapsed();
long sample = ((TimeRecorderListenerEvent) acquireEvent).getSample();

totalAcquisitionTime.addAndGet( elapsed );
totalAcquisitionTime.addAndGet( sample );
}

@Override
Expand All @@ -121,18 +121,18 @@ public void afterTimedOutToAcquireOrCreate()
}

@Override
public void acquired( ListenerEvent inUseEvent )
public void acquired( ListenerEvent<?> inUseEvent )
{
inUseEvent.start();
}

@Override
public void released( ListenerEvent inUseEvent )
public void released( ListenerEvent<?> inUseEvent )
{
totalInUseCount.incrementAndGet();
long elapsed = inUseEvent.elapsed();
long sample = ((TimeRecorderListenerEvent) inUseEvent).getSample();

totalInUseTime.addAndGet( elapsed );
totalInUseTime.addAndGet( sample );
}

@Override
Expand Down
Loading