aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestMetricReporter.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestMetricReporter.java')
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestMetricReporter.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestMetricReporter.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestMetricReporter.java
new file mode 100644
index 00000000000..7596be0415a
--- /dev/null
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/RequestMetricReporter.java
@@ -0,0 +1,85 @@
+// 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 com.yahoo.jdisc.Metric;
+import com.yahoo.jdisc.Metric.Context;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+/**
+ * Responsible for metric reporting for JDisc http request handler support.
+ * @author Tony Vaagenes
+ */
+class RequestMetricReporter {
+ private final Metric metric;
+ private final Context context;
+
+ private final long requestStartTime;
+
+ //TODO: rename
+ private final AtomicBoolean firstSetOfTimeToFirstByte = new AtomicBoolean(true);
+
+
+ RequestMetricReporter(Metric metric, Context context, long requestStartTime) {
+ this.metric = metric;
+ this.context = context;
+ this.requestStartTime = requestStartTime;
+ }
+
+ void successfulWrite(int numBytes) {
+ setTimeToFirstByteFirstTime();
+
+ metric.add(MetricDefinitions.NUM_SUCCESSFUL_WRITES, 1, context);
+ metric.set(MetricDefinitions.NUM_BYTES_SENT, numBytes, context);
+ }
+
+ private void setTimeToFirstByteFirstTime() {
+ boolean isFirstWrite = firstSetOfTimeToFirstByte.getAndSet(false);
+ if (isFirstWrite) {
+ long timeToFirstByte = getRequestLatency();
+ metric.set(MetricDefinitions.TIME_TO_FIRST_BYTE, timeToFirstByte, context);
+ }
+ }
+
+ void failedWrite() {
+ metric.add(MetricDefinitions.NUM_FAILED_WRITES, 1, context);
+ }
+
+ void successfulResponse() {
+ setTimeToFirstByteFirstTime();
+
+ long requestLatency = getRequestLatency();
+
+ metric.set(MetricDefinitions.TOTAL_SUCCESSFUL_LATENCY, requestLatency, context);
+
+ metric.add(MetricDefinitions.NUM_SUCCESSFUL_RESPONSES, 1, context);
+ }
+
+ void failedResponse() {
+ setTimeToFirstByteFirstTime();
+
+ metric.set(MetricDefinitions.TOTAL_FAILED_LATENCY, getRequestLatency(), context);
+ metric.add(MetricDefinitions.NUM_FAILED_RESPONSES, 1, context);
+ }
+
+ void prematurelyClosed() {
+ metric.add(MetricDefinitions.NUM_PREMATURELY_CLOSED_CONNECTIONS, 1, context);
+ }
+
+ void successfulRead(int bytes_received) {
+ metric.set(MetricDefinitions.NUM_BYTES_RECEIVED, bytes_received, context);
+ }
+
+ private long getRequestLatency() {
+ return System.currentTimeMillis() - requestStartTime;
+ }
+
+ void uriLength(int length) {
+ metric.set(MetricDefinitions.URI_LENGTH, length, context);
+ }
+
+ void contentSize(int size) {
+ metric.set(MetricDefinitions.CONTENT_SIZE, size, context);
+ }
+}