Skip to content

Commit

Permalink
Make nodetool tablestats use number of significant digits for time an…
Browse files Browse the repository at this point in the history
…d average values consistently

patch by Leo Toff; reviewed by Stefan Miklosovic and Brandon Williams for CASSANDRA-19015
  • Loading branch information
zaaath authored and smiklosovic committed Dec 1, 2023
1 parent b45a0e0 commit ac201d2
Show file tree
Hide file tree
Showing 8 changed files with 129 additions and 55 deletions.
1 change: 1 addition & 0 deletions CHANGES.txt
@@ -1,4 +1,5 @@
5.1
* Make nodetool tablestats use number of significant digits for time and average values consistently (CASSANDRA-19015)
* Upgrade jackson to 2.15.3 and snakeyaml to 2.1 (CASSANDRA-18875)
* Transactional Cluster Metadata [CEP-21] (CASSANDRA-18330)
* Add ELAPSED command to cqlsh (CASSANDRA-18861)
Expand Down
Expand Up @@ -37,7 +37,7 @@ public class StatsTable
public String spaceUsedBySnapshotsTotal;
public boolean offHeapUsed = false;
public String offHeapMemoryUsedTotal;
public Object sstableCompressionRatio;
public double sstableCompressionRatio;
public Object numberOfPartitionsEstimate;
public Object memtableCellCount;
public String memtableDataSize;
Expand All @@ -51,7 +51,7 @@ public class StatsTable
public double localWriteLatencyMs;
public Object pendingFlushes;
public Object bloomFilterFalsePositives;
public Object bloomFilterFalseRatio;
public double bloomFilterFalseRatio;
public String bloomFilterSpaceUsed;
public boolean bloomFilterOffHeapUsed = false;
public String bloomFilterOffHeapMemoryUsed;
Expand Down
Expand Up @@ -139,8 +139,8 @@ else if (sortKey.equals("bloom_filter_false_positives"))
}
else if (sortKey.equals("bloom_filter_false_ratio"))
{
result = compareDoubles((Double) stx.bloomFilterFalseRatio,
(Double) sty.bloomFilterFalseRatio);
result = compareDoubles(stx.bloomFilterFalseRatio,
sty.bloomFilterFalseRatio);
}
else if (sortKey.equals("bloom_filter_off_heap_memory_used"))
{
Expand Down Expand Up @@ -326,8 +326,8 @@ else if (sortKey.equals("space_used_total"))
}
else if (sortKey.equals("sstable_compression_ratio"))
{
result = compareDoubles((Double) stx.sstableCompressionRatio,
(Double) sty.sstableCompressionRatio);
result = compareDoubles(stx.sstableCompressionRatio,
sty.sstableCompressionRatio);
}
else if (sortKey.equals("sstable_count"))
{
Expand Down
Expand Up @@ -273,6 +273,8 @@ private void initializeKeyspaces(NodeProbe probe, boolean ignore, List<String> t
Long bytesRepaired = null;
Long bytesUnrepaired = null;
Long bytesPendingRepair = null;
Double sstableCompressionRatio = null;
Double bloomFilterFalseRatio = null;

try
{
Expand All @@ -285,6 +287,8 @@ private void initializeKeyspaces(NodeProbe probe, boolean ignore, List<String> t
bytesRepaired = (Long) probe.getColumnFamilyMetric(keyspaceName, tableName, "BytesRepaired");
bytesUnrepaired = (Long) probe.getColumnFamilyMetric(keyspaceName, tableName, "BytesUnrepaired");
bytesPendingRepair = (Long) probe.getColumnFamilyMetric(keyspaceName, tableName, "BytesPendingRepair");
sstableCompressionRatio = (Double) probe.getColumnFamilyMetric(keyspaceName, tableName, "CompressionRatio");
bloomFilterFalseRatio = (Double) probe.getColumnFamilyMetric(keyspaceName, tableName, "RecentBloomFilterFalseRatio");
}
catch (RuntimeException e)
{
Expand Down Expand Up @@ -314,7 +318,7 @@ private void initializeKeyspaces(NodeProbe probe, boolean ignore, List<String> t
statsTable.bytesUnrepaired = bytesUnrepaired != null ? bytesUnrepaired : 0;
statsTable.bytesPendingRepair = bytesPendingRepair != null ? bytesPendingRepair : 0;

statsTable.sstableCompressionRatio = probe.getColumnFamilyMetric(keyspaceName, tableName, "CompressionRatio");
statsTable.sstableCompressionRatio = sstableCompressionRatio != null ? sstableCompressionRatio : Double.NaN;
Object estimatedPartitionCount = probe.getColumnFamilyMetric(keyspaceName, tableName, "EstimatedPartitionCount");
if (Long.valueOf(-1L).equals(estimatedPartitionCount))
{
Expand Down Expand Up @@ -347,7 +351,8 @@ private void initializeKeyspaces(NodeProbe probe, boolean ignore, List<String> t
statsTable.pendingFlushes = probe.getColumnFamilyMetric(keyspaceName, tableName, "PendingFlushes");

statsTable.bloomFilterFalsePositives = probe.getColumnFamilyMetric(keyspaceName, tableName, "BloomFilterFalsePositives");
statsTable.bloomFilterFalseRatio = probe.getColumnFamilyMetric(keyspaceName, tableName, "RecentBloomFilterFalseRatio");

statsTable.bloomFilterFalseRatio = bloomFilterFalseRatio != null ? bloomFilterFalseRatio : Double.NaN;
statsTable.bloomFilterSpaceUsed = format((Long) probe.getColumnFamilyMetric(keyspaceName, tableName, "BloomFilterDiskSpaceUsed"), humanReadable);

if (bloomFilterOffHeapSize != null)
Expand Down
Expand Up @@ -62,9 +62,9 @@ public void print(TableStatsHolder data, PrintStream out)
// print each keyspace's information
out.println("Keyspace: " + keyspace.name);
out.println("\tRead Count: " + keyspace.readCount);
out.println("\tRead Latency: " + keyspace.readLatency() + " ms");
out.println("\tRead Latency: " + FBUtilities.prettyPrintLatency(keyspace.readLatency()));
out.println("\tWrite Count: " + keyspace.writeCount);
out.println("\tWrite Latency: " + keyspace.writeLatency() + " ms");
out.println("\tWrite Latency: " + FBUtilities.prettyPrintLatency(keyspace.writeLatency()));
out.println("\tPending Flushes: " + keyspace.pendingFlushes);

// print each table's information
Expand Down Expand Up @@ -102,7 +102,7 @@ protected void printStatsTable(StatsTable table, String tableDisplayName, String

if (table.offHeapUsed)
out.println(indent + "Off heap memory used (total): " + table.offHeapMemoryUsedTotal);
out.printf(indent + "SSTable Compression Ratio: %01.5f%n", table.sstableCompressionRatio);
out.println(indent + "SSTable Compression Ratio: " + FBUtilities.prettyPrintRatio(table.sstableCompressionRatio));
out.println(indent + "Number of partitions (estimate): " + table.numberOfPartitionsEstimate);
out.println(indent + "Memtable cell count: " + table.memtableCellCount);
out.println(indent + "Memtable data size: " + table.memtableDataSize);
Expand All @@ -112,11 +112,11 @@ protected void printStatsTable(StatsTable table, String tableDisplayName, String
out.println(indent + "Memtable switch count: " + table.memtableSwitchCount);
out.println(indent + "Speculative retries: " + table.speculativeRetries);
out.println(indent + "Local read count: " + table.localReadCount);
out.printf(indent + "Local read latency: %01.3f ms%n", table.localReadLatencyMs);
out.println(indent + "Local read latency: " + FBUtilities.prettyPrintLatency(table.localReadLatencyMs));
out.println(indent + "Local write count: " + table.localWriteCount);
out.printf(indent + "Local write latency: %01.3f ms%n", table.localWriteLatencyMs);
out.println(indent + "Local write latency: " + FBUtilities.prettyPrintLatency(table.localWriteLatencyMs));

out.printf(indent + "Local read/write ratio: %01.5f%n", table.localReadWriteRatio);
out.println(indent + "Local read/write ratio: " + FBUtilities.prettyPrintRatio(table.localReadWriteRatio));

out.println(indent + "Pending flushes: " + table.pendingFlushes);
out.println(indent + "Percent repaired: " + table.percentRepaired);
Expand All @@ -126,7 +126,7 @@ protected void printStatsTable(StatsTable table, String tableDisplayName, String
out.println(indent +"Bytes pending repair: " + FBUtilities.prettyPrintMemory(table.bytesPendingRepair));

out.println(indent + "Bloom filter false positives: " + table.bloomFilterFalsePositives);
out.printf(indent + "Bloom filter false ratio: %01.5f%n", table.bloomFilterFalseRatio);
out.println(indent + "Bloom filter false ratio: " + FBUtilities.prettyPrintRatio(table.bloomFilterFalseRatio));
out.println(indent + "Bloom filter space used: " + table.bloomFilterSpaceUsed);

if (table.bloomFilterOffHeapUsed)
Expand All @@ -139,11 +139,13 @@ protected void printStatsTable(StatsTable table, String tableDisplayName, String
out.println(indent + "Compacted partition minimum bytes: " + table.compactedPartitionMinimumBytes);
out.println(indent + "Compacted partition maximum bytes: " + table.compactedPartitionMaximumBytes);
out.println(indent + "Compacted partition mean bytes: " + table.compactedPartitionMeanBytes);
out.println(indent + "Average live cells per slice (last five minutes): " + table.averageLiveCellsPerSliceLastFiveMinutes);
out.println(indent + "Average live cells per slice (last five minutes): " +
FBUtilities.prettyPrintAverage(table.averageLiveCellsPerSliceLastFiveMinutes));
out.println(indent + "Maximum live cells per slice (last five minutes): " + table.maximumLiveCellsPerSliceLastFiveMinutes);
out.println(indent + "Average tombstones per slice (last five minutes): " + table.averageTombstonesPerSliceLastFiveMinutes);
out.println(indent + "Average tombstones per slice (last five minutes): " +
FBUtilities.prettyPrintAverage(table.averageTombstonesPerSliceLastFiveMinutes));
out.println(indent + "Maximum tombstones per slice (last five minutes): " + table.maximumTombstonesPerSliceLastFiveMinutes);
out.printf(indent + "Droppable tombstone ratio: %01.5f%n", table.droppableTombstoneRatio);
out.println(indent + "Droppable tombstone ratio: " + FBUtilities.prettyPrintRatio(table.droppableTombstoneRatio));
if (table.isInCorrectLocation != null)
out.println(indent + "SSTables in correct location: " + table.isInCorrectLocation);
if (table.topSizePartitions != null && !table.topSizePartitions.isEmpty())
Expand Down
31 changes: 31 additions & 0 deletions src/java/org/apache/cassandra/utils/FBUtilities.java
Expand Up @@ -890,6 +890,37 @@ public static String prettyPrintMemory(long size)
return prettyPrintMemory(size, "");
}

/**
* Formats a latency value in milliseconds for display, appending an "ms" suffix.
* The formatted output is rounded to three decimal places.
* For example, "5000.000 ms", "100.000 ms", "0.050 ms", "0.000 ms", "NaN ms".
* @param latency Latency in milliseconds to print.
*/
public static String prettyPrintLatency(double latency)
{
return String.format("%.3f ms", latency);
}

/**
* Formats a ratio value for display, rounds it to three decimal places.
* For example, "10.000", "1.000", "0.050", "0.001", "0.000", "NaN".
* @param ratio Ratio to print.
*/
public static String prettyPrintRatio(double ratio)
{
return String.format("%.3f", ratio);
}

/**
* Formats an average value for display, rounds it to two decimal places.
* For example, "100500.00", "1.50", "0.05", "0.00", "NaN".
* @param average Average value to print.
*/
public static String prettyPrintAverage(double average)
{
return String.format("%.2f", average);
}

/**
* Convert the given size in bytes to a human-readable value using binary (i.e. 2^10-based) modifiers.
* For example, 1.000KiB, 2.100GiB etc., up to 8.000 EiB.
Expand Down

0 comments on commit ac201d2

Please sign in to comment.