|
|
@@ -51,10 +51,10 @@ import org.elasticsearch.common.xcontent.XContentFactory;
|
|
|
import org.elasticsearch.common.xcontent.XContentParser;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
+import java.util.EnumSet;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Locale;
|
|
|
import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
@@ -262,20 +262,71 @@ public class ClusterState implements ToXContent {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public enum Metric {
|
|
|
+ VERSION("version"),
|
|
|
+ MASTER_NODE("master_node"),
|
|
|
+ BLOCKS("blocks"),
|
|
|
+ NODES("nodes"),
|
|
|
+ METADATA("metadata"),
|
|
|
+ ROUTING_TABLE("routing_table"),
|
|
|
+ CUSTOMS("customs");
|
|
|
+
|
|
|
+ private static Map<String, Metric> valueToEnum;
|
|
|
+
|
|
|
+ static {
|
|
|
+ valueToEnum = new HashMap<>();
|
|
|
+ for (Metric metric : Metric.values()) {
|
|
|
+ valueToEnum.put(metric.value, metric);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private final String value;
|
|
|
+
|
|
|
+ private Metric(String value) {
|
|
|
+ this.value = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static EnumSet<Metric> parseString(String param, boolean ignoreUnknown) {
|
|
|
+ String[] metrics = Strings.splitStringByCommaToArray(param);
|
|
|
+ EnumSet<Metric> result = EnumSet.noneOf(Metric.class);
|
|
|
+ for (String metric : metrics) {
|
|
|
+ if ("_all".equals(metric)) {
|
|
|
+ result = EnumSet.allOf(Metric.class);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Metric m = valueToEnum.get(metric);
|
|
|
+ if (m == null) {
|
|
|
+ if (!ignoreUnknown) {
|
|
|
+ throw new ElasticsearchIllegalArgumentException("Unknown metric [" + metric + "]");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ result.add(m);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String toString() {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
|
|
- Set<String> metrics = Strings.splitStringByCommaToSet(params.param("metric", "_all"));
|
|
|
- boolean isAllMetricsOnly = metrics.size() == 1 && metrics.contains("_all");
|
|
|
+ EnumSet<Metric> metrics = Metric.parseString(params.param("metric", "_all"), true);
|
|
|
|
|
|
- if (isAllMetricsOnly || metrics.contains("version")) {
|
|
|
+ if (metrics.contains(Metric.VERSION)) {
|
|
|
builder.field("version", version);
|
|
|
}
|
|
|
|
|
|
- if (isAllMetricsOnly || metrics.contains("master_node")) {
|
|
|
+ if (metrics.contains(Metric.MASTER_NODE)) {
|
|
|
builder.field("master_node", nodes().masterNodeId());
|
|
|
}
|
|
|
|
|
|
- if (isAllMetricsOnly || metrics.contains("blocks")) {
|
|
|
+ if (metrics.contains(Metric.BLOCKS)) {
|
|
|
builder.startObject("blocks");
|
|
|
|
|
|
if (!blocks().global().isEmpty()) {
|
|
|
@@ -302,7 +353,7 @@ public class ClusterState implements ToXContent {
|
|
|
}
|
|
|
|
|
|
// nodes
|
|
|
- if (isAllMetricsOnly || metrics.contains("nodes")) {
|
|
|
+ if (metrics.contains(Metric.NODES)) {
|
|
|
builder.startObject("nodes");
|
|
|
for (DiscoveryNode node : nodes()) {
|
|
|
builder.startObject(node.id(), XContentBuilder.FieldCaseConversion.NONE);
|
|
|
@@ -321,7 +372,7 @@ public class ClusterState implements ToXContent {
|
|
|
}
|
|
|
|
|
|
// meta data
|
|
|
- if (isAllMetricsOnly || metrics.contains("metadata")) {
|
|
|
+ if (metrics.contains(Metric.METADATA)) {
|
|
|
builder.startObject("metadata");
|
|
|
|
|
|
builder.startObject("templates");
|
|
|
@@ -407,7 +458,7 @@ public class ClusterState implements ToXContent {
|
|
|
}
|
|
|
|
|
|
// routing table
|
|
|
- if (isAllMetricsOnly || metrics.contains("routing_table")) {
|
|
|
+ if (metrics.contains(Metric.ROUTING_TABLE)) {
|
|
|
builder.startObject("routing_table");
|
|
|
builder.startObject("indices");
|
|
|
for (IndexRoutingTable indexRoutingTable : routingTable()) {
|
|
|
@@ -428,7 +479,7 @@ public class ClusterState implements ToXContent {
|
|
|
}
|
|
|
|
|
|
// routing nodes
|
|
|
- if (isAllMetricsOnly || metrics.contains("routing_table")) {
|
|
|
+ if (metrics.contains(Metric.ROUTING_TABLE)) {
|
|
|
builder.startObject("routing_nodes");
|
|
|
builder.startArray("unassigned");
|
|
|
for (ShardRouting shardRouting : readOnlyRoutingNodes().unassigned()) {
|
|
|
@@ -448,8 +499,7 @@ public class ClusterState implements ToXContent {
|
|
|
|
|
|
builder.endObject();
|
|
|
}
|
|
|
-
|
|
|
- if (isAllMetricsOnly || metrics.contains("customs")) {
|
|
|
+ if (metrics.contains(Metric.CUSTOMS)) {
|
|
|
for (ObjectObjectCursor<String, Custom> cursor : customs) {
|
|
|
builder.startObject(cursor.key);
|
|
|
lookupFactorySafe(cursor.key).toXContent(cursor.value, builder, params);
|