diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-10-27 15:44:13 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-10-27 15:44:13 +0100 |
commit | aee7f79dc8eae7e3e9bd4b75b39cbd04e0d794a1 (patch) | |
tree | 305c6f7db5013c4d19c03c7ad0a84d877352eed4 /docker-api/src/main/java/com/yahoo | |
parent | 528ee45baf83349d2bb11112273f04e4de8c7274 (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.java | 25 |
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 |