aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2021-05-12 14:28:26 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2021-05-12 14:28:26 +0200
commited3560b3c448a1d6911a66f9f8703ff83823c91a (patch)
treec439766e1893dd2be3d57978ca5f51e38b1440d0 /container-core/src/main/java/com/yahoo
parent18afc9cf39d86308f03330243d2f3d90f5d4fffe (diff)
Add metric for requests per connection
Diffstat (limited to 'container-core/src/main/java/com/yahoo')
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java65
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java6
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java4
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java3
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricDefinitions.java1
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestUtils.java5
6 files changed, 80 insertions, 4 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java
new file mode 100644
index 00000000000..a92cbf264a4
--- /dev/null
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java
@@ -0,0 +1,65 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.jdisc.http.server.jetty;
+
+import com.yahoo.jdisc.Metric;
+import com.yahoo.jdisc.http.ServerConfig;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.server.HttpChannel;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
+
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static com.yahoo.jdisc.http.server.jetty.RequestUtils.getConnector;
+import static com.yahoo.jdisc.http.server.jetty.RequestUtils.isHttpServerConnection;
+
+/**
+ * @author bjorncs
+ */
+class ConnectionMetricAggregator extends AbstractLifeCycle implements Connection.Listener, HttpChannel.Listener{
+
+ private final SimpleConcurrentIdentityHashMap<Connection, ConnectionMetrics> connectionsMetrics = new SimpleConcurrentIdentityHashMap<>();
+
+ private final Metric metricAggregator;
+ private final Collection<String> monitoringHandlerPaths;
+
+ ConnectionMetricAggregator(ServerConfig serverConfig, Metric metricAggregator) {
+ this.monitoringHandlerPaths = serverConfig.metric().monitoringHandlerPaths();
+ this.metricAggregator = metricAggregator;
+ }
+
+ @Override public void onOpened(Connection connection) {}
+
+ @Override
+ public void onClosed(Connection connection) {
+ if (isHttpServerConnection(connection)) {
+ connectionsMetrics.remove(connection).ifPresent(metrics ->
+ metricAggregator.set(MetricDefinitions.REQUESTS_PER_CONNECTION, metrics.requests.get(), metrics.metricContext));
+ }
+ }
+
+ @Override
+ public void onRequestBegin(Request request) {
+ if (monitoringHandlerPaths.stream()
+ .anyMatch(pathPrefix -> request.getRequestURI().startsWith(pathPrefix))){
+ return;
+ }
+ Connection connection = request.getHttpChannel().getConnection();
+ if (isHttpServerConnection(connection)) {
+ ConnectionMetrics metrics = this.connectionsMetrics.computeIfAbsent(
+ connection,
+ () -> new ConnectionMetrics(getConnector(request).getConnectorMetricContext()));
+ metrics.requests.incrementAndGet();
+ }
+ }
+
+ private static class ConnectionMetrics {
+ final AtomicLong requests = new AtomicLong();
+ final Metric.Context metricContext;
+
+ ConnectionMetrics(Metric.Context metricContext) {
+ this.metricContext = metricContext;
+ }
+ }
+}
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java
index b9b6bcf57f0..9d14771d242 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java
@@ -66,9 +66,11 @@ public class ConnectorFactory {
return connectorConfig;
}
- public ServerConnector createConnector(final Metric metric, final Server server, JettyConnectionLogger connectionLogger) {
+ public ServerConnector createConnector(final Metric metric, final Server server, JettyConnectionLogger connectionLogger,
+ ConnectionMetricAggregator connectionMetricAggregator) {
ServerConnector connector = new JDiscServerConnector(
- connectorConfig, metric, server, connectionLogger, createConnectionFactories(metric).toArray(ConnectionFactory[]::new));
+ connectorConfig, metric, server, connectionLogger, connectionMetricAggregator,
+ createConnectionFactories(metric).toArray(ConnectionFactory[]::new));
connector.setPort(connectorConfig.listenPort());
connector.setName(connectorConfig.name());
connector.setAcceptQueueSize(connectorConfig.acceptQueueSize());
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java
index a355ca886c5..ae475ca4517 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java
@@ -31,7 +31,8 @@ class JDiscServerConnector extends ServerConnector {
private final String connectorName;
private final int listenPort;
- JDiscServerConnector(ConnectorConfig config, Metric metric, Server server, JettyConnectionLogger connectionLogger, ConnectionFactory... factories) {
+ JDiscServerConnector(ConnectorConfig config, Metric metric, Server server, JettyConnectionLogger connectionLogger,
+ ConnectionMetricAggregator connectionMetricAggregator, ConnectionFactory... factories) {
super(server, factories);
this.config = config;
this.tcpKeepAlive = config.tcpKeepAliveEnabled();
@@ -48,6 +49,7 @@ class JDiscServerConnector extends ServerConnector {
new ConnectionThrottler(this, throttlingConfig).registerWithConnector();
}
addBean(connectionLogger);
+ addBean(connectionMetricAggregator);
}
@Override
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
index cf9945cc65b..70f173b74e5 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
@@ -83,10 +83,11 @@ public class JettyHttpServer extends AbstractServerProvider {
setupJmx(server, serverConfig);
configureJettyThreadpool(server, serverConfig);
JettyConnectionLogger connectionLogger = new JettyConnectionLogger(serverConfig.connectionLog(), connectionLog);
+ ConnectionMetricAggregator connectionMetricAggregator = new ConnectionMetricAggregator(serverConfig, metric);
for (ConnectorFactory connectorFactory : connectorFactories.allComponents()) {
ConnectorConfig connectorConfig = connectorFactory.getConnectorConfig();
- server.addConnector(connectorFactory.createConnector(metric, server, connectionLogger));
+ server.addConnector(connectorFactory.createConnector(metric, server, connectionLogger, connectionMetricAggregator));
listenedPorts.add(connectorConfig.listenPort());
}
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricDefinitions.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricDefinitions.java
index b0b7ae14739..172e6483de2 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricDefinitions.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricDefinitions.java
@@ -24,6 +24,7 @@ class MetricDefinitions {
static final String CONNECTION_DURATION_MEAN = "serverConnectionDurationMean";
static final String CONNECTION_DURATION_STD_DEV = "serverConnectionDurationStdDev";
static final String NUM_PREMATURELY_CLOSED_CONNECTIONS = "jdisc.http.request.prematurely_closed";
+ static final String REQUESTS_PER_CONNECTION = "jdisc.http.request.requests_per_connection";
static final String NUM_BYTES_RECEIVED = "serverBytesReceived";
static final String NUM_BYTES_SENT = "serverBytesSent";
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestUtils.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestUtils.java
index 5fca7a8d778..b248f55a3df 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestUtils.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestUtils.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.jdisc.http.server.jetty;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnection;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.server.HttpConnection;
import org.eclipse.jetty.server.Request;
@@ -28,6 +29,10 @@ public class RequestUtils {
return (JDiscServerConnector) request.getHttpChannel().getConnector();
}
+ static boolean isHttpServerConnection(Connection connection) {
+ return connection instanceof HttpConnection || connection instanceof HTTP2ServerConnection;
+ }
+
/**
* Note: {@link HttpServletRequest#getLocalPort()} may return the local port of the load balancer / reverse proxy if proxy-protocol is enabled.
* @return the actual local port of the underlying Jetty connector