package com.ldbc.driver.runtime.metrics;
import com.google.common.collect.Lists;
import com.ldbc.driver.runtime.ConcurrentErrorReporter;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.util.DefaultPrettyPrinter;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class WorkloadResultsSnapshot
{
@JsonProperty( value = "all_metrics" )
private List<OperationMetricsSnapshot> metrics;
@JsonProperty( value = "format_version" )
private int formatVersion = 3;
@JsonProperty( value = "unit" )
private TimeUnit unit;
@JsonProperty( value = "start_time" )
private long startTimeAsUnit;
@JsonProperty( value = "latest_finish_time" )
private long latestFinishTimeAsUnit;
@JsonProperty( value = "total_duration" )
private long totalRunDurationAsUnit;
@JsonProperty( value = "total_count" )
private long operationCount;
@JsonProperty( value = "throughput" )
private double throughput;
public static WorkloadResultsSnapshot fromJson( File jsonFile ) throws IOException
{
return new ObjectMapper().readValue( jsonFile, WorkloadResultsSnapshot.class );
}
public static WorkloadResultsSnapshot fromJson( String jsonString ) throws IOException
{
return new ObjectMapper().readValue( jsonString, WorkloadResultsSnapshot.class );
}
private WorkloadResultsSnapshot()
{
}
public WorkloadResultsSnapshot( Map<String,OperationMetricsSnapshot> metrics,
long startTimeAsMilli,
long latestFinishTimeAsMilli,
long operationCount,
TimeUnit unit )
{
this.metrics = Lists.newArrayList( metrics.values() );
Collections.sort( this.metrics, new OperationTypeMetricsManager.OperationMetricsNameComparator() );
this.startTimeAsUnit = unit.convert( startTimeAsMilli, TimeUnit.MILLISECONDS );
this.latestFinishTimeAsUnit = unit.convert( latestFinishTimeAsMilli, TimeUnit.MILLISECONDS );
this.totalRunDurationAsUnit = unit.convert( latestFinishTimeAsMilli - startTimeAsMilli, TimeUnit.MILLISECONDS );
this.throughput = 1000 * (operationCount / (double) unit.toMillis( totalRunDurationAsUnit ));
this.operationCount = operationCount;
this.unit = unit;
}
@JsonProperty( value = "all_metrics" )
public List<OperationMetricsSnapshot> allMetrics()
{
return metrics;
}
@JsonProperty( value = "all_metrics" )
private void setAllMetrics( List<OperationMetricsSnapshot> metrics )
{
this.metrics = metrics;
Collections.sort( metrics, new OperationTypeMetricsManager.OperationMetricsNameComparator() );
}
public long startTimeAsMilli()
{
return unit.toMillis( startTimeAsUnit );
}
public long latestFinishTimeAsMilli()
{
return unit.toMillis( latestFinishTimeAsUnit );
}
public long totalRunDurationAsNano()
{
return unit.toNanos( totalRunDurationAsUnit );
}
public long totalOperationCount()
{
return operationCount;
}
public double throughput()
{
return throughput;
}
public String toJson()
{
try
{
return new ObjectMapper().writer( new DefaultPrettyPrinter() ).writeValueAsString( this );
}
catch ( Exception e )
{
System.out.println( ConcurrentErrorReporter.stackTraceToString( e ) );
throw new RuntimeException( "Unable to generate parameter values string", e );
}
}
@Override
public String toString()
{
return "WorkloadResultsSnapshot{" +
"metrics=" + metrics +
", unit=" + unit +
", startTimeAsUnit=" + startTimeAsUnit +
", latestFinishTimeAsUnit=" + latestFinishTimeAsUnit +
", totalRunDurationAsUnit=" + totalRunDurationAsUnit +
", operationCount=" + operationCount +
", throughput=" + throughput +
'}';
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{ return true; }
if ( o == null || getClass() != o.getClass() )
{ return false; }
WorkloadResultsSnapshot that = (WorkloadResultsSnapshot) o;
if ( latestFinishTimeAsUnit != that.latestFinishTimeAsUnit )
{ return false; }
if ( operationCount != that.operationCount )
{ return false; }
if ( startTimeAsUnit != that.startTimeAsUnit )
{ return false; }
if ( totalRunDurationAsUnit != that.totalRunDurationAsUnit )
{ return false; }
if ( metrics != null ? !metrics.equals( that.metrics ) : that.metrics != null )
{ return false; }
if ( unit != that.unit )
{ return false; }
return true;
}
@Override
public int hashCode()
{
int result = metrics != null ? metrics.hashCode() : 0;
result = 31 * result + (unit != null ? unit.hashCode() : 0);
result = 31 * result + (int) (startTimeAsUnit ^ (startTimeAsUnit >>> 32));
result = 31 * result + (int) (latestFinishTimeAsUnit ^ (latestFinishTimeAsUnit >>> 32));
result = 31 * result + (int) (totalRunDurationAsUnit ^ (totalRunDurationAsUnit >>> 32));
result = 31 * result + (int) (operationCount ^ (operationCount >>> 32));
return result;
}
}