diff options
author | Ola Aunrønning <olaa@verizonmedia.com> | 2021-10-26 11:51:47 +0200 |
---|---|---|
committer | Ola Aunrønning <olaa@verizonmedia.com> | 2021-10-26 11:51:47 +0200 |
commit | cbf2839ca0ff6fad74a80ccfe4a646601559690d (patch) | |
tree | 3d2ebc06877c2a008dde1a9082e0b906b551d659 | |
parent | 37d050d026ae1cdbcb1ba2dd4848107fa8d6fd61 (diff) |
Add cost metrics
2 files changed, 25 insertions, 7 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java index 1ddb50b0a6b..f62aab95c02 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.google.common.util.concurrent.UncheckedTimeoutException; +import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterResources; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.NodeResources; @@ -111,6 +112,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer { ResourceSnapshot::getZoneId, snapshot -> cost(snapshot.allocation(), systemName))); locked = locked.with(instanceName, i -> i.withDeploymentCosts(deploymentCosts)); + updateCostMetrics(tenantAndApplication.instance(instanceName), deploymentCosts); } applications.store(locked); }); @@ -122,7 +124,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer { private void reportResourceSnapshots(Collection<ResourceSnapshot> resourceSnapshots) { meteringClient.consume(resourceSnapshots); - updateMetrics(resourceSnapshots); + updateMeteringMetrics(resourceSnapshots); try (var lock = curator.lockMeteringRefreshTime()) { if (needsRefresh(curator.readMeteringRefreshTime())) { @@ -190,7 +192,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer { return Math.round(cost * 100.0 / costDivisor) / 100.0; } - private void updateMetrics(Collection<ResourceSnapshot> resourceSnapshots) { + private void updateMeteringMetrics(Collection<ResourceSnapshot> resourceSnapshots) { metric.set(METERING_LAST_REPORTED, clock.millis() / 1000, metric.createContext(Collections.emptyMap())); // total metered resource usage, for alerting on drastic changes metric.set(METERING_TOTAL_REPORTED, @@ -199,15 +201,25 @@ public class ResourceMeterMaintainer extends ControllerMaintainer { metric.createContext(Collections.emptyMap())); resourceSnapshots.forEach(snapshot -> { - var context = metric.createContext(Map.of( - "tenant", snapshot.getApplicationId().tenant().value(), - "applicationId", snapshot.getApplicationId().toFullString(), - "zoneId", snapshot.getZoneId() - )); + var context = getMetricContext(snapshot.getApplicationId(), snapshot.getZoneId()); metric.set("metering.vcpu", snapshot.getCpuCores(), context); metric.set("metering.memoryGB", snapshot.getMemoryGb(), context); metric.set("metering.diskGB", snapshot.getDiskGb(), context); }); } + private void updateCostMetrics(ApplicationId applicationId, Map<ZoneId, Double> deploymentCost) { + deploymentCost.forEach((zoneId, cost) -> { + var context = getMetricContext(applicationId, zoneId); + metric.set("metering.cost.hourly", cost, context); + }); + } + + private Metric.Context getMetricContext(ApplicationId applicationId, ZoneId zoneId) { + return metric.createContext(Map.of( + "tenant", applicationId.tenant().value(), + "applicationId", applicationId.toFullString(), + "zoneId", zoneId.value() + )); + } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java index 5b923c2ee59..79fc83e7e71 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java @@ -73,6 +73,12 @@ public class ResourceMeterMaintainerTest { maintainer.updateDeploymentCost(resourceSnapshots); assertCost.accept(app1, Map.of(z2, 2.50)); assertCost.accept(app2, Map.of(z1, 3.59, z2, 4.68)); + assertEquals(1.4, + (Double) metrics.getMetric(context -> + z1.value().equals(context.get("zoneId")) && + app1.tenant().value().equals(context.get("tenant")), + "metering.cost.hourly").get(), + Double.MIN_VALUE); } @Test |