aboutsummaryrefslogtreecommitdiffstats
path: root/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@verizonmedia.com>2021-02-04 15:24:58 +0100
committerTor Brede Vekterli <vekterli@verizonmedia.com>2021-02-04 15:33:43 +0000
commitc4aaa09747410a5063d5f68433c892750745e184 (patch)
tree053ae49610a67953e3022498fdcd873d45e01edc /clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java
parenta07e2ca9a1ee2b56319f038b33bf03d2a5cd4e2f (diff)
Add resource usage per node to cluster controller status page
Also adds top-level cluster feed block status. Does not yet make enum store/multivalue limit feed blocks visible per node.
Diffstat (limited to 'clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java')
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java46
1 files changed, 45 insertions, 1 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java
index 6d21aa430a2..ac4cb25a9c1 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java
@@ -50,6 +50,10 @@ public class VdsClusterHtmlRenderer {
.append(slobrokGenerationCount).append(".</p>\n");
}
+ public void appendRaw(String rawHtml) {
+ contentBuilder.append(rawHtml);
+ }
+
public void addTable(final StringBuilder destination, final long stableStateTimePeriode) {
destination.append(contentBuilder);
@@ -67,6 +71,7 @@ public class VdsClusterHtmlRenderer {
final ClusterStatsAggregator statsAggregator,
final double minMergeCompletionRatio,
final int maxPrematureCrashes,
+ final Map<String, Double> feedBlockLimits,
final EventLog eventLog,
final String pathPrefix,
final String name) {
@@ -80,6 +85,7 @@ public class VdsClusterHtmlRenderer {
statsAggregator,
minMergeCompletionRatio,
maxPrematureCrashes,
+ feedBlockLimits,
eventLog,
pathPrefix,
dominantVtag,
@@ -91,6 +97,7 @@ public class VdsClusterHtmlRenderer {
statsAggregator,
minMergeCompletionRatio,
maxPrematureCrashes,
+ feedBlockLimits,
eventLog,
pathPrefix,
dominantVtag,
@@ -144,6 +151,8 @@ public class VdsClusterHtmlRenderer {
.addProperties(new HtmlTable.CellProperties().setColSpan(2).setRowSpan(1)))
.addCell(new HtmlTable.Cell(FixedBucketSpaces.globalSpace() + " buckets")
.addProperties(new HtmlTable.CellProperties().setColSpan(2).setRowSpan(1)))
+ .addCell(new HtmlTable.Cell("Resource usage (%)")
+ .addProperties(new HtmlTable.CellProperties().setColSpan(2).setRowSpan(1)))
.addCell(new HtmlTable.Cell("Start Time"))
.addCell(new HtmlTable.Cell("RPC Address")));
table.addRow(new HtmlTable.Row().setHeaderRow().addProperties(headerProperties)
@@ -153,7 +162,9 @@ public class VdsClusterHtmlRenderer {
.addCell(new HtmlTable.Cell("Pending"))
.addCell(new HtmlTable.Cell("Total"))
.addCell(new HtmlTable.Cell("Pending"))
- .addCell(new HtmlTable.Cell("Total")));
+ .addCell(new HtmlTable.Cell("Total"))
+ .addCell(new HtmlTable.Cell("Disk"))
+ .addCell(new HtmlTable.Cell("Memory")));
}
private void renderNodesOneType(
@@ -164,6 +175,7 @@ public class VdsClusterHtmlRenderer {
final ClusterStatsAggregator statsAggregator,
final double minMergeCompletionRatio,
final int maxPrematureCrashes,
+ final Map<String, Double> feedBlockLimits,
final EventLog eventLog,
final String pathPrefix,
final String dominantVtag,
@@ -188,6 +200,7 @@ public class VdsClusterHtmlRenderer {
addPrematureCrashes(maxPrematureCrashes, nodeInfo, row);
addEventsLastWeek(eventLog, currentTime, nodeInfo, row);
addBucketSpacesStats(nodeType, statsAggregator, minMergeCompletionRatio, nodeInfo, row);
+ addResourceUsage(nodeInfo, feedBlockLimits, row);
addStartTime(nodeInfo, row);
addRpcAddress(nodeInfo, row);
@@ -230,6 +243,37 @@ public class VdsClusterHtmlRenderer {
}
}
+ private void addResourceUsage(NodeInfo nodeInfo, Map<String, Double> feedBlockLimits, HtmlTable.Row row) {
+ if (nodeInfo.isDistributor()) {
+ row.addCell(new HtmlTable.Cell("-").addProperties(CENTERED_PROPERTY));
+ row.addCell(new HtmlTable.Cell("-").addProperties(CENTERED_PROPERTY));
+ return;
+ }
+ addSingleResourceUsageCell(nodeInfo, "disk", feedBlockLimits, row);
+ addSingleResourceUsageCell(nodeInfo, "memory", feedBlockLimits, row);
+ }
+
+ private void addSingleResourceUsageCell(NodeInfo nodeInfo, String resourceType,
+ Map<String, Double> feedBlockLimits, HtmlTable.Row row)
+ {
+ var hostInfo = nodeInfo.getHostInfo();
+ var usages = hostInfo.getContentNode().getResourceUsage();
+
+ var usage = usages.get(resourceType);
+ if (usage != null && usage.getUsage() != null) {
+ row.addCell(new HtmlTable.Cell(String.format("%.2f", usage.getUsage() * 100.0)));
+ double limit = feedBlockLimits.getOrDefault(resourceType, 1.0);
+ // Mark as error if limit exceeded, warn if within 5% of exceeding
+ if (usage.getUsage() > limit) {
+ row.getLastCell().addProperties(ERROR_PROPERTY);
+ } else if (usage.getUsage() > (limit - 0.05)) {
+ row.getLastCell().addProperties(WARNING_PROPERTY);
+ }
+ } else {
+ row.addCell(new HtmlTable.Cell("-").addProperties(CENTERED_PROPERTY));
+ }
+ }
+
private void addEventsLastWeek(EventLog eventLog, long currentTime, NodeInfo nodeInfo, HtmlTable.Row row) {
int nodeEvents = eventLog.getNodeEventsSince(nodeInfo.getNode(),
currentTime - eventLog.getRecentTimePeriod());