Skip to content

Commit 49fad6d

Browse files
authored
Finish consolidating connection pool metrics (#1992)
When I first refactored connection pool metrics, I left some `connectionPool*` metrics in `ConnectionPoolHandler` for simplicity. In this PR I moved those metrics into `ConnectionPoolMetrics`
1 parent cb72449 commit 49fad6d

File tree

4 files changed

+44
-27
lines changed

4 files changed

+44
-27
lines changed

zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/ConnectionPoolHandler.java

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@
1919
import static com.netflix.netty.common.HttpLifecycleChannelHandler.CompleteEvent;
2020
import static com.netflix.netty.common.HttpLifecycleChannelHandler.CompleteReason;
2121

22-
import com.netflix.spectator.api.Counter;
22+
import com.netflix.spectator.api.Spectator;
2323
import com.netflix.zuul.netty.ChannelUtils;
24-
import com.netflix.zuul.netty.SpectatorUtils;
2524
import com.netflix.zuul.origins.OriginName;
2625
import io.netty.channel.ChannelDuplexHandler;
2726
import io.netty.channel.ChannelHandler;
@@ -30,6 +29,7 @@
3029
import io.netty.handler.codec.http.HttpResponse;
3130
import io.netty.handler.ssl.SslCloseCompletionEvent;
3231
import io.netty.handler.timeout.IdleStateEvent;
32+
import java.util.Objects;
3333
import org.slf4j.Logger;
3434
import org.slf4j.LoggerFactory;
3535

@@ -42,26 +42,18 @@
4242
public class ConnectionPoolHandler extends ChannelDuplexHandler {
4343
private static final Logger LOG = LoggerFactory.getLogger(ConnectionPoolHandler.class);
4444

45-
public static final String METRIC_PREFIX = "connectionpool";
46-
45+
private final ConnectionPoolMetrics metrics;
4746
private final OriginName originName;
48-
private final Counter idleCounter;
49-
private final Counter inactiveCounter;
50-
private final Counter errorCounter;
51-
private final Counter headerCloseCounter;
52-
private final Counter sslCloseCompletionCounter;
5347

48+
49+
@Deprecated
5450
public ConnectionPoolHandler(OriginName originName) {
55-
if (originName == null) {
56-
throw new IllegalArgumentException("Null originName passed to constructor!");
57-
}
58-
this.originName = originName;
59-
this.idleCounter = SpectatorUtils.newCounter(METRIC_PREFIX + "_idle", originName.getMetricId());
60-
this.inactiveCounter = SpectatorUtils.newCounter(METRIC_PREFIX + "_inactive", originName.getMetricId());
61-
this.errorCounter = SpectatorUtils.newCounter(METRIC_PREFIX + "_error", originName.getMetricId());
62-
this.headerCloseCounter = SpectatorUtils.newCounter(METRIC_PREFIX + "_headerClose", originName.getMetricId());
63-
this.sslCloseCompletionCounter =
64-
SpectatorUtils.newCounter(METRIC_PREFIX + "_sslClose", originName.getMetricId());
51+
this(ConnectionPoolMetrics.create(Objects.requireNonNull(originName), Spectator.globalRegistry()));
52+
}
53+
54+
public ConnectionPoolHandler(ConnectionPoolMetrics metrics) {
55+
this.originName = metrics.originName();
56+
this.metrics = metrics;
6557
}
6658

6759
@Override
@@ -71,7 +63,7 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc
7163

7264
if (evt instanceof IdleStateEvent) {
7365
// Log some info about this.
74-
idleCounter.increment();
66+
metrics.idleCounter().increment();
7567
String msg = "Origin channel for origin - " + originName + " - idle timeout has fired. "
7668
+ ChannelUtils.channelInfoForLogging(ctx.channel());
7769
closeConnection(ctx, msg);
@@ -88,7 +80,7 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc
8880
String msg = "Origin channel for origin - " + originName
8981
+ " - completed because of expired keep-alive. "
9082
+ ChannelUtils.channelInfoForLogging(ctx.channel());
91-
headerCloseCounter.increment();
83+
metrics.headerCloseCounter().increment();
9284
closeConnection(ctx, msg);
9385
} else {
9486
conn.setConnectionState(PooledConnection.ConnectionState.WRITE_READY);
@@ -101,7 +93,7 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc
10193
closeConnection(ctx, msg);
10294
}
10395
} else if (evt instanceof SslCloseCompletionEvent event) {
104-
sslCloseCompletionCounter.increment();
96+
metrics.sslCloseCompletionCounter().increment();
10597
String msg = "Origin channel for origin - " + originName + " - received SslCloseCompletionEvent " + event
10698
+ ". " + ChannelUtils.channelInfoForLogging(ctx.channel());
10799
closeConnection(ctx, msg);
@@ -111,7 +103,7 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc
111103
@Override
112104
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
113105
// super.exceptionCaught(ctx, cause);
114-
errorCounter.increment();
106+
metrics.errorCounter().increment();
115107
String mesg = "Exception on Origin channel for origin - " + originName + ". "
116108
+ ChannelUtils.channelInfoForLogging(ctx.channel()) + " - "
117109
+ cause.getClass().getCanonicalName()
@@ -126,7 +118,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E
126118
@Override
127119
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
128120
// super.channelInactive(ctx);
129-
inactiveCounter.increment();
121+
metrics.inactiveCounter().increment();
130122
String msg = "Client channel for origin - " + originName + " - inactive event has fired. "
131123
+ ChannelUtils.channelInfoForLogging(ctx.channel());
132124
closeConnection(ctx, msg);

zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/ConnectionPoolMetrics.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
* @since 2/26/25
2929
*/
3030
public record ConnectionPoolMetrics(
31+
OriginName originName,
3132
Counter createNewConnCounter,
3233
Counter createConnSucceededCounter,
3334
Counter createConnFailedCounter,
@@ -44,7 +45,12 @@ public record ConnectionPoolMetrics(
4445
Counter circuitBreakerClose,
4546
PercentileTimer connEstablishTimer,
4647
AtomicInteger connsInPool,
47-
AtomicInteger connsInUse) {
48+
AtomicInteger connsInUse,
49+
Counter idleCounter,
50+
Counter inactiveCounter,
51+
Counter errorCounter,
52+
Counter headerCloseCounter,
53+
Counter sslCloseCompletionCounter) {
4854

4955
public static ConnectionPoolMetrics create(OriginName originName, Registry registry) {
5056
Counter createNewConnCounter = newCounter("connectionpool_create", originName, registry);
@@ -66,13 +72,20 @@ public static ConnectionPoolMetrics create(OriginName originName, Registry regis
6672
Counter closeWrtBusyConnCounter = newCounter("connectionpool_closeWrtBusyConnCounter", originName, registry);
6773
Counter circuitBreakerClose = newCounter("connectionpool_closeCircuitBreaker", originName, registry);
6874

75+
Counter idleCounter = newCounter("connectionpool_idle", originName, registry);
76+
Counter inactiveCounter = newCounter("connectionpool_inactive", originName, registry);
77+
Counter errorCounter = newCounter("connectionpool_error", originName, registry);
78+
Counter headerCloseCounter = newCounter("connectionpool_headerClose", originName, registry);
79+
Counter sslCloseCompletionCounter = newCounter("connectionpool_sslClose", originName, registry);
80+
6981
PercentileTimer connEstablishTimer = PercentileTimer.get(
7082
registry, registry.createId("connectionpool_createTiming", "id", originName.getMetricId()));
7183

7284
AtomicInteger connsInPool = newGauge("connectionpool_inPool", originName, registry);
7385
AtomicInteger connsInUse = newGauge("connectionpool_inUse", originName, registry);
7486

7587
return new ConnectionPoolMetrics(
88+
originName,
7689
createNewConnCounter,
7790
createConnSucceededCounter,
7891
createConnFailedCounter,
@@ -89,7 +102,12 @@ public static ConnectionPoolMetrics create(OriginName originName, Registry regis
89102
circuitBreakerClose,
90103
connEstablishTimer,
91104
connsInPool,
92-
connsInUse);
105+
connsInUse,
106+
idleCounter,
107+
inactiveCounter,
108+
errorCounter,
109+
headerCloseCounter,
110+
sslCloseCompletionCounter);
93111
}
94112

95113
private static Counter newCounter(String metricName, OriginName originName, Registry registry) {

zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/DefaultOriginChannelInitializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ public class DefaultOriginChannelInitializer extends OriginChannelInitializer {
4949
public DefaultOriginChannelInitializer(ConnectionPoolConfig connPoolConfig, Registry spectatorRegistry) {
5050
this.connectionPoolConfig = connPoolConfig;
5151
String niwsClientName = connectionPoolConfig.getOriginName().getNiwsClientName();
52-
this.connectionPoolHandler = new ConnectionPoolHandler(connectionPoolConfig.getOriginName());
52+
this.connectionPoolHandler = new ConnectionPoolHandler(
53+
ConnectionPoolMetrics.create(connPoolConfig.getOriginName(), spectatorRegistry));
5354
this.httpMetricsHandler = new HttpMetricsChannelHandler(spectatorRegistry, "client", niwsClientName);
5455
this.nettyLogger = new LoggingHandler("zuul.origin.nettylog." + niwsClientName, LogLevel.INFO);
5556
this.sslContext = getClientSslContext(spectatorRegistry);

zuul-core/src/test/java/com/netflix/zuul/netty/connectionpool/ConnectionPoolMetricsTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ public void validateMetricNames() {
5454
validateCounter("connectionpool_maxConnsPerHostExceeded", metrics.maxConnsPerHostExceededCounter());
5555
validateCounter("connectionpool_closeWrtBusyConnCounter", metrics.closeWrtBusyConnCounter());
5656
validateCounter("connectionpool_closeCircuitBreaker", metrics.circuitBreakerClose());
57+
58+
validateCounter("connectionpool_idle", metrics.idleCounter());
59+
validateCounter("connectionpool_inactive", metrics.inactiveCounter());
60+
validateCounter("connectionpool_error", metrics.errorCounter());
61+
validateCounter("connectionpool_headerClose", metrics.headerCloseCounter());
62+
validateCounter("connectionpool_sslClose", metrics.sslCloseCompletionCounter());
5763
}
5864

5965
private void validateCounter(String name, Counter counter) {

0 commit comments

Comments
 (0)