diff options
author | Bjørn Meland <bjormel@users.noreply.github.com> | 2021-10-08 11:10:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-08 11:10:00 +0200 |
commit | 981b6db196770432cb7179e4996baf62b94191e6 (patch) | |
tree | 31c7810a861c281d84ed8005220f6f4f8025b608 /node-admin | |
parent | 876a4aa51b905bd2f1514bcb8516ab3670538974 (diff) |
Revert "Revert "Revert "Revert "Metric for last successful update of IP tables""""
Diffstat (limited to 'node-admin')
2 files changed, 49 insertions, 4 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java index cb2134b36af..8dd368bec55 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java @@ -2,7 +2,10 @@ package com.yahoo.vespa.hosted.node.admin.maintenance.acl; import com.google.common.net.InetAddresses; +import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec; import com.yahoo.vespa.hosted.node.admin.container.ContainerOperations; +import com.yahoo.vespa.hosted.node.admin.container.metrics.Dimensions; +import com.yahoo.vespa.hosted.node.admin.container.metrics.Metrics; import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContext; import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentTask; import com.yahoo.vespa.hosted.node.admin.task.util.file.Editor; @@ -15,7 +18,9 @@ import java.net.InetAddress; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.logging.Level; @@ -43,10 +48,17 @@ public class AclMaintainer { private final ContainerOperations containerOperations; private final IPAddresses ipAddresses; + private final Metrics metrics; + private final Map<String, Long> lastSuccess; + private static final String METRIC_NAME_POSTFIX = ".acl.age"; - public AclMaintainer(ContainerOperations containerOperations, IPAddresses ipAddresses) { + public AclMaintainer(ContainerOperations containerOperations, IPAddresses ipAddresses, Metrics metrics) { this.containerOperations = containerOperations; this.ipAddresses = ipAddresses; + this.metrics = metrics; + long timestamp = System.currentTimeMillis() / 1_000; + this.lastSuccess = new HashMap<>(Map.of(IPVersion.IPv4.id(), timestamp, + IPVersion.IPv6.id(), timestamp)); } // ip(6)tables operate while having the xtables lock, run with synchronized to prevent multiple NodeAgents @@ -55,8 +67,13 @@ public class AclMaintainer { if (context.isDisabled(NodeAgentTask.AclMaintainer)) return; // Apply acl to the filter table - editFlushOnError(context, IPVersion.IPv4, "filter", FilterTableLineEditor.from(context.acl(), IPVersion.IPv4)); - editFlushOnError(context, IPVersion.IPv6, "filter", FilterTableLineEditor.from(context.acl(), IPVersion.IPv6)); + boolean updatedIPv4 = editFlushOnError(context, IPVersion.IPv4, "filter", FilterTableLineEditor.from(context.acl(), IPVersion.IPv4)); + boolean updatedIPv6 = editFlushOnError(context, IPVersion.IPv6, "filter", FilterTableLineEditor.from(context.acl(), IPVersion.IPv6)); + + Dimensions dimensions = generateDimensions(context); + + updateMetric(dimensions, updatedIPv4, IPVersion.IPv4.id()); + updateMetric(dimensions, updatedIPv6, IPVersion.IPv6.id()); ipAddresses.getAddress(context.hostname().value(), IPVersion.IPv4).ifPresent(addr -> applyRedirect(context, addr)); ipAddresses.getAddress(context.hostname().value(), IPVersion.IPv6).ifPresent(addr -> applyRedirect(context, addr)); @@ -115,6 +132,32 @@ public class AclMaintainer { }; } + void updateMetric(Dimensions dimensions, boolean updated, String ipVersion) { + long updateAgeInSec; + long timestamp = System.currentTimeMillis() / 1_000; + if (updated) { + updateAgeInSec = 0; + lastSuccess.put(ipVersion, timestamp); + } else { + updateAgeInSec = timestamp - lastSuccess.get(ipVersion); + } + + metrics.declareGauge(Metrics.APPLICATION_NODE, ipVersion + METRIC_NAME_POSTFIX, dimensions, Metrics.DimensionType.PRETAGGED) + .sample(updateAgeInSec); + + } + + private Dimensions generateDimensions(NodeAgentContext context) { + NodeSpec node = context.node(); + Dimensions.Builder dimensionsBuilder = new Dimensions.Builder() + .add("host", node.hostname()) + .add("zone", context.zone().getId().value()); + + node.currentVespaVersion().ifPresent(vespaVersion -> dimensionsBuilder.add("vespaVersion", vespaVersion.toFullString())); + + return dimensionsBuilder.build(); + } + private static class TemporaryIpTablesFileHandler implements AutoCloseable { private final Path path; diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java index a10ce1c7d74..4d04743c531 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.node.admin.maintenance.acl; import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.Acl; import com.yahoo.vespa.hosted.node.admin.container.ContainerOperations; +import com.yahoo.vespa.hosted.node.admin.container.metrics.Metrics; import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContext; import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContextImpl; import com.yahoo.vespa.hosted.node.admin.task.util.file.UnixPath; @@ -37,7 +38,8 @@ public class AclMaintainerTest { private final ContainerOperations containerOperations = mock(ContainerOperations.class); private final IPAddressesMock ipAddresses = new IPAddressesMock(); - private final AclMaintainer aclMaintainer = new AclMaintainer(containerOperations, ipAddresses); + private final Metrics metrics = new Metrics(); + private final AclMaintainer aclMaintainer = new AclMaintainer(containerOperations, ipAddresses, metrics); private final FileSystem fileSystem = TestFileSystem.create(); private final Function<Acl, NodeAgentContext> contextGenerator = |