aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOla Aunrønning <olaa@verizonmedia.com>2021-10-26 11:51:47 +0200
committerOla Aunrønning <olaa@verizonmedia.com>2021-10-26 11:51:47 +0200
commitcbf2839ca0ff6fad74a80ccfe4a646601559690d (patch)
tree3d2ebc06877c2a008dde1a9082e0b906b551d659
parent37d050d026ae1cdbcb1ba2dd4848107fa8d6fd61 (diff)
Add cost metrics
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java26
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java6
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