package com.ldbc.driver.runtime.metrics; import com.google.common.collect.Lists; import com.ldbc.driver.temporal.TemporalUtil; import java.text.DecimalFormat; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; public class SimpleSummaryWorkloadMetricsFormatter implements WorkloadMetricsFormatter { private static final String DEFAULT_NAME = "<no name given>"; private static final String DEFAULT_UNIT = "<no unit given>"; private static final String OFFSET = " "; private static final DecimalFormat INTEGER_FORMATTER = new DecimalFormat( "###,###,###,###" ); private static final DecimalFormat FLOAT_FORMATTER = new DecimalFormat( "###,###,###,##0.00" ); private static final TemporalUtil TEMPORAL_UTIL = new TemporalUtil(); public String format( WorkloadResultsSnapshot workloadResultsSnapshot ) { List<OperationMetricsSnapshot> sortedMetrics = Lists.newArrayList( workloadResultsSnapshot.allMetrics() ); Collections.sort( sortedMetrics, new OperationTypeMetricsManager.OperationMetricsNameComparator() ); int padRightDistance = 40; StringBuilder sb = new StringBuilder(); sb.append( "------------------------------------------------------------------------------\n" ); sb.append( String.format( "%1$-" + padRightDistance + "s", "Operation Count:" ) ).append( INTEGER_FORMATTER.format( workloadResultsSnapshot.totalOperationCount() ) ).append( "\n" ); sb.append( String.format( "%1$-" + padRightDistance + "s", "Duration:" ) ).append( TEMPORAL_UTIL.nanoDurationToString( workloadResultsSnapshot.totalRunDurationAsNano() ) ).append( "\n" ); double opsPerNs = (workloadResultsSnapshot.totalOperationCount() / (double) workloadResultsSnapshot.totalRunDurationAsNano()); double opsPerS = opsPerNs * TimeUnit.SECONDS.toNanos( 1 ); sb.append( String.format( "%1$-" + padRightDistance + "s", "Throughput:" ) ).append( FLOAT_FORMATTER.format( opsPerS ) ).append( " (op/s)\n" ); sb.append( "------------------------------------------------------------------------------\n" ); int namePadRightDistance = 0; int countPadRightDistance = 0; for ( OperationMetricsSnapshot metric : sortedMetrics ) { namePadRightDistance = Math.max( namePadRightDistance, metric.name().length() ); countPadRightDistance = Math.max( countPadRightDistance, Long.toString( metric.count() ).length() ); } for ( OperationMetricsSnapshot metric : sortedMetrics ) { sb.append( formatOneMetricRuntime( OFFSET, metric, namePadRightDistance + 2, countPadRightDistance + 2 ) ); } sb.append( "------------------------------------------------------------------------------\n" ); return sb.toString(); } private String formatOneMetricRuntime( String offset, OperationMetricsSnapshot metric, int namePadRightDistance, int countPadRightDistance ) { String name = (null == metric.name()) ? DEFAULT_NAME : metric.name(); String unit = (null == metric.durationUnit()) ? DEFAULT_UNIT : TEMPORAL_UTIL.abbreviatedTimeUnit( metric.durationUnit() ); StringBuilder sb = new StringBuilder(); sb.append( offset ); sb.append( String.format( "%1$-" + namePadRightDistance + "s", name ) ); sb.append( "Count: " ).append( String.format( "%1$-" + countPadRightDistance + "s", INTEGER_FORMATTER.format( metric.runTimeMetric().count() ) ) ).append( " " ); sb.append( "Mean: " ).append( FLOAT_FORMATTER.format( metric.runTimeMetric().mean() ) ).append( " " ) .append( unit ).append( "\n" ); return sb.toString(); } }