diff options
author | Valerij Fredriksen <freva@users.noreply.github.com> | 2017-06-20 10:38:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-20 10:38:24 +0200 |
commit | 555b86fd88709d00b00f5f590c8024b739346bdf (patch) | |
tree | 81ea8c56ca012a9ec01a69cbb552483d3b6bb0ea /node-admin | |
parent | 552782a9b7da4e85721c05a62b9b8c3fed5c6a15 (diff) | |
parent | 4cee571358186bf6321eb035f88a5194614b881f (diff) |
Merge pull request #2808 from yahoo/freva/node-admin-metrics
Freva/node admin metrics
Diffstat (limited to 'node-admin')
10 files changed, 100 insertions, 428 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java index 670efe9d309..c5e1da5cd85 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java @@ -18,6 +18,7 @@ public class ContainerNodeSpec { public final Node.State nodeState; public final String nodeType; public final String nodeFlavor; + public final String nodeCanonicalFlavor; public final Optional<String> wantedVespaVersion; public final Optional<String> vespaVersion; public final Optional<Owner> owner; @@ -37,6 +38,7 @@ public class ContainerNodeSpec { final Node.State nodeState, final String nodeType, final String nodeFlavor, + final String nodeCanonicalFlavor, final Optional<String> wantedVespaVersion, final Optional<String> vespaVersion, final Optional<Owner> owner, @@ -59,6 +61,7 @@ public class ContainerNodeSpec { this.nodeState = nodeState; this.nodeType = nodeType; this.nodeFlavor = nodeFlavor; + this.nodeCanonicalFlavor = nodeCanonicalFlavor; this.wantedVespaVersion = wantedVespaVersion; this.vespaVersion = vespaVersion; this.owner = owner; @@ -85,6 +88,7 @@ public class ContainerNodeSpec { Objects.equals(nodeState, that.nodeState) && Objects.equals(nodeType, that.nodeType) && Objects.equals(nodeFlavor, that.nodeFlavor) && + Objects.equals(nodeCanonicalFlavor, that.nodeCanonicalFlavor) && Objects.equals(wantedVespaVersion, that.wantedVespaVersion) && Objects.equals(vespaVersion, that.vespaVersion) && Objects.equals(owner, that.owner) && @@ -107,6 +111,7 @@ public class ContainerNodeSpec { nodeState, nodeType, nodeFlavor, + nodeCanonicalFlavor, wantedVespaVersion, vespaVersion, owner, @@ -129,6 +134,7 @@ public class ContainerNodeSpec { + " nodeState=" + nodeState + " nodeType = " + nodeType + " nodeFlavor = " + nodeFlavor + + " nodeCanonicalFlavor = " + nodeCanonicalFlavor + " wantedVespaVersion = " + wantedVespaVersion + " vespaVersion = " + vespaVersion + " owner = " + owner @@ -243,6 +249,7 @@ public class ContainerNodeSpec { private Node.State nodeState; private String nodeType; private String nodeFlavor; + private String nodeCanonicalFlavor; private Optional<String> wantedVespaVersion = Optional.empty(); private Optional<String> vespaVersion = Optional.empty(); private Optional<Owner> owner = Optional.empty(); @@ -262,6 +269,7 @@ public class ContainerNodeSpec { nodeState(nodeSpec.nodeState); nodeType(nodeSpec.nodeType); nodeFlavor(nodeSpec.nodeFlavor); + nodeCanonicalFlavor(nodeSpec.nodeCanonicalFlavor); nodeSpec.wantedDockerImage.ifPresent(this::wantedDockerImage); nodeSpec.currentDockerImage.ifPresent(this::currentDockerImage); @@ -307,6 +315,11 @@ public class ContainerNodeSpec { return this; } + public Builder nodeCanonicalFlavor(String nodeCanonicalFlavor) { + this.nodeCanonicalFlavor = nodeCanonicalFlavor; + return this; + } + public Builder wantedVespaVersion(String wantedVespaVersion) { this.wantedVespaVersion = Optional.of(wantedVespaVersion); return this; @@ -363,7 +376,8 @@ public class ContainerNodeSpec { } public ContainerNodeSpec build() { - return new ContainerNodeSpec(hostname, wantedDockerImage, currentDockerImage, nodeState, nodeType, nodeFlavor, + return new ContainerNodeSpec(hostname, wantedDockerImage, currentDockerImage, nodeState, nodeType, + nodeFlavor, nodeCanonicalFlavor, wantedVespaVersion, vespaVersion, owner, membership, wantedRestartGeneration, currentRestartGeneration, wantedRebootGeneration, currentRebootGeneration, diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java index 0b0d141e46d..fd5029162bc 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java @@ -63,10 +63,7 @@ public class StorageMaintainer { this.environment = environment; this.clock = clock; - Dimensions dimensions = new Dimensions.Builder() - .add("host", HostName.getLocalhost()) - .add("role", "docker").build(); - + Dimensions dimensions = new Dimensions.Builder().add("role", "docker").build(); numberOfNodeAdminMaintenanceFails = metricReceiver.declareCounter(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "nodes.maintenance.fails"); } @@ -74,28 +71,31 @@ public class StorageMaintainer { final Path yamasAgentFolder = environment.pathInNodeAdminFromPathInNode(containerName, "/etc/yamas-agent/"); Path vespaCheckPath = Paths.get(getDefaults().underVespaHome("libexec/yms/yms_check_vespa")); - SecretAgentScheduleMaker scheduleMaker = new SecretAgentScheduleMaker("vespa", 60, vespaCheckPath, "all") + SecretAgentScheduleMaker vespaSchedule = new SecretAgentScheduleMaker("vespa", 60, vespaCheckPath, "all") + .withTag("parentHostname", environment.getParentHostHostname()); + + Path hostLifeCheckPath = Paths.get("/home/y/libexec/yms/yms_check_host_life"); + SecretAgentScheduleMaker hostLifeSchedule = new SecretAgentScheduleMaker("host-life", 60, hostLifeCheckPath) .withTag("namespace", "Vespa") .withTag("role", "tenants") .withTag("flavor", nodeSpec.nodeFlavor) .withTag("state", nodeSpec.nodeState.toString()) .withTag("zone", environment.getZone()) .withTag("parentHostname", environment.getParentHostHostname()); - - nodeSpec.owner.ifPresent(owner -> - scheduleMaker - .withTag("tenantName", owner.tenant) - .withTag("app", owner.application + "." + owner.instance)); - - nodeSpec.membership.ifPresent(membership -> - scheduleMaker - .withTag("clustertype", membership.clusterType) - .withTag("clusterid", membership.clusterId)); - - nodeSpec.vespaVersion.ifPresent(version -> scheduleMaker.withTag("vespaVersion", version)); + nodeSpec.owner.ifPresent(owner -> hostLifeSchedule + .withTag("tenantName", owner.tenant) + .withTag("app", owner.application + "." + owner.instance) + .withTag("applicationName", owner.application) + .withTag("instanceName", owner.instance) + .withTag("applicationId", owner.tenant + "." + owner.application + "." + owner.instance)); + nodeSpec.membership.ifPresent(membership -> hostLifeSchedule + .withTag("clustertype", membership.clusterType) + .withTag("clusterid", membership.clusterId)); + nodeSpec.vespaVersion.ifPresent(version -> hostLifeSchedule.withTag("vespaVersion", version)); try { - scheduleMaker.writeTo(yamasAgentFolder); + vespaSchedule.writeTo(yamasAgentFolder); + hostLifeSchedule.writeTo(yamasAgentFolder); final String[] restartYamasAgent = new String[]{"service", "yamas-agent", "restart"}; docker.executeInContainerAsRoot(containerName, restartYamasAgent); } catch (IOException e) { diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java index 79f0c23fd24..eaae5030b50 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.node.admin.nodeadmin; import com.yahoo.collections.Pair; import com.yahoo.concurrent.ThreadFactoryFactory; -import com.yahoo.net.HostName; import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.metrics.CounterWrapper; import com.yahoo.vespa.hosted.dockerapi.metrics.Dimensions; @@ -78,20 +77,17 @@ public class NodeAdminImpl implements NodeAdmin { this.isFrozen = true; this.startOfFreezeConvergence = clock.instant(); - Dimensions dimensions = new Dimensions.Builder() - .add("host", HostName.getLocalhost()) - .add("role", "docker").build(); - + Dimensions dimensions = new Dimensions.Builder().add("role", "docker").build(); this.numberOfContainersInLoadImageState = metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "nodes.image.loading"); this.numberOfUnhandledExceptionsInNodeAgent = metricReceiver.declareCounter(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "nodes.unhandled_exceptions"); - metricsScheduler.scheduleWithFixedDelay(() -> { + metricsScheduler.scheduleAtFixedRate(() -> { try { nodeAgents.values().forEach(nodeAgent -> nodeAgent.updateContainerNodeMetrics(nodeAgents.size())); } catch (Throwable e) { logger.warning("Metric fetcher scheduler failed", e); } - }, 0, 30, TimeUnit.SECONDS); + }, 0, 55, TimeUnit.SECONDS); aclMaintainer.ifPresent(maintainer -> aclScheduler.scheduleWithFixedDelay(() -> { if (!isFrozen()) maintainer.run(); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java index baa924811c3..08fae2b707a 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java @@ -9,6 +9,7 @@ import com.yahoo.vespa.hosted.dockerapi.Docker; import com.yahoo.vespa.hosted.dockerapi.DockerExecTimeoutException; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.dockerapi.ProcessResult; +import com.yahoo.vespa.hosted.dockerapi.metrics.DimensionMetrics; import com.yahoo.vespa.hosted.dockerapi.metrics.Dimensions; import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; @@ -26,9 +27,11 @@ import java.text.SimpleDateFormat; import java.time.Clock; import java.time.Duration; import java.time.Instant; +import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.Executors; @@ -93,7 +96,7 @@ public class NodeAgentImpl implements NodeAgent { // The attributes of the last successful node repo attribute update for this node. Used to avoid redundant calls. private NodeAttributes lastAttributesSet = null; private ContainerNodeSpec lastNodeSpec = null; - private CpuUsageReporter lastCpuMetric; + private CpuUsageReporter lastCpuMetric = new CpuUsageReporter(); public NodeAgentImpl( final String hostName, @@ -131,12 +134,8 @@ public class NodeAgentImpl implements NodeAgent { }; // If the container is already running, initialize vespaVersion and lastCpuMetric - lastCpuMetric = new CpuUsageReporter(clock.instant()); dockerOperations.getContainer(containerName) .ifPresent(container -> { - if (container.state.isRunning()) { - lastCpuMetric = new CpuUsageReporter(container.created); - } containerState = RUNNING_HOWEVER_RESUME_SCRIPT_NOT_RUN; logger.info("Container is already running, setting containerState to " + containerState); }); @@ -257,7 +256,7 @@ public class NodeAgentImpl implements NodeAgent { private void startContainer(ContainerNodeSpec nodeSpec) { aclMaintainer.ifPresent(AclMaintainer::run); dockerOperations.startContainer(containerName, nodeSpec); - lastCpuMetric = new CpuUsageReporter(clock.instant()); + lastCpuMetric = new CpuUsageReporter(); currentFilebeatRestarter = filebeatRestarter.scheduleWithFixedDelay(() -> serviceRestarter.accept("filebeat"), 1, 1, TimeUnit.DAYS); storageMaintainer.ifPresent(maintainer -> { @@ -345,7 +344,6 @@ public class NodeAgentImpl implements NodeAgent { } if (currentFilebeatRestarter != null) currentFilebeatRestarter.cancel(true); dockerOperations.removeContainer(existingContainer); - metricReceiver.unsetMetricsForContainer(hostname); containerState = ABSENT; logger.info("Container successfully removed, new containerState is " + containerState); return Optional.empty(); @@ -436,7 +434,6 @@ public class NodeAgentImpl implements NodeAgent { // Every time the node spec changes, we should clear the metrics for this container as the dimensions // will change and we will be reporting duplicate metrics. // TODO: Should be retried if writing fails - metricReceiver.unsetMetricsForContainer(hostname); if (container.isPresent()) { storageMaintainer.ifPresent(maintainer -> { maintainer.writeMetricsConfig(containerName, nodeSpec); @@ -506,38 +503,17 @@ public class NodeAgentImpl implements NodeAgent { @SuppressWarnings("unchecked") public void updateContainerNodeMetrics(int numAllocatedContainersOnHost) { final ContainerNodeSpec nodeSpec = lastNodeSpec; - if (nodeSpec == null) return; + if (nodeSpec == null || containerState == ABSENT) return; + + Optional<Docker.ContainerStats> containerStats = dockerOperations.getContainerStats(containerName); + if (!containerStats.isPresent()) return; Dimensions.Builder dimensionsBuilder = new Dimensions.Builder() .add("host", hostname) .add("role", "tenants") - .add("flavor", nodeSpec.nodeFlavor) .add("state", nodeSpec.nodeState.toString()) - .add("zone", environment.getZone()) .add("parentHostname", environment.getParentHostHostname()); - nodeSpec.vespaVersion.ifPresent(version -> dimensionsBuilder.add("vespaVersion", version)); - - nodeSpec.owner.ifPresent(owner -> - dimensionsBuilder - .add("tenantName", owner.tenant) - .add("applicationName", owner.application) - .add("instanceName", owner.instance) - .add("applicationId", owner.tenant + "." + owner.application + "." + owner.instance) - .add("app", owner.application + "." + owner.instance)); - - nodeSpec.membership.ifPresent(membership -> - dimensionsBuilder - .add("clustertype", membership.clusterType) - .add("clusterid", membership.clusterId)); Dimensions dimensions = dimensionsBuilder.build(); - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_NODE, dimensions, "alive").sample(1); - // TODO: REMOVE - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "node.alive").sample(1); - - // The remaining metrics require container to exists and be running - if (containerState == ABSENT) return; - Optional<Docker.ContainerStats> containerStats = dockerOperations.getContainerStats(containerName); - if (!containerStats.isPresent()) return; Docker.ContainerStats stats = containerStats.get(); final String APP = MetricReceiverWrapper.APPLICATION_NODE; @@ -560,83 +536,48 @@ public class NodeAgentImpl implements NodeAgent { double memoryPercentUsed = 100.0 * memoryTotalBytesUsed / memoryTotalBytes; Optional<Double> diskPercentUsed = diskTotalBytes.flatMap(total -> diskTotalBytesUsed.map(used -> 100.0 * used / total)); - metricReceiver.declareGauge(APP, dimensions, "cpu.util").sample(cpuPercentageOfAllocated); - metricReceiver.declareGauge(APP, dimensions, "mem.limit").sample(memoryTotalBytes); - metricReceiver.declareGauge(APP, dimensions, "mem.used").sample(memoryTotalBytesUsed); - metricReceiver.declareGauge(APP, dimensions, "mem.util").sample(memoryPercentUsed); - diskTotalBytes.ifPresent(diskLimit -> metricReceiver.declareGauge(APP, dimensions, "disk.limit").sample(diskLimit)); - diskTotalBytesUsed.ifPresent(diskUsed -> metricReceiver.declareGauge(APP, dimensions, "disk.used").sample(diskUsed)); - diskPercentUsed.ifPresent(diskUtil -> metricReceiver.declareGauge(APP, dimensions, "disk.util").sample(diskUtil)); - - stats.getNetworks().forEach((interfaceName, interfaceStats) -> { - Dimensions netDims = dimensionsBuilder.add("interface", interfaceName).build(); - Map<String, Number> infStats = (Map<String, Number>) interfaceStats; - - metricReceiver.declareGauge(APP, netDims, "net.in.bytes").sample(infStats.get("rx_bytes").longValue()); - metricReceiver.declareGauge(APP, netDims, "net.in.errors").sample(infStats.get("rx_errors").longValue()); - metricReceiver.declareGauge(APP, netDims, "net.in.dropped").sample(infStats.get("rx_dropped").longValue()); - metricReceiver.declareGauge(APP, netDims, "net.out.bytes").sample(infStats.get("tx_bytes").longValue()); - metricReceiver.declareGauge(APP, netDims, "net.out.errors").sample(infStats.get("tx_errors").longValue()); - metricReceiver.declareGauge(APP, netDims, "net.out.dropped").sample(infStats.get("tx_dropped").longValue()); - }); + List<DimensionMetrics> metrics = new ArrayList<>(); + DimensionMetrics.Builder systemMetricsBuilder = new DimensionMetrics.Builder(APP, dimensions) + .withMetric("cpu.util", cpuPercentageOfAllocated) + .withMetric("mem.limit", memoryTotalBytes) + .withMetric("mem.used", memoryTotalBytesUsed) + .withMetric("mem.util", memoryPercentUsed); - - // TODO: Remove when all alerts and dashboards have been updated to use new metric names - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "node.cpu.busy.pct").sample(cpuPercentageOfAllocated); - - addIfNotNull(dimensions, "node.cpu.throttled_time", stats.getCpuStats().get("throttling_data"), "throttled_time"); - addIfNotNull(dimensions, "node.memory.limit", stats.getMemoryStats(), "limit"); - - long memoryUsageTotal = ((Number) stats.getMemoryStats().get("usage")).longValue(); - long memoryUsageCache = ((Number) ((Map) stats.getMemoryStats().get("stats")).get("cache")).longValue(); - long memoryUsage = memoryUsageTotal - memoryUsageCache; - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "node.memory.usage").sample(memoryUsage); + diskTotalBytes.ifPresent(diskLimit -> systemMetricsBuilder.withMetric("disk.limit", diskLimit)); + diskTotalBytesUsed.ifPresent(diskUsed -> systemMetricsBuilder.withMetric("disk.used", diskUsed)); + diskPercentUsed.ifPresent(diskUtil -> systemMetricsBuilder.withMetric("disk.util", diskUtil)); + metrics.add(systemMetricsBuilder.build()); stats.getNetworks().forEach((interfaceName, interfaceStats) -> { Dimensions netDims = dimensionsBuilder.add("interface", interfaceName).build(); - - addIfNotNull(netDims, "node.net.in.bytes", interfaceStats, "rx_bytes"); - addIfNotNull(netDims, "node.net.in.errors", interfaceStats, "rx_errors"); - addIfNotNull(netDims, "node.net.in.dropped", interfaceStats, "rx_dropped"); - addIfNotNull(netDims, "node.net.out.bytes", interfaceStats, "tx_bytes"); - addIfNotNull(netDims, "node.net.out.errors", interfaceStats, "tx_errors"); - addIfNotNull(netDims, "node.net.out.dropped", interfaceStats, "tx_dropped"); + Map<String, Number> infStats = (Map<String, Number>) interfaceStats; + DimensionMetrics networkMetrics = new DimensionMetrics.Builder(APP, netDims) + .withMetric("net.in.bytes", infStats.get("rx_bytes").longValue()) + .withMetric("net.in.errors", infStats.get("rx_errors").longValue()) + .withMetric("net.in.dropped", infStats.get("rx_dropped").longValue()) + .withMetric("net.out.bytes", infStats.get("tx_bytes").longValue()) + .withMetric("net.out.errors", infStats.get("tx_errors").longValue()) + .withMetric("net.out.dropped", infStats.get("tx_dropped").longValue()) + .build(); + metrics.add(networkMetrics); }); - diskTotalBytes.ifPresent(diskLimit -> - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "node.disk.limit").sample(diskLimit)); - diskTotalBytesUsed.ifPresent(diskUsed -> - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "node.disk.used").sample(diskUsed)); - // TODO END REMOVE - - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_HOST_LIFE, dimensions, "uptime").sample(lastCpuMetric.getUptime()); - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_HOST_LIFE, dimensions, "alive").sample(1); - - // Push metrics to the metrics proxy in each container - give it maximum 1 seconds to complete - try { - dockerOperations.executeCommandInContainerAsRoot(containerName, 1L, "rpc_invoke", "-t 1", "tcp/localhost:19091", "setExtraMetrics", buildRPCArgumentFromMetrics()); - } catch (DockerExecTimeoutException|JsonProcessingException e) { - logger.warning("Unable to push metrics to container: " + containerName, e); - } + pushMetricsToContainer(metrics); } - protected String buildRPCArgumentFromMetrics() throws JsonProcessingException { + private void pushMetricsToContainer(List<DimensionMetrics> metrics) { StringBuilder params = new StringBuilder(); - for (MetricReceiverWrapper.DimensionMetrics dimensionMetrics : metricReceiver.getAllMetrics()) { - params.append(dimensionMetrics.toSecretAgentReport()); - } - return "s:'" + params.toString() + "'"; - } - - @SuppressWarnings("unchecked") - private void addIfNotNull(Dimensions dimensions, String yamasName, Object metrics, String metricName) { - Map<String, Object> metricsMap = (Map<String, Object>) metrics; - if (metricsMap == null || !metricsMap.containsKey(metricName)) return; try { - metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, yamasName) - .sample(((Number) metricsMap.get(metricName)).doubleValue()); - } catch (Throwable e) { - logger.warning("Failed to update " + yamasName + " metric with value " + metricsMap.get(metricName), e); + for (DimensionMetrics dimensionMetrics : metrics) { + params.append(dimensionMetrics.toSecretAgentReport()); + } + String wrappedMetrics = "s:" + params.toString(); + + // Push metrics to the metrics proxy in each container - give it maximum 1 seconds to complete + String[] command = {"rpc_invoke", "-t", "1", "tcp/localhost:19091", "setExtraMetrics", wrappedMetrics}; + dockerOperations.executeCommandInContainerAsRoot(containerName, 5L, command); + } catch (DockerExecTimeoutException | JsonProcessingException e) { + logger.warning("Unable to push metrics to container: " + containerName, e); } } @@ -665,11 +606,6 @@ public class NodeAgentImpl implements NodeAgent { class CpuUsageReporter { private long totalContainerUsage = 0; private long totalSystemUsage = 0; - private final Instant created; - - CpuUsageReporter(Instant created) { - this.created = created; - } double getCpuUsagePercentage(long currentContainerUsage, long currentSystemUsage) { long deltaSystemUsage = currentSystemUsage - totalSystemUsage; @@ -680,10 +616,6 @@ public class NodeAgentImpl implements NodeAgent { totalSystemUsage = currentSystemUsage; return cpuUsagePct; } - - long getUptime() { - return Duration.between(created, clock.instant()).getSeconds(); - } } // TODO: Also skip orchestration if we're downgrading in test/staging diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java index 03a8ed3d8c5..a83b7dd61b6 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java @@ -127,6 +127,7 @@ public class NodeRepositoryImpl implements NodeRepository { nodeState, node.nodeType, node.nodeFlavor, + node.nodeCanonicalFlavor, Optional.ofNullable(node.wantedVespaVersion), Optional.ofNullable(node.vespaVersion), Optional.ofNullable(owner), diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java index 0a0c61119b4..0dd0f410c07 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java @@ -31,6 +31,7 @@ public class GetNodesResponse { public final String nodeState; public final String nodeType; public final String nodeFlavor; + public final String nodeCanonicalFlavor; public final String wantedVespaVersion; public final String vespaVersion; public final Owner owner; @@ -50,6 +51,7 @@ public class GetNodesResponse { @JsonProperty("state") String nodeState, @JsonProperty("type") String nodeType, @JsonProperty("flavor") String nodeFlavor, + @JsonProperty("canonicalFlavor") String nodeCanonicalFlavor, @JsonProperty("wantedVespaVersion") String wantedVespaVersion, @JsonProperty("vespaVersion") String vespaVersion, @JsonProperty("owner") Owner owner, @@ -67,6 +69,7 @@ public class GetNodesResponse { this.nodeState = nodeState; this.nodeType = nodeType; this.nodeFlavor = nodeFlavor; + this.nodeCanonicalFlavor = nodeCanonicalFlavor; this.wantedVespaVersion = wantedVespaVersion; this.vespaVersion = vespaVersion; this.owner = owner; diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java index 07ee9620102..ff6ac9ce1e7 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java @@ -7,6 +7,7 @@ import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.container.jdisc.LoggingRequestHandler; import com.yahoo.container.logging.AccessLog; +import com.yahoo.vespa.hosted.dockerapi.metrics.DimensionMetrics; import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater; import com.yahoo.vespa.hosted.node.admin.provider.ComponentsProvider; @@ -68,7 +69,7 @@ public class RestApiHandler extends LoggingRequestHandler{ @Override public void render(OutputStream outputStream) throws IOException { try (PrintStream printStream = new PrintStream(outputStream)) { - for (MetricReceiverWrapper.DimensionMetrics dimensionMetrics : metricReceiverWrapper.getAllMetrics()) { + for (DimensionMetrics dimensionMetrics : metricReceiverWrapper.getAllMetrics()) { String secretAgentJsonReport = dimensionMetrics.toSecretAgentReport() + "\n"; printStream.write(secretAgentJsonReport.getBytes(StandardCharsets.UTF_8.name())); } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java index 6f322165054..91d9b382b7c 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java @@ -32,12 +32,14 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; @@ -529,25 +531,23 @@ public class NodeAgentImplTest { clock.advance(Duration.ofSeconds(1234)); nodeAgent.updateContainerNodeMetrics(5); - - File expectedMetricsFile = new File(classLoader.getResource("docker.stats.metrics.active.expected.json").getFile()); - Set<Map<String, Object>> expectedMetrics = objectMapper.readValue(expectedMetricsFile, Set.class); - Set<Map<String, Object>> actualMetrics = metricReceiver.getAllMetricsRaw(); - - String arg = nodeAgent.buildRPCArgumentFromMetrics(); - arg = arg.replaceAll("\"timestamp\":\\d+", "\"timestamp\":0"); - - assertEquals("s:'{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"vespa.node\",\"metrics\":{\"mem.limit\":4.294967296E9,\"mem.used\":1.073741824E9,\"alive\":1.0,\"disk.used\":4.2547019776E10,\"disk.util\":15.85,\"cpu.util\":6.75,\"disk.limit\":2.68435456E11,\"mem.util\":25.0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"vespa.node\",\"metrics\":{\"net.out.bytes\":2.0303455E7,\"net.out.dropped\":13.0,\"net.in.dropped\":4.0,\"net.in.bytes\":1.949927E7,\"net.out.errors\":3.0,\"net.in.errors\":55.0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"interface\":\"eth0\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"vespa.node\",\"metrics\":{\"net.out.bytes\":5.4246745E7,\"net.out.dropped\":0.0,\"net.in.dropped\":0.0,\"net.in.bytes\":3245766.0,\"net.out.errors\":0.0,\"net.in.errors\":0.0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"interface\":\"eth1\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"host_life\",\"metrics\":{\"alive\":1.0,\"uptime\":1234.0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"docker\",\"metrics\":{\"node.disk.limit\":2.68435456E11,\"node.disk.used\":4.2547019776E10,\"node.memory.usage\":1.073741824E9,\"node.cpu.busy.pct\":6.75,\"node.cpu.throttled_time\":4523.0,\"node.memory.limit\":4.294967296E9,\"node.alive\":1.0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"docker\",\"metrics\":{\"node.net.in.dropped\":4.0,\"node.net.out.errors\":3.0,\"node.net.out.bytes\":2.0303455E7,\"node.net.in.bytes\":1.949927E7,\"node.net.out.dropped\":13.0,\"node.net.in.errors\":55.0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"interface\":\"eth0\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"docker\",\"metrics\":{\"node.net.in.dropped\":0.0,\"node.net.out.errors\":0.0,\"node.net.out.bytes\":5.4246745E7,\"node.net.in.bytes\":3245766.0,\"node.net.out.dropped\":0.0,\"node.net.in.errors\":0.0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"interface\":\"eth1\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}'", arg); - - assertEquals(expectedMetrics, actualMetrics); + String[] expectedCommand = {"rpc_invoke", "-t", "1", "tcp/localhost:19091", "setExtraMetrics", + "s:{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"vespa.node\",\"metrics\":{\"mem.limit\":4294967296,\"mem.used\":1073741824,\"disk.used\":42547019776,\"disk.util\":15.85,\"cpu.util\":0.0,\"mem.util\":25.0,\"disk.limit\":268435456000},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"vespa.node\",\"metrics\":{\"net.out.bytes\":20303455,\"net.in.dropped\":4,\"net.out.dropped\":13,\"net.in.bytes\":19499270,\"net.out.errors\":3,\"net.in.errors\":55},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"interface\":\"eth0\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}{\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}},\"application\":\"vespa.node\",\"metrics\":{\"net.out.bytes\":54246745,\"net.in.dropped\":0,\"net.out.dropped\":0,\"net.in.bytes\":3245766,\"net.out.errors\":0,\"net.in.errors\":0},\"dimensions\":{\"app\":\"testapp.testinstance\",\"role\":\"tenants\",\"instanceName\":\"testinstance\",\"vespaVersion\":\"1.2.3\",\"clusterid\":\"clustId\",\"interface\":\"eth1\",\"parentHostname\":\"parent.host.name.yahoo.com\",\"flavor\":\"docker\",\"clustertype\":\"clustType\",\"tenantName\":\"tester\",\"zone\":\"dev.us-east-1\",\"host\":\"host1.test.yahoo.com\",\"state\":\"active\",\"applicationId\":\"tester.testapp.testinstance\",\"applicationName\":\"testapp\"},\"timestamp\":0}"}; + doAnswer(invocation -> { + ContainerName calledContainerName = (ContainerName) invocation.getArguments()[0]; + long calledTimeout = (long) invocation.getArguments()[1]; + String[] calledCommand = (String[]) invocation.getArguments()[2]; + calledCommand[calledCommand.length - 1] = calledCommand[calledCommand.length - 1].replaceAll("\"timestamp\":\\d+", "\"timestamp\":0"); + + assertEquals(containerName, calledContainerName); + assertEquals(5L, calledTimeout); + assertArrayEquals(expectedCommand, calledCommand); + return null; + }).when(dockerOperations).executeCommandInContainerAsRoot(any(), any(), any()); } @Test - @SuppressWarnings("unchecked") public void testGetRelevantMetricsForReadyNode() throws Exception { - final ObjectMapper objectMapper = new ObjectMapper(); - ClassLoader classLoader = getClass().getClassLoader(); - final ContainerNodeSpec nodeSpec = nodeSpecBuilder .nodeState(Node.State.ready) .build(); @@ -561,11 +561,8 @@ public class NodeAgentImplTest { nodeAgent.updateContainerNodeMetrics(5); - File expectedMetricsFile = new File(classLoader.getResource("docker.stats.metrics.ready.expected.json").getFile()); - Set<Map<String, Object>> expectedMetrics = objectMapper.readValue(expectedMetricsFile, Set.class); Set<Map<String, Object>> actualMetrics = metricReceiver.getAllMetricsRaw(); - - assertEquals(expectedMetrics, actualMetrics); + assertEquals(Collections.emptySet(), actualMetrics); } @@ -576,8 +573,7 @@ public class NodeAgentImplTest { dockerImage, containerName, isRunning ? Container.State.RUNNING : Container.State.EXITED, - isRunning ? 1 : 0, - clock.instant().toString())) : + isRunning ? 1 : 0)) : Optional.empty(); when(dockerOperations.getContainerStats(any())).thenReturn(Optional.of(emptyContainerStats)); diff --git a/node-admin/src/test/resources/docker.stats.metrics.active.expected.json b/node-admin/src/test/resources/docker.stats.metrics.active.expected.json deleted file mode 100644 index 350a054ebac..00000000000 --- a/node-admin/src/test/resources/docker.stats.metrics.active.expected.json +++ /dev/null @@ -1,231 +0,0 @@ -[ - { - "application": "host_life", - "dimensions": { - "flavor": "docker", - "instanceName": "testinstance", - "applicationId": "tester.testapp.testinstance", - "applicationName": "testapp", - "app": "testapp.testinstance", - "clustertype": "clustType", - "role": "tenants", - "tenantName": "tester", - "zone": "dev.us-east-1", - "host": "host1.test.yahoo.com", - "vespaVersion": "1.2.3", - "state": "active", - "clusterid": "clustId", - "parentHostname": "parent.host.name.yahoo.com" - }, - "metrics": { - "alive": 1.0, - "uptime": 1234.0 - }, - "routing": { - "yamas": { - "namespaces": [ - "Vespa" - ] - } - } - }, - { - "application": "vespa.node", - "dimensions": { - "flavor": "docker", - "applicationName": "testapp", - "instanceName": "testinstance", - "applicationId": "tester.testapp.testinstance", - "app": "testapp.testinstance", - "clustertype": "clustType", - "role": "tenants", - "tenantName": "tester", - "host": "host1.test.yahoo.com", - "vespaVersion": "1.2.3", - "state": "active", - "clusterid": "clustId", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1" - }, - "metrics": { - "alive": 1.0, - "cpu.util": 6.75, - "mem.limit": 4.294967296E9, - "mem.used": 1.073741824E9, - "mem.util": 25.0, - "disk.limit": 2.68435456E11, - "disk.used": 4.2547019776E10, - "disk.util": 15.85 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - }, - { - "application": "vespa.node", - "dimensions": { - "flavor": "docker", - "applicationName": "testapp", - "instanceName": "testinstance", - "applicationId": "tester.testapp.testinstance", - "app": "testapp.testinstance", - "clustertype": "clustType", - "role": "tenants", - "tenantName": "tester", - "host": "host1.test.yahoo.com", - "vespaVersion": "1.2.3", - "state": "active", - "clusterid": "clustId", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1", - "interface": "eth1" - }, - "metrics": { - "net.out.bytes": 5.4246745E7, - "net.out.errors": 0.0, - "net.out.dropped": 0.0, - "net.in.bytes": 3245766.0, - "net.in.errors": 0.0, - "net.in.dropped": 0.0 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - }, - { - "application": "vespa.node", - "dimensions": { - "flavor": "docker", - "applicationName": "testapp", - "instanceName": "testinstance", - "applicationId": "tester.testapp.testinstance", - "app": "testapp.testinstance", - "clustertype": "clustType", - "role": "tenants", - "tenantName": "tester", - "host": "host1.test.yahoo.com", - "vespaVersion": "1.2.3", - "state": "active", - "clusterid": "clustId", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1", - "interface": "eth0" - }, - "metrics": { - "net.out.bytes": 2.0303455E7, - "net.out.errors": 3.0, - "net.out.dropped": 13.0, - "net.in.bytes": 1.949927E7, - "net.in.errors": 55.0, - "net.in.dropped": 4.0 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - }, - { - "application": "docker", - "dimensions": { - "flavor": "docker", - "applicationName": "testapp", - "instanceName": "testinstance", - "applicationId": "tester.testapp.testinstance", - "app": "testapp.testinstance", - "clustertype": "clustType", - "role": "tenants", - "tenantName": "tester", - "host": "host1.test.yahoo.com", - "vespaVersion": "1.2.3", - "state": "active", - "clusterid": "clustId", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1", - "interface": "eth1" - }, - "metrics": { - "node.net.out.bytes": 5.4246745E7, - "node.net.out.errors": 0.0, - "node.net.out.dropped": 0.0, - "node.net.in.bytes": 3245766.0, - "node.net.in.errors": 0.0, - "node.net.in.dropped": 0.0 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - }, - { - "application": "docker", - "dimensions": { - "flavor": "docker", - "applicationName": "testapp", - "instanceName": "testinstance", - "applicationId": "tester.testapp.testinstance", - "app": "testapp.testinstance", - "clustertype": "clustType", - "role": "tenants", - "tenantName": "tester", - "host": "host1.test.yahoo.com", - "vespaVersion": "1.2.3", - "state": "active", - "clusterid": "clustId", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1" - }, - "metrics": { - "node.alive": 1.0, - "node.cpu.busy.pct": 6.75, - "node.cpu.throttled_time": 4523.0, - "node.memory.usage": 1.073741824E9, - "node.memory.limit": 4.294967296E9, - "node.disk.used": 4.2547019776E10, - "node.disk.limit": 2.68435456E11 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - }, - { - "application": "docker", - "dimensions": { - "flavor": "docker", - "applicationName": "testapp", - "instanceName": "testinstance", - "applicationId": "tester.testapp.testinstance", - "app": "testapp.testinstance", - "clustertype": "clustType", - "role": "tenants", - "tenantName": "tester", - "host": "host1.test.yahoo.com", - "vespaVersion": "1.2.3", - "state": "active", - "clusterid": "clustId", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1", - "interface": "eth0" - }, - "metrics": { - "node.net.out.bytes": 2.0303455E7, - "node.net.out.errors": 3.0, - "node.net.out.dropped": 13.0, - "node.net.in.bytes": 1.949927E7, - "node.net.in.errors": 55.0, - "node.net.in.dropped": 4.0 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - } -] diff --git a/node-admin/src/test/resources/docker.stats.metrics.ready.expected.json b/node-admin/src/test/resources/docker.stats.metrics.ready.expected.json deleted file mode 100644 index ed2d5e04446..00000000000 --- a/node-admin/src/test/resources/docker.stats.metrics.ready.expected.json +++ /dev/null @@ -1,40 +0,0 @@ -[ - { - "application": "vespa.node", - "dimensions": { - "flavor": "docker", - "role": "tenants", - "host": "host1.test.yahoo.com", - "state": "ready", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1" - }, - "metrics": { - "alive": 1.0 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - }, - { - "application": "docker", - "dimensions": { - "flavor": "docker", - "role": "tenants", - "host": "host1.test.yahoo.com", - "state": "ready", - "parentHostname": "parent.host.name.yahoo.com", - "zone": "dev.us-east-1" - }, - "metrics": { - "node.alive": 1.0 - }, - "routing": { - "yamas": { - "namespaces": ["Vespa"] - } - } - } -] |