diff options
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.java | 86 |
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; |