summaryrefslogtreecommitdiffstats
path: root/jdisc_http_service
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2020-10-08 15:38:34 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2020-10-08 15:44:19 +0200
commitcd19e1aea7b0475211b5d9f67f533719ccb693fc (patch)
tree734cc884fb24834a8a2cec41618bdee4d40c67d6 /jdisc_http_service
parentc209b1b2e2ef3ddad06a9db9b4a02df27ace4d86 (diff)
Move server metric reporting to separate class
Diffstat (limited to 'jdisc_http_service')
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java73
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServerMetricReporter.java101
2 files changed, 107 insertions, 67 deletions
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
index 7fa645debe7..b8d9d7572ac 100644
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java
@@ -14,7 +14,6 @@ import com.yahoo.jdisc.http.server.FilterBindings;
import com.yahoo.jdisc.service.AbstractServerProvider;
import com.yahoo.jdisc.service.CurrentContainer;
import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.io.ConnectionStatistics;
import org.eclipse.jetty.jmx.ConnectorServer;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Connector;
@@ -22,7 +21,6 @@ import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.server.handler.AbstractHandlerContainer;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.StatisticsHandler;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
@@ -43,13 +41,9 @@ import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -63,12 +57,12 @@ import static java.util.stream.Collectors.toList;
public class JettyHttpServer extends AbstractServerProvider {
private final static Logger log = Logger.getLogger(JettyHttpServer.class.getName());
- private final long timeStarted = System.currentTimeMillis();
+
private final ExecutorService janitor;
- private final ScheduledExecutorService metricReporterExecutor;
- private final Metric metric;
+
private final Server server;
private final List<Integer> listenedPorts = new ArrayList<>();
+ private final ServerMetricReporter metricsReporter;
@Inject
public JettyHttpServer(CurrentContainer container,
@@ -83,7 +77,6 @@ public class JettyHttpServer extends AbstractServerProvider {
super(container);
if (connectorFactories.allComponents().isEmpty())
throw new IllegalArgumentException("No connectors configured.");
- this.metric = metric;
initializeJettyLogging();
@@ -121,12 +114,7 @@ public class JettyHttpServer extends AbstractServerProvider {
jdiscServlet,
servletHolders,
jDiscFilterInvokerFilter));
-
- int numMetricReporterThreads = 1;
- metricReporterExecutor =
- Executors.newScheduledThreadPool(numMetricReporterThreads,
- new DaemonThreadFactory(JettyHttpServer.class.getName() + "-MetricReporter-"));
- metricReporterExecutor.scheduleAtFixedRate(new MetricTask(), 0, 2, TimeUnit.SECONDS);
+ this.metricsReporter = new ServerMetricReporter(metric, server);
}
private static void initializeJettyLogging() {
@@ -224,6 +212,7 @@ public class JettyHttpServer extends AbstractServerProvider {
public void start() {
try {
server.start();
+ metricsReporter.start();
logEffectiveSslConfiguration();
} catch (final Exception e) {
if (e instanceof IOException && e.getCause() instanceof BindException) {
@@ -259,7 +248,7 @@ public class JettyHttpServer extends AbstractServerProvider {
log.log(Level.SEVERE, "Server shutdown threw an unexpected exception.", e);
}
- metricReporterExecutor.shutdown();
+ metricsReporter.shutdown();
janitor.shutdown();
}
@@ -273,56 +262,6 @@ public class JettyHttpServer extends AbstractServerProvider {
Server server() { return server; }
- private class MetricTask implements Runnable {
- @Override
- public void run() {
- HttpResponseStatisticsCollector statisticsCollector = ((AbstractHandlerContainer) server.getHandler())
- .getChildHandlerByClass(HttpResponseStatisticsCollector.class);
- if (statisticsCollector != null) {
- setServerMetrics(statisticsCollector);
- }
-
- // reset statisticsHandler to preserve earlier behavior
- StatisticsHandler statisticsHandler = ((AbstractHandlerContainer) server.getHandler())
- .getChildHandlerByClass(StatisticsHandler.class);
- if (statisticsHandler != null) {
- statisticsHandler.statsReset();
- }
-
- for (Connector connector : server.getConnectors()) {
- setConnectorMetrics((JDiscServerConnector)connector);
- }
- }
-
- }
-
- private void setServerMetrics(HttpResponseStatisticsCollector statisticsCollector) {
- long timeSinceStarted = System.currentTimeMillis() - timeStarted;
- metric.set(MetricDefinitions.STARTED_MILLIS, timeSinceStarted, null);
-
- addResponseMetrics(statisticsCollector);
- }
-
- private void addResponseMetrics(HttpResponseStatisticsCollector statisticsCollector) {
- for (var metricEntry : statisticsCollector.takeStatistics()) {
- Map<String, Object> dimensions = new HashMap<>();
- dimensions.put(MetricDefinitions.METHOD_DIMENSION, metricEntry.method);
- dimensions.put(MetricDefinitions.SCHEME_DIMENSION, metricEntry.scheme);
- dimensions.put(MetricDefinitions.REQUEST_TYPE_DIMENSION, metricEntry.requestType);
- metric.add(metricEntry.name, metricEntry.value, metric.createContext(dimensions));
- }
- }
-
- private void setConnectorMetrics(JDiscServerConnector connector) {
- ConnectionStatistics statistics = connector.getStatistics();
- metric.set(MetricDefinitions.NUM_CONNECTIONS, statistics.getConnectionsTotal(), connector.getConnectorMetricContext());
- metric.set(MetricDefinitions.NUM_OPEN_CONNECTIONS, statistics.getConnections(), connector.getConnectorMetricContext());
- metric.set(MetricDefinitions.NUM_CONNECTIONS_OPEN_MAX, statistics.getConnectionsMax(), connector.getConnectorMetricContext());
- metric.set(MetricDefinitions.CONNECTION_DURATION_MAX, statistics.getConnectionDurationMax(), connector.getConnectorMetricContext());
- metric.set(MetricDefinitions.CONNECTION_DURATION_MEAN, statistics.getConnectionDurationMean(), connector.getConnectorMetricContext());
- metric.set(MetricDefinitions.CONNECTION_DURATION_STD_DEV, statistics.getConnectionDurationStdDev(), connector.getConnectorMetricContext());
- }
-
private StatisticsHandler newStatisticsHandler() {
StatisticsHandler statisticsHandler = new StatisticsHandler();
statisticsHandler.statsReset();
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServerMetricReporter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServerMetricReporter.java
new file mode 100644
index 00000000000..d505244f416
--- /dev/null
+++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/ServerMetricReporter.java
@@ -0,0 +1,101 @@
+// 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.concurrent.DaemonThreadFactory;
+import com.yahoo.jdisc.Metric;
+import org.eclipse.jetty.io.ConnectionStatistics;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AbstractHandlerContainer;
+import org.eclipse.jetty.server.handler.StatisticsHandler;
+
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Reports server/connector specific metrics for Jdisc and Jetty
+ *
+ * @author bjorncs
+ */
+class ServerMetricReporter {
+
+ private final ScheduledExecutorService executor =
+ Executors.newScheduledThreadPool(1, new DaemonThreadFactory("jdisc-jetty-metric-reporter-"));
+ private final Metric metric;
+ private final Server jetty;
+
+ ServerMetricReporter(Metric metric, Server jetty) {
+ this.metric = metric;
+ this.jetty = jetty;
+ }
+
+ void start() {
+ executor.scheduleAtFixedRate(new ReporterTask(), 0, 2, TimeUnit.SECONDS);
+ }
+
+ void shutdown() {
+ try {
+ executor.shutdownNow();
+ executor.awaitTermination(10, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private class ReporterTask implements Runnable {
+
+ private final Instant timeStarted = Instant.now();
+
+ @Override
+ public void run() {
+ HttpResponseStatisticsCollector statisticsCollector = ((AbstractHandlerContainer) jetty.getHandler())
+ .getChildHandlerByClass(HttpResponseStatisticsCollector.class);
+ if (statisticsCollector != null) {
+ setServerMetrics(statisticsCollector);
+ }
+
+ // reset statisticsHandler to preserve earlier behavior
+ StatisticsHandler statisticsHandler = ((AbstractHandlerContainer) jetty.getHandler())
+ .getChildHandlerByClass(StatisticsHandler.class);
+ if (statisticsHandler != null) {
+ statisticsHandler.statsReset();
+ }
+
+ for (Connector connector : jetty.getConnectors()) {
+ setConnectorMetrics((JDiscServerConnector)connector);
+ }
+ }
+
+ private void setServerMetrics(HttpResponseStatisticsCollector statisticsCollector) {
+ long timeSinceStarted = System.currentTimeMillis() - timeStarted.toEpochMilli();
+ metric.set(MetricDefinitions.STARTED_MILLIS, timeSinceStarted, null);
+
+ addResponseMetrics(statisticsCollector);
+ }
+
+ private void addResponseMetrics(HttpResponseStatisticsCollector statisticsCollector) {
+ for (var metricEntry : statisticsCollector.takeStatistics()) {
+ Map<String, Object> dimensions = new HashMap<>();
+ dimensions.put(MetricDefinitions.METHOD_DIMENSION, metricEntry.method);
+ dimensions.put(MetricDefinitions.SCHEME_DIMENSION, metricEntry.scheme);
+ dimensions.put(MetricDefinitions.REQUEST_TYPE_DIMENSION, metricEntry.requestType);
+ metric.add(metricEntry.name, metricEntry.value, metric.createContext(dimensions));
+ }
+ }
+
+ private void setConnectorMetrics(JDiscServerConnector connector) {
+ ConnectionStatistics statistics = connector.getStatistics();
+ metric.set(MetricDefinitions.NUM_CONNECTIONS, statistics.getConnectionsTotal(), connector.getConnectorMetricContext());
+ metric.set(MetricDefinitions.NUM_OPEN_CONNECTIONS, statistics.getConnections(), connector.getConnectorMetricContext());
+ metric.set(MetricDefinitions.NUM_CONNECTIONS_OPEN_MAX, statistics.getConnectionsMax(), connector.getConnectorMetricContext());
+ metric.set(MetricDefinitions.CONNECTION_DURATION_MAX, statistics.getConnectionDurationMax(), connector.getConnectorMetricContext());
+ metric.set(MetricDefinitions.CONNECTION_DURATION_MEAN, statistics.getConnectionDurationMean(), connector.getConnectorMetricContext());
+ metric.set(MetricDefinitions.CONNECTION_DURATION_STD_DEV, statistics.getConnectionDurationStdDev(), connector.getConnectorMetricContext());
+ }
+
+ }
+}