summaryrefslogtreecommitdiffstats
path: root/docker-api/src/main/java/com/yahoo
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-10-27 15:44:13 +0100
committerMartin Polden <mpolden@mpolden.no>2020-10-27 15:44:13 +0100
commitaee7f79dc8eae7e3e9bd4b75b39cbd04e0d794a1 (patch)
tree305c6f7db5013c4d19c03c7ad0a84d877352eed4 /docker-api/src/main/java/com/yahoo
parent528ee45baf83349d2bb11112273f04e4de8c7274 (diff)
Report image pull duration metric
Diffstat (limited to 'docker-api/src/main/java/com/yahoo')
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerEngine.java25
1 files changed, 22 insertions, 3 deletions
diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerEngine.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerEngine.java
index 7d63c66131d..25b8a1c2747 100644
--- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerEngine.java
+++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerEngine.java
@@ -27,10 +27,14 @@ import com.yahoo.vespa.hosted.dockerapi.exception.ContainerNotFoundException;
import com.yahoo.vespa.hosted.dockerapi.exception.DockerException;
import com.yahoo.vespa.hosted.dockerapi.exception.DockerExecTimeoutException;
import com.yahoo.vespa.hosted.dockerapi.metrics.Counter;
+import com.yahoo.vespa.hosted.dockerapi.metrics.Dimensions;
+import com.yahoo.vespa.hosted.dockerapi.metrics.Gauge;
import com.yahoo.vespa.hosted.dockerapi.metrics.Metrics;
import java.io.ByteArrayOutputStream;
+import java.time.Clock;
import java.time.Duration;
+import java.time.Instant;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
@@ -58,16 +62,20 @@ public class DockerEngine implements ContainerEngine {
private final DockerClient dockerClient;
private final DockerImageGarbageCollector dockerImageGC;
+ private final Metrics metrics;
private final Counter numberOfDockerApiFails;
+ private final Clock clock;
@Inject
public DockerEngine(Metrics metrics) {
- this(createDockerClient(), metrics);
+ this(createDockerClient(), metrics, Clock.systemUTC());
}
- DockerEngine(DockerClient dockerClient, Metrics metrics) {
+ DockerEngine(DockerClient dockerClient, Metrics metrics, Clock clock) {
this.dockerClient = dockerClient;
this.dockerImageGC = new DockerImageGarbageCollector(this);
+ this.metrics = metrics;
+ this.clock = clock;
numberOfDockerApiFails = metrics.declareCounter("docker.api_fails");
}
@@ -347,10 +355,13 @@ public class DockerEngine implements ContainerEngine {
}
private class ImagePullCallback extends PullImageResultCallback {
+
private final DockerImage dockerImage;
+ private final Instant startedAt;
private ImagePullCallback(DockerImage dockerImage) {
this.dockerImage = dockerImage;
+ this.startedAt = clock.instant();
}
@Override
@@ -359,7 +370,6 @@ public class DockerEngine implements ContainerEngine {
logger.log(Level.SEVERE, "Could not download image " + dockerImage.asString(), throwable);
}
-
@Override
public void onComplete() {
if (imageIsDownloaded(dockerImage)) {
@@ -369,7 +379,16 @@ public class DockerEngine implements ContainerEngine {
numberOfDockerApiFails.increment();
throw new DockerClientException("Could not download image: " + dockerImage);
}
+ sampleDuration();
}
+
+ private void sampleDuration() {
+ Gauge gauge = metrics.declareGauge("docker.imagePullDurationSecs",
+ new Dimensions(Map.of("tag", dockerImage.tagAsVersion().toFullString())));
+ Duration pullDuration = Duration.between(startedAt, clock.instant());
+ gauge.sample(pullDuration.getSeconds());
+ }
+
}
// docker-java currently (3.0.8) does not support getting docker stats with stream=false, therefore we need