You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by yu...@apache.org on 2016/08/25 16:58:47 UTC
cassandra git commit: json/yaml output format for nodetool
compactionhistory
Repository: cassandra
Updated Branches:
refs/heads/trunk df0cd441e -> 768e717d7
json/yaml output format for nodetool compactionhistory
patch by Masataka Yamaguchi; reviewed by yukim for CASSANDRA-12486
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/768e717d
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/768e717d
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/768e717d
Branch: refs/heads/trunk
Commit: 768e717d7ab8c629d7623c619aff1ef99ca8eaf8
Parents: df0cd44
Author: Masataka Yamaguchi <p-...@yahoo-corp.jp>
Authored: Tue Aug 23 11:27:20 2016 +0900
Committer: Yuki Morishita <yu...@apache.org>
Committed: Thu Aug 25 11:57:40 2016 -0500
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../tools/nodetool/CompactionHistory.java | 105 +++-------------
.../nodetool/stats/CompactionHistoryHolder.java | 126 +++++++++++++++++++
.../stats/CompactionHistoryPrinter.java | 81 ++++++++++++
4 files changed, 223 insertions(+), 90 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/768e717d/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 483db71..9d69dfe 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
3.10
+ * json/yaml output format for nodetool compactionhistory (CASSANDRA-12486)
* Retry all internode messages once after a connection is
closed and reopened (CASSANDRA-12192)
* Add support to rebuild from targeted replica (CASSANDRA-9875)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/768e717d/src/java/org/apache/cassandra/tools/nodetool/CompactionHistory.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/nodetool/CompactionHistory.java b/src/java/org/apache/cassandra/tools/nodetool/CompactionHistory.java
index 40c6887..8d24845 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/CompactionHistory.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/CompactionHistory.java
@@ -17,107 +17,32 @@
*/
package org.apache.cassandra.tools.nodetool;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import javax.management.openmbean.TabularData;
-
import io.airlift.command.Command;
-
+import io.airlift.command.Option;
import org.apache.cassandra.tools.NodeProbe;
import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
-import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
-
-import static com.google.common.collect.Iterables.toArray;
+import org.apache.cassandra.tools.nodetool.stats.CompactionHistoryHolder;
+import org.apache.cassandra.tools.nodetool.stats.CompactionHistoryPrinter;
+import org.apache.cassandra.tools.nodetool.stats.StatsHolder;
+import org.apache.cassandra.tools.nodetool.stats.StatsPrinter;
@Command(name = "compactionhistory", description = "Print history of compaction")
public class CompactionHistory extends NodeToolCmd
{
+ @Option(title = "format",
+ name = {"-F", "--format"},
+ description = "Output format (json, yaml)")
+ private String outputFormat = "";
+
@Override
public void execute(NodeProbe probe)
{
- System.out.println("Compaction History: ");
-
- TabularData tabularData = probe.getCompactionHistory();
- if (tabularData.isEmpty())
- {
- System.out.printf("There is no compaction history");
- return;
- }
-
- TableBuilder table = new TableBuilder();
- List<String> indexNames = tabularData.getTabularType().getIndexNames();
- table.add(toArray(indexNames, String.class));
-
- Set<?> values = tabularData.keySet();
- List<CompactionHistoryRow> chr = new ArrayList<>();
- for (Object eachValue : values)
- {
- List<?> value = (List<?>) eachValue;
- CompactionHistoryRow chc = new CompactionHistoryRow((String)value.get(0),
- (String)value.get(1),
- (String)value.get(2),
- (Long)value.get(3),
- (Long)value.get(4),
- (Long)value.get(5),
- (String)value.get(6));
- chr.add(chc);
- }
- Collections.sort(chr);
- for (CompactionHistoryRow eachChc : chr)
- {
- table.add(eachChc.getAllAsArray());
- }
- table.printTo(System.out);
- }
-
- /**
- * Allows the Compaction History output to be ordered by 'compactedAt' - that is the
- * time at which compaction finished.
- */
- private static class CompactionHistoryRow implements Comparable<CompactionHistoryRow>
- {
- private final String id;
- private final String ksName;
- private final String cfName;
- private final long compactedAt;
- private final long bytesIn;
- private final long bytesOut;
- private final String rowMerged;
-
- CompactionHistoryRow(String id, String ksName, String cfName, long compactedAt, long bytesIn, long bytesOut, String rowMerged)
- {
- this.id = id;
- this.ksName = ksName;
- this.cfName = cfName;
- this.compactedAt = compactedAt;
- this.bytesIn = bytesIn;
- this.bytesOut = bytesOut;
- this.rowMerged = rowMerged;
- }
-
- public int compareTo(CompactionHistoryRow chc)
- {
- return Long.signum(chc.compactedAt - this.compactedAt);
- }
-
- public String[] getAllAsArray()
+ if (!outputFormat.isEmpty() && !"json".equals(outputFormat) && !"yaml".equals(outputFormat))
{
- String[] obj = new String[7];
- obj[0] = this.id;
- obj[1] = this.ksName;
- obj[2] = this.cfName;
- Instant instant = Instant.ofEpochMilli(this.compactedAt);
- LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
- obj[3] = ldt.toString();
- obj[4] = Long.toString(this.bytesIn);
- obj[5] = Long.toString(this.bytesOut);
- obj[6] = this.rowMerged;
- return obj;
+ throw new IllegalArgumentException("arguments for -F are json,yaml only.");
}
+ StatsHolder data = new CompactionHistoryHolder(probe);
+ StatsPrinter printer = CompactionHistoryPrinter.from(outputFormat);
+ printer.print(data, System.out);
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/768e717d/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryHolder.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryHolder.java b/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryHolder.java
new file mode 100644
index 0000000..8799ffb
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryHolder.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.tools.nodetool.stats;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.management.openmbean.TabularData;
+
+import org.apache.cassandra.tools.NodeProbe;
+
+public class CompactionHistoryHolder implements StatsHolder
+{
+ public final NodeProbe probe;
+ public List<String> indexNames;
+
+ public CompactionHistoryHolder(NodeProbe probe)
+ {
+ this.probe = probe;
+ }
+
+ /**
+ * Allows the Compaction History output to be ordered by 'compactedAt' - that is the
+ * time at which compaction finished.
+ */
+ private static class CompactionHistoryRow implements Comparable<CompactionHistoryHolder.CompactionHistoryRow>
+ {
+ private final String id;
+ private final String ksName;
+ private final String cfName;
+ private final long compactedAt;
+ private final long bytesIn;
+ private final long bytesOut;
+ private final String rowMerged;
+
+ CompactionHistoryRow(String id, String ksName, String cfName, long compactedAt, long bytesIn, long bytesOut, String rowMerged)
+ {
+ this.id = id;
+ this.ksName = ksName;
+ this.cfName = cfName;
+ this.compactedAt = compactedAt;
+ this.bytesIn = bytesIn;
+ this.bytesOut = bytesOut;
+ this.rowMerged = rowMerged;
+ }
+
+ public int compareTo(CompactionHistoryHolder.CompactionHistoryRow chr)
+ {
+ return Long.signum(chr.compactedAt - this.compactedAt);
+ }
+
+ private HashMap<String, Object> getAllAsMap()
+ {
+ HashMap<String, Object> compaction = new HashMap<>();
+ compaction.put("id", this.id);
+ compaction.put("keyspace_name", this.ksName);
+ compaction.put("columnfamily_name", this.cfName);
+ Instant instant = Instant.ofEpochMilli(this.compactedAt);
+ LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+ compaction.put("compacted_at", ldt.toString());
+ compaction.put("bytes_in", this.bytesIn);
+ compaction.put("bytes_out", this.bytesOut);
+ compaction.put("rows_merged", this.rowMerged);
+ return compaction;
+ }
+ }
+
+ @Override
+ public Map<String, Object> convert2Map()
+ {
+ HashMap<String, Object> result = new HashMap<>();
+ ArrayList<Map<String, Object>> compactions = new ArrayList<>();
+
+ TabularData tabularData = probe.getCompactionHistory();
+ this.indexNames = tabularData.getTabularType().getIndexNames();
+
+ if (tabularData.isEmpty()) return result;
+
+ List<CompactionHistoryHolder.CompactionHistoryRow> chrList = new ArrayList<>();
+ Set<?> values = tabularData.keySet();
+ for (Object eachValue : values)
+ {
+ List<?> value = (List<?>) eachValue;
+ CompactionHistoryHolder.CompactionHistoryRow chr = new CompactionHistoryHolder.CompactionHistoryRow(
+ (String)value.get(0),
+ (String)value.get(1),
+ (String)value.get(2),
+ (Long)value.get(3),
+ (Long)value.get(4),
+ (Long)value.get(5),
+ (String)value.get(6)
+ );
+ chrList.add(chr);
+ }
+
+ Collections.sort(chrList);
+ for (CompactionHistoryHolder.CompactionHistoryRow chr : chrList)
+ {
+ compactions.add(chr.getAllAsMap());
+ }
+ result.put("CompactionHistory", compactions);
+ return result;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/768e717d/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryPrinter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryPrinter.java b/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryPrinter.java
new file mode 100644
index 0000000..97ed1c4
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/CompactionHistoryPrinter.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.tools.nodetool.stats;
+
+import java.io.PrintStream;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
+
+import static com.google.common.collect.Iterables.toArray;
+
+public class CompactionHistoryPrinter
+{
+ public static StatsPrinter from(String format)
+ {
+ switch (format)
+ {
+ case "json":
+ return new StatsPrinter.JsonPrinter();
+ case "yaml":
+ return new StatsPrinter.YamlPrinter();
+ default:
+ return new DefaultPrinter();
+ }
+
+ }
+
+ public static class DefaultPrinter implements StatsPrinter<CompactionHistoryHolder>
+ {
+ @Override
+ public void print(CompactionHistoryHolder data, PrintStream out)
+ {
+
+ out.println("Compaction History: ");
+ Map<String, Object> convertData = data.convert2Map();
+ List<Object> compactionHistories = convertData.get("CompactionHistory") instanceof List<?> ? (List)convertData.get("CompactionHistory") : Collections.emptyList();
+ List<String> indexNames = data.indexNames;
+
+ if (compactionHistories.size() == 0) {
+ out.printf("There is no compaction history");
+ return;
+ }
+
+ TableBuilder table = new TableBuilder();
+
+ table.add(toArray(indexNames, String.class));
+ for (Object chr : compactionHistories)
+ {
+ Map value = chr instanceof Map<?, ?> ? (Map)chr : Collections.emptyMap();
+ String[] obj = new String[7];
+ obj[0] = (String)value.get("id");
+ obj[1] = (String)value.get("keyspace_name");
+ obj[2] = (String)value.get("columnfamily_name");
+ obj[3] = (String)value.get("compacted_at");
+ obj[4] = value.get("bytes_in").toString();
+ obj[5] = value.get("bytes_out").toString();
+ obj[6] = (String)value.get("rows_merged");
+ table.add(obj);
+ }
+ table.printTo(out);
+ }
+ }
+}