summaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java
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/jdisc/http/server/jetty/ConnectionMetricAggregator.java
parent18afc9cf39d86308f03330243d2f3d90f5d4fffe (diff)
Add metric for requests per connection
Diffstat (limited to 'container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java')
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java65
1 files changed, 65 insertions, 0 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;
+ }
+ }
+}