summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorValerij Fredriksen <freva@users.noreply.github.com>2017-06-20 10:38:24 +0200
committerGitHub <noreply@github.com>2017-06-20 10:38:24 +0200
commit555b86fd88709d00b00f5f590c8024b739346bdf (patch)
tree81ea8c56ca012a9ec01a69cbb552483d3b6bb0ea /node-admin
parent552782a9b7da4e85721c05a62b9b8c3fed5c6a15 (diff)
parent4cee571358186bf6321eb035f88a5194614b881f (diff)
Merge pull request #2808 from yahoo/freva/node-admin-metrics
Freva/node admin metrics
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java16
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java36
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java10
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java150
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java1
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/bindings/GetNodesResponse.java3
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java3
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java38
-rw-r--r--node-admin/src/test/resources/docker.stats.metrics.active.expected.json231
-rw-r--r--node-admin/src/test/resources/docker.stats.metrics.ready.expected.json40
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"]
- }
- }
- }
-]