From 447fd31decbd87a5ca076ffa19c59c0d492622cc Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Sat, 18 Dec 2021 00:50:33 +0100 Subject: Use the Instant as a timestamp to make it clear what it is instead of just a generic long. Make sure to use it correctly for the system metrics. --- .../java/ai/vespa/metricsproxy/core/VespaMetrics.java | 5 +++-- .../main/java/ai/vespa/metricsproxy/metric/Metric.java | 15 ++++++++++----- .../java/ai/vespa/metricsproxy/metric/Metrics.java | 11 ++++++----- .../ai/vespa/metricsproxy/service/MetricsParser.java | 18 ++++++++---------- .../ai/vespa/metricsproxy/service/SystemPoller.java | 4 ++-- .../vespa/metricsproxy/service/MetricsFetcherTest.java | 3 ++- .../vespa/metricsproxy/service/SystemPollerTest.java | 3 ++- 7 files changed, 33 insertions(+), 26 deletions(-) (limited to 'metrics-proxy') diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java index 282068dc02f..ebb5d2fe8fb 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/VespaMetrics.java @@ -15,6 +15,7 @@ import ai.vespa.metricsproxy.metric.model.MetricsPacket; import ai.vespa.metricsproxy.service.MetricsParser; import ai.vespa.metricsproxy.service.VespaService; +import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -227,8 +228,8 @@ public class VespaMetrics { return definitions == null ? Collections.emptyList() : definitions; } - private static void setMetaInfo(MetricsPacket.Builder builder, long timestamp) { - builder.timestamp(timestamp) + private static void setMetaInfo(MetricsPacket.Builder builder, Instant timestamp) { + builder.timestamp(timestamp.getEpochSecond()) .statusCode(0) .statusMessage("Data collected successfully"); } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java index 9265e8ef1e5..d12685be97d 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metric.java @@ -5,6 +5,7 @@ import ai.vespa.metricsproxy.metric.model.ConsumerId; import ai.vespa.metricsproxy.metric.model.DimensionId; import ai.vespa.metricsproxy.metric.model.MetricId; +import java.time.Instant; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -14,7 +15,7 @@ import java.util.Set; */ public class Metric { - private final long time; + private final Instant time; private final Number value; private final String description; private MetricId name; @@ -28,7 +29,7 @@ public class Metric { * @param value The numeric value * @param time The timestamp of this metric in seconds */ - public Metric(MetricId name, Number value, long time, Map dimensions, String description) { + public Metric(MetricId name, Number value, Instant time, Map dimensions, String description) { this.time = time; this.value = value; this.name = name; @@ -37,11 +38,15 @@ public class Metric { } public Metric(MetricId name, Number value, long timestamp) { + this(name, value, Instant.ofEpochSecond(timestamp), Map.of(), ""); + } + + public Metric(MetricId name, Number value, Instant timestamp) { this(name, value, timestamp, Map.of(), ""); } public Metric(MetricId name, Number value) { - this(name, value, System.currentTimeMillis() / 1000); + this(name, value, Instant.now()); } public void setDimensions(Map dimensions) { @@ -86,7 +91,7 @@ public class Metric { /** * @return The UTC timestamp for when this metric was collected */ - public long getTimeStamp() { + public Instant getTimeStamp() { return this.time; } @@ -112,7 +117,7 @@ public class Metric { return name.equals(rhs.name) && description.equals(rhs.description) && value.equals(rhs.value) - && (time == rhs.time) + && time.equals(rhs.time) && Objects.equals(dimensions, rhs.dimensions) && Objects.equals(consumers, rhs.consumers); } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java index 8450d9f6be7..ebc206c9245 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/Metrics.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.metricsproxy.metric; +import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -13,14 +14,14 @@ import java.util.List; public class Metrics { private final List metrics = new ArrayList<>(); - private long timestamp; + private Instant timestamp; private boolean isFrozen = false; public Metrics() { - this(System.currentTimeMillis() / 1000L); + this(Instant.now()); } - public Metrics(long timestamp) { + public Metrics(Instant timestamp) { this.timestamp = timestamp; } @@ -28,7 +29,7 @@ public class Metrics { if (isFrozen) throw new IllegalStateException("Frozen Metrics cannot be modified!"); } - public long getTimeStamp() { + public Instant getTimeStamp() { return this.timestamp; } @@ -37,7 +38,7 @@ public class Metrics { * * @param timestamp IN UTC seconds resolution */ - public void setTimeStamp(long timestamp) { + public void setTimeStamp(Instant timestamp) { ensureNotFrozen(); this.timestamp = timestamp; } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java index 701af8730d7..9a601a67eb5 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.InputStream; +import java.time.Instant; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -56,21 +57,18 @@ public class MetricsParser { } } } - private static long secondsSince1970UTC() { - return System.currentTimeMillis() / 1000L; - } - static private long parseSnapshot(JsonParser parser) throws IOException { + static private Instant parseSnapshot(JsonParser parser) throws IOException { if (parser.getCurrentToken() != JsonToken.START_OBJECT) { throw new IOException("Expected start of 'snapshot' object, got " + parser.currentToken()); } - long timestamp = secondsSince1970UTC(); + Instant timestamp = Instant.now(); for (parser.nextToken(); parser.getCurrentToken() != JsonToken.END_OBJECT; parser.nextToken()) { String fieldName = parser.getCurrentName(); JsonToken token = parser.nextToken(); if (fieldName.equals("to")) { - timestamp = parser.getLongValue(); + timestamp = Instant.ofEpochSecond(parser.getLongValue()); long now = System.currentTimeMillis() / 1000; - timestamp = Metric.adjustTime(timestamp, now); + timestamp = Instant.ofEpochSecond(Metric.adjustTime(timestamp.getEpochSecond(), Instant.now().getEpochSecond())); } else { if (token == JsonToken.START_OBJECT || token == JsonToken.START_ARRAY) { parser.skipChildren(); @@ -80,7 +78,7 @@ public class MetricsParser { return timestamp; } - static private void parseValues(JsonParser parser, long timestamp, Consumer consumer) throws IOException { + static private void parseValues(JsonParser parser, Instant timestamp, Consumer consumer) throws IOException { if (parser.getCurrentToken() != JsonToken.START_ARRAY) { throw new IOException("Expected start of 'metrics:values' array, got " + parser.currentToken()); } @@ -100,7 +98,7 @@ public class MetricsParser { if (parser.getCurrentToken() != JsonToken.START_OBJECT) { throw new IOException("Expected start of 'metrics' object, got " + parser.currentToken()); } - long timestamp = System.currentTimeMillis() / 1000L; + Instant timestamp = Instant.now(); for (parser.nextToken(); parser.getCurrentToken() != JsonToken.END_OBJECT; parser.nextToken()) { String fieldName = parser.getCurrentName(); JsonToken token = parser.nextToken(); @@ -116,7 +114,7 @@ public class MetricsParser { } } - static private void handleValue(JsonNode metric, long timestamp, Consumer consumer, + static private void handleValue(JsonNode metric, Instant timestamp, Consumer consumer, Map> uniqueDimensions) { String name = metric.get("name").textValue(); String description = ""; diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java index 22eb2844d61..d159fdd3dab 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/SystemPoller.java @@ -161,7 +161,7 @@ public class SystemPoller { log.log(Level.FINE, () -> "Monitoring system metrics for " + services.size() + " services"); boolean someAlive = services.stream().anyMatch(VespaService::isAlive); - lastTotalCpuJiffies = updateMetrics(lastTotalCpuJiffies, interval.getSeconds(), jiffiesInterface, services, lastCpuJiffiesMetrics); + lastTotalCpuJiffies = updateMetrics(lastTotalCpuJiffies, startTime, jiffiesInterface, services, lastCpuJiffiesMetrics); // If none of the services were alive, reschedule in a short time if (!someAlive) { @@ -171,7 +171,7 @@ public class SystemPoller { } } - static JiffiesAndCpus updateMetrics(JiffiesAndCpus prevTotalJiffies, long timeStamp, GetJiffies getJiffies, + static JiffiesAndCpus updateMetrics(JiffiesAndCpus prevTotalJiffies, Instant timeStamp, GetJiffies getJiffies, List services, Map lastCpuJiffiesMetrics) { Map currentServiceJiffies = new HashMap<>(); for (VespaService s : services) { diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java index b30e871a543..b20126ea23f 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/MetricsFetcherTest.java @@ -7,6 +7,7 @@ import ai.vespa.metricsproxy.metric.Metrics; import org.junit.Test; import java.io.IOException; +import java.time.Instant; import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static org.junit.Assert.assertEquals; @@ -41,7 +42,7 @@ public class MetricsFetcherTest { assertEquals(10, metrics.size()); assertEquals(28, getMetric("query_hits.count", metrics).getValue()); assertEquals(0.4667, getMetric("queries.rate", metrics).getValue()); - assertEquals(1334134700L, metrics.getTimeStamp()); + assertEquals(Instant.ofEpochSecond(1334134700L), metrics.getTimeStamp()); } @Test diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/SystemPollerTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/SystemPollerTest.java index 76909e050d5..30145746e79 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/SystemPollerTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/service/SystemPollerTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -188,7 +189,7 @@ public class SystemPollerTest { List services = List.of(s1); lastCpuJiffiesMetrics.put(s1, SystemPoller.getPidJiffies(new BufferedReader(new StringReader(perProcStats[0])))); - SystemPoller.JiffiesAndCpus next = SystemPoller.updateMetrics(prev, 1, + SystemPoller.JiffiesAndCpus next = SystemPoller.updateMetrics(prev, Instant.ofEpochSecond(1), new SystemPoller.GetJiffies() { @Override public SystemPoller.JiffiesAndCpus getTotalSystemJiffies() { -- cgit v1.2.3