summaryrefslogtreecommitdiffstats
path: root/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java86
1 files changed, 25 insertions, 61 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
index 67fb224f1ea..72936f8a679 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
@@ -2,23 +2,15 @@
package com.yahoo.vespa.hosted.controller.maintenance;
import com.yahoo.config.provision.HostName;
-import com.yahoo.slime.Cursor;
-import com.yahoo.slime.Slime;
-import com.yahoo.vespa.config.SlimeUtils;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.ApplicationController;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.api.integration.MetricsService;
import com.yahoo.vespa.hosted.controller.application.Deployment;
+import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
import com.yahoo.vespa.hosted.controller.application.RotationStatus;
-import com.yahoo.vespa.hosted.controller.authority.config.ApiAuthorityConfig;
import com.yahoo.yolean.Exceptions;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import java.io.IOException;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
@@ -45,12 +37,10 @@ public class DeploymentMetricsMaintainer extends Maintainer {
private static final int applicationsToUpdateInParallel = 10;
private final ApplicationController applications;
- private final List<String> baseUris;
- public DeploymentMetricsMaintainer(Controller controller, Duration duration, JobControl jobControl, ApiAuthorityConfig apiAuthorityConfig) {
+ public DeploymentMetricsMaintainer(Controller controller, Duration duration, JobControl jobControl) {
super(controller, duration, jobControl);
this.applications = controller.applications();
- baseUris = apiAuthorityConfig.authorities();
}
@Override
@@ -61,27 +51,37 @@ public class DeploymentMetricsMaintainer extends Maintainer {
// Run parallel stream inside a custom ForkJoinPool so that we can control the number of threads used
ForkJoinPool pool = new ForkJoinPool(applicationsToUpdateInParallel);
- Slime slime = new Slime();
- Cursor cursor = slime.setArray();
pool.submit(() -> {
applicationList.parallelStream().forEach(application -> {
- Cursor applicationCursor = cursor.addObject();
- applicationCursor.setString("applicationId", application.id().serializedForm());
- Cursor applicationMetrics = applicationCursor.setObject("applicationMetrics");
- fillApplicationMetrics(applicationMetrics, application);
- Cursor rotationStatus = applicationCursor.setArray("rotationStatus");
- fillRotationStatus(rotationStatus, application);
- Cursor deploymentArray = applicationCursor.setArray("deploymentMetrics");
- for (Deployment deployment : application.deployments().values()) {
- Cursor deploymentEntry = deploymentArray.addObject();
- fillDeploymentMetrics(deploymentEntry, application, deployment);
+ try {
+ applications.lockIfPresent(application.id(), locked ->
+ applications.store(locked.with(controller().metricsService().getApplicationMetrics(application.id()))));
+
+ applications.lockIfPresent(application.id(), locked ->
+ applications.store(locked.withRotationStatus(rotationStatus(application))));
+
+ for (Deployment deployment : application.deployments().values()) {
+ MetricsService.DeploymentMetrics deploymentMetrics = controller().metricsService()
+ .getDeploymentMetrics(application.id(), deployment.zone());
+ DeploymentMetrics newMetrics = new DeploymentMetrics(deploymentMetrics.queriesPerSecond(),
+ deploymentMetrics.writesPerSecond(),
+ deploymentMetrics.documentCount(),
+ deploymentMetrics.queryLatencyMillis(),
+ deploymentMetrics.writeLatencyMillis());
+
+ applications.lockIfPresent(application.id(), locked ->
+ applications.store(locked.with(deployment.zone(), newMetrics)
+ .recordActivityAt(controller().clock().instant(), deployment.zone())));
+ }
+ } catch (Exception e) {
+ failures.incrementAndGet();
+ lastException.set(e);
}
});
});
pool.shutdown();
try {
pool.awaitTermination(30, TimeUnit.MINUTES);
- feedMetrics(slime);
if (lastException.get() != null) {
log.log(Level.WARNING, String.format("Failed to query metrics service for %d/%d applications. Last error: %s. Retrying in %s",
failures.get(),
@@ -91,8 +91,6 @@ public class DeploymentMetricsMaintainer extends Maintainer {
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
- } catch (IOException e) {
- log.log(Level.WARNING, "Unable to feed metrics to API", e);
}
}
@@ -108,40 +106,6 @@ public class DeploymentMetricsMaintainer extends Maintainer {
.orElseGet(Collections::emptyMap);
}
- private void fillApplicationMetrics(Cursor applicationCursor, Application application) {
- MetricsService.ApplicationMetrics metrics = controller().metricsService().getApplicationMetrics(application.id());
- applicationCursor.setDouble("queryServiceQuality", metrics.queryServiceQuality());
- applicationCursor.setDouble("writeServiceQuality", metrics.writeServiceQuality());
- }
-
- private void fillRotationStatus(Cursor rotationStatusCursor, Application application) {
- Map<HostName, RotationStatus> rotationStatus = rotationStatus(application);
- for (Map.Entry<HostName, RotationStatus> entry : rotationStatus.entrySet()) {
- Cursor rotationStatusEntry = rotationStatusCursor.addObject();
- rotationStatusEntry.setString("hostname", entry.getKey().value());
- rotationStatusEntry.setString("rotationStatus", entry.getValue().toString());
- }
- }
-
- private void fillDeploymentMetrics(Cursor deploymentCursor, Application application, Deployment deployment) {
- MetricsService.DeploymentMetrics deploymentMetrics = controller().metricsService()
- .getDeploymentMetrics(application.id(), deployment.zone());
- deploymentCursor.setString("zoneId", deployment.zone().value());
- deploymentCursor.setDouble("queriesPerSecond", deploymentMetrics.queriesPerSecond());
- deploymentCursor.setDouble("writesPerSecond", deploymentMetrics.writesPerSecond());
- deploymentCursor.setDouble("documentCount", deploymentMetrics.documentCount());
- deploymentCursor.setDouble("queryLatencyMillis", deploymentMetrics.queryLatencyMillis());
- deploymentCursor.setDouble("writeLatencyMillis", deploymentMetrics.writeLatencyMillis());
- }
-
- private void feedMetrics(Slime slime) throws IOException {
- String uri = baseUris.get(0) + "/metricforwarding/v1/deploymentmetrics/"; // For now, we only feed to one controller
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- HttpPost httpPost = new HttpPost(uri);
- httpPost.setEntity(new ByteArrayEntity(SlimeUtils.toJsonBytes(slime)));
- httpClient.execute(httpPost);
- }
-
private static RotationStatus from(com.yahoo.vespa.hosted.controller.api.integration.routing.RotationStatus status) {
switch (status) {
case IN: return RotationStatus.in;