From ec4dee51a04fbf0fa637f2c98c96598cf513e726 Mon Sep 17 00:00:00 2001 From: andreer Date: Tue, 5 Nov 2019 15:32:40 +0100 Subject: add metrics for application allocations --- .../provision/maintenance/MetricsReporter.java | 23 ++++++++++++++++++++++ .../provision/maintenance/MetricsReporterTest.java | 21 ++++++++++++++++++++ 2 files changed, 44 insertions(+) (limited to 'node-repository') diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java index c2f815b9d5d..5c8aab4d0aa 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java @@ -63,6 +63,7 @@ public class MetricsReporter extends Maintainer { updateStateMetrics(nodes); updateMaintenanceMetrics(); updateDockerMetrics(nodes); + updateTenantUsageMetrics(nodes); } private void updateMaintenanceMetrics() { @@ -212,6 +213,28 @@ public class MetricsReporter extends Maintainer { metric.set("hostedVespa.docker.freeCapacityDisk", totalFreeCapacity.diskGb(), null); } + private void updateTenantUsageMetrics(NodeList nodes) { + nodes.nodeType(NodeType.tenant).stream() + .filter(node -> node.allocation().isPresent()) + .collect(Collectors.groupingBy(node -> node.allocation().get().owner())) + .forEach( + (applicationId, applicationNodes) -> { + var allocatedCapacity = applicationNodes.stream() + .map(node -> node.allocation().get().requestedResources().withDiskSpeed(any)) + .reduce(new NodeResources(0, 0, 0, 0, any), NodeResources::add); + + var context = getContextAt( + "tenantName", applicationId.tenant().value(), + "applicationId", applicationId.serializedForm().replace(':', '.'), + "app", toApp(applicationId)); + + metric.set("hostedVespa.docker.allocatedCapacityCpu", allocatedCapacity.vcpu(), context); + metric.set("hostedVespa.docker.allocatedCapacityMem", allocatedCapacity.memoryGb(), context); + metric.set("hostedVespa.docker.allocatedCapacityDisk", allocatedCapacity.diskGb(), context); + } + ); + } + private static NodeResources getCapacityTotal(NodeList nodes) { return nodes.nodeType(NodeType.host).asList().stream() .map(host -> host.flavor().resources()) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index ed6e6c6e9a7..539d8c7cff2 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -162,6 +162,16 @@ public class MetricsReporterTest { assertEquals(6.0, metric.values.get("hostedVespa.docker.freeCapacityDisk")); assertEquals(3.0, metric.values.get("hostedVespa.docker.freeCapacityMem")); assertEquals(4.0, metric.values.get("hostedVespa.docker.freeCapacityCpu")); + + Metric.Context app1context = metric.createContext(Map.of("app", "test.default", "tenantName", "app1", "applicationId", "app1.test.default")); + assertEquals(2.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityDisk", app1context), 0.01d); + assertEquals(3.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityMem", app1context), 0.01d); + assertEquals(1.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityCpu", app1context), 0.01d); + + Metric.Context app2context = metric.createContext(Map.of("app", "test.default", "tenantName", "app2", "applicationId", "app2.test.default")); + assertEquals(4.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityDisk", app2context), 0.01d); + assertEquals(4.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityMem", app2context), 0.01d); + assertEquals(2.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityCpu", app2context), 0.01d); } private ApplicationId app(String tenant) { @@ -221,6 +231,17 @@ public class MetricsReporterTest { return new TestContext(properties); } + double sumDoubleValues(String key, Context sumContext) { + double sum = 0.0; + for(Context c : context.get(key)) { + TestContext tc = (TestContext) c; + if (tc.value instanceof Double && tc.properties.equals(((TestContext) sumContext).properties)) { + sum += (double) tc.value; + } + } + return sum; + } + /** * Context where the propertymap is not shared - but unique to each value. */ -- cgit v1.2.3