diff options
Diffstat (limited to 'controller-server')
3 files changed, 28 insertions, 4 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainer.java index 826b411df9e..97385da468b 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainer.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.google.common.collect.Maps; +import com.yahoo.jdisc.Metric; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.archive.ArchiveBucketDb; import com.yahoo.vespa.hosted.controller.api.integration.archive.ArchiveService; @@ -10,6 +11,7 @@ import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.Tenant; import java.time.Duration; +import java.util.Map; import java.util.stream.Collectors; /** @@ -19,19 +21,29 @@ import java.util.stream.Collectors; */ public class ArchiveAccessMaintainer extends ControllerMaintainer { + private static final String bucketCountMetricName = "archive.bucketCount"; + private final ArchiveBucketDb archiveBucketDb; private final ArchiveService archiveService; private final ZoneRegistry zoneRegistry; + private final Metric metric; - public ArchiveAccessMaintainer(Controller controller, Duration interval) { + public ArchiveAccessMaintainer(Controller controller, Metric metric, Duration interval) { super(controller, interval); this.archiveBucketDb = controller.archiveBucketDb(); this.archiveService = controller.serviceRegistry().archiveService(); this.zoneRegistry = controller().zoneRegistry(); + this.metric = metric; } @Override protected boolean maintain() { + + // Count buckets - so we can alert if we get close to the account limit of 1000 + zoneRegistry.zones().all().ids().forEach(zoneId -> + metric.set(bucketCountMetricName, archiveBucketDb.buckets(zoneId).size(), + metric.createContext(Map.of("zone", zoneId.value())))); + var tenantArchiveAccessRoles = controller().tenants().asList().stream() .filter(t -> t instanceof CloudTenant) .map(t -> (CloudTenant) t) diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java index ad41fc7c9e8..19199c5a281 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java @@ -66,7 +66,7 @@ public class ControllerMaintenance extends AbstractComponent { maintainers.add(new EndpointCertificateMaintainer(controller, intervals.endpointCertificateMaintainer)); maintainers.add(new TrafficShareUpdater(controller, intervals.trafficFractionUpdater)); maintainers.add(new ArchiveUriUpdater(controller, intervals.archiveUriUpdater)); - maintainers.add(new ArchiveAccessMaintainer(controller, intervals.archiveAccessMaintainer)); + maintainers.add(new ArchiveAccessMaintainer(controller, metric, intervals.archiveAccessMaintainer)); maintainers.add(new TenantRoleMaintainer(controller, intervals.tenantRoleMaintainer)); maintainers.add(new ChangeRequestMaintainer(controller, intervals.changeRequestMaintainer)); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java index 89072519c7d..56247b04ac6 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.zone.ZoneId; +import com.yahoo.jdisc.test.MockMetric; import com.yahoo.vespa.flags.Flags; import com.yahoo.vespa.flags.InMemoryFlagSource; import com.yahoo.vespa.flags.PermanentFlags; @@ -18,6 +19,7 @@ import org.junit.Test; import java.time.Duration; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -40,13 +42,23 @@ public class ArchiveAccessMaintainerTest extends ControllerContainerCloudTest { var tenant1 = createTenantWithAccessRole(tester, "tenant1", tenant1role); createTenantWithAccessRole(tester, "tenant2", tenant2role); - tester.controller().archiveBucketDb().archiveUriFor(ZoneId.from("prod.us-east-3"), tenant1); + ZoneId testZone = ZoneId.from("prod.us-east-3"); + tester.controller().archiveBucketDb().archiveUriFor(testZone, tenant1); var testBucket = new ArchiveBucket("bucketName", "keyArn").withTenant(tenant1); MockArchiveService archiveService = (MockArchiveService) tester.controller().serviceRegistry().archiveService(); assertNull(archiveService.authorizedIamRoles.get(testBucket)); - new ArchiveAccessMaintainer(containerTester.controller(), Duration.ofMinutes(10)).maintain(); + MockMetric metric = new MockMetric(); + new ArchiveAccessMaintainer(containerTester.controller(), metric, Duration.ofMinutes(10)).maintain(); assertEquals(Map.of(tenant1, tenant1role), archiveService.authorizedIamRoles.get(testBucket)); + + var expected = Map.of("archive.bucketCount", + tester.controller().zoneRegistry().zones().all().ids().stream() + .collect(Collectors.toMap( + zone -> Map.of("zone", zone.value()), + zone -> zone.equals(testZone) ? 1d : 0d))); + + assertEquals(expected, metric.metrics()); } private TenantName createTenantWithAccessRole(ControllerTester tester, String tenantName, String role) { |