package com.ldbc.driver.control;
import com.ldbc.driver.runtime.metrics.SimpleDetailedWorkloadMetricsFormatter;
import com.ldbc.driver.runtime.metrics.SimpleSummaryWorkloadMetricsFormatter;
import com.ldbc.driver.runtime.metrics.WorkloadMetricsFormatter;
import com.ldbc.driver.runtime.metrics.WorkloadResultsSnapshot;
import com.ldbc.driver.runtime.metrics.WorkloadStatusSnapshot;
import com.ldbc.driver.temporal.TemporalUtil;
import org.apache.log4j.Logger;
import java.text.DecimalFormat;
import java.util.concurrent.TimeUnit;
public class Log4jLoggingService implements LoggingService
{
private static final DecimalFormat OPERATION_COUNT_FORMATTER = new DecimalFormat( "###,###,###,###" );
private static final DecimalFormat THROUGHPUT_FORMATTER = new DecimalFormat( "###,###,###,##0.00" );
private final Logger logger;
private final TemporalUtil temporalUtil;
private final boolean detailedStatus;
private final WorkloadMetricsFormatter summaryWorkloadMetricsFormatter;
private final WorkloadMetricsFormatter detailedWorkloadMetricsFormatter;
public Log4jLoggingService( String source, TemporalUtil temporalUtil, boolean detailedStatus )
{
this.logger = Logger.getLogger( source );
this.temporalUtil = temporalUtil;
this.detailedStatus = detailedStatus;
this.summaryWorkloadMetricsFormatter = new SimpleSummaryWorkloadMetricsFormatter();
this.detailedWorkloadMetricsFormatter = new SimpleDetailedWorkloadMetricsFormatter();
}
@Override
public void info( String message )
{
logger.info( message );
}
@Override
public void status(
WorkloadStatusSnapshot status,
RecentThroughputAndDuration recentThroughputAndDuration,
long globalCompletionTimeAsMilli )
{
String statusString;
statusString = (detailedStatus) ?
formatWithGct(
status.operationCount(),
status.runDurationAsMilli(),
status.durationSinceLastMeasurementAsMilli(),
status.throughput(),
recentThroughputAndDuration.throughput(),
recentThroughputAndDuration.duration(),
globalCompletionTimeAsMilli ) :
formatWithoutGct(
status.operationCount(),
status.runDurationAsMilli(),
status.durationSinceLastMeasurementAsMilli(),
status.throughput(),
recentThroughputAndDuration.throughput(),
recentThroughputAndDuration.duration() );
logger.info( statusString );
}
@Override
public void summaryResult( WorkloadResultsSnapshot workloadResultsSnapshot )
{
logger.info( "\n" + summaryWorkloadMetricsFormatter.format( workloadResultsSnapshot ) );
}
@Override
public void detailedResult( WorkloadResultsSnapshot workloadResultsSnapshot )
{
logger.info( "\n" + detailedWorkloadMetricsFormatter.format( workloadResultsSnapshot ) );
}
private String formatWithoutGct( long operationCount, long runDurationAsMilli,
long durationSinceLastMeasurementAsMilli, double throughput, double recentThroughput,
long recentDurationAsMilli )
{
return format( operationCount, runDurationAsMilli, durationSinceLastMeasurementAsMilli, throughput,
recentThroughput, recentDurationAsMilli, null ).toString();
}
private String formatWithGct( long operationCount, long runDurationAsMilli,
long durationSinceLastMeasurementAsMilli, double throughput, double recentThroughput,
long recentDurationAsMilli, long gctAsMilli )
{
return format( operationCount, runDurationAsMilli, durationSinceLastMeasurementAsMilli, throughput,
recentThroughput, recentDurationAsMilli, gctAsMilli ).toString();
}
private StringBuffer format( long operationCount, long runDurationAsMilli, long durationSinceLastMeasurementAsMilli,
double throughput, double recentThroughput, long recentDurationAsMilli, Long gctAsMilli )
{
StringBuffer sb = new StringBuffer();
sb.append( "Runtime [" )
.append( (-1 == runDurationAsMilli) ? "--" : temporalUtil.milliDurationToString( runDurationAsMilli ) )
.append( "], " );
sb.append( "Operations [" ).append( OPERATION_COUNT_FORMATTER.format( operationCount ) ).append( "], " );
sb.append( "Last [" ).append( (-1 == durationSinceLastMeasurementAsMilli) ? "--" : temporalUtil
.milliDurationToString( durationSinceLastMeasurementAsMilli ) ).append( "], " );
sb.append( "Throughput" );
sb.append( " (Total) [" ).append( THROUGHPUT_FORMATTER.format( throughput ) ).append( "]" );
sb.append( " (Last " ).append( TimeUnit.MILLISECONDS.toSeconds( recentDurationAsMilli ) ).append( "s) [" )
.append( THROUGHPUT_FORMATTER.format( recentThroughput ) ).append( "]" );
if ( null != gctAsMilli )
{
sb.append(
", GCT: " + ((-1 == gctAsMilli) ? "--" : temporalUtil.milliTimeToDateTimeString( gctAsMilli )) );
}
return sb;
}
}