diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-05-12 14:28:26 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-05-12 14:28:26 +0200 |
commit | ed3560b3c448a1d6911a66f9f8703ff83823c91a (patch) | |
tree | c439766e1893dd2be3d57978ca5f51e38b1440d0 /container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectionMetricAggregator.java | |
parent | 18afc9cf39d86308f03330243d2f3d90f5d4fffe (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.java | 65 |
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; + } + } +} |