Skip to content

Commit

Permalink
Fixes and improvements (#41)
Browse files Browse the repository at this point in the history
  • Loading branch information
tonyredondo committed Oct 9, 2023
1 parent aae655e commit 2769b76
Show file tree
Hide file tree
Showing 12 changed files with 257 additions and 117 deletions.
2 changes: 1 addition & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>0.1.5</Version>
<Version>0.1.6</Version>
<Authors>Tony Redondo, Grégory Léocadie</Authors>
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
17 changes: 15 additions & 2 deletions src/TimeItSharp.Common/Assertors/DefaultAssertor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,22 @@ public override AssertResponse ExecutionAssertion(in AssertionData data)
{
_sbuilder.AppendLine($"ExitCode: {data.ExitCode}");
_sbuilder.AppendLine("Standard Error: ");
_sbuilder.AppendLine(string.IsNullOrEmpty(data.StandardError) ? "<null>" : data.StandardError);
var stdErr = data.StandardError ?? string.Empty;
if (stdErr.Length > 1024)
{
stdErr = "..." + stdErr[^1024..];
}

_sbuilder.AppendLine(string.IsNullOrEmpty(stdErr) ? "<null>" : stdErr);

_sbuilder.AppendLine("Standard Output: ");
_sbuilder.AppendLine(string.IsNullOrEmpty(data.StandardOutput) ? "<null>" : data.StandardOutput);
var stdOut = data.StandardOutput ?? string.Empty;
if (stdOut.Length > 512)
{
stdOut = "..." + stdOut[^512..];
}

_sbuilder.AppendLine(string.IsNullOrEmpty(stdOut) ? "<null>" : stdOut);
var message = _sbuilder.ToString();
_sbuilder.Clear();
_consecutiveErrorCount++;
Expand Down
76 changes: 58 additions & 18 deletions src/TimeItSharp.Common/Exporters/ConsoleExporter.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using MathNet.Numerics.Statistics;
using System.Globalization;
using MathNet.Numerics.Statistics;
using Spectre.Console;
using TimeItSharp.Common.Results;
using Status = TimeItSharp.Common.Results.Status;
Expand All @@ -18,33 +19,27 @@ public void Initialize(InitOptions options)
_options = options;
}

public void Export(IEnumerable<ScenarioResult> results)
public void Export(TimeitResult results)
{
if (_options.Configuration is null)
{
AnsiConsole.MarkupLine("[red bold]Configuration is missing.[/]");
return;
}

// We make sure we are enumerating at least 1 time.
if (results is not List<ScenarioResult>)
{
results = results.ToList();
}

// ****************************************
// Results table
AnsiConsole.MarkupLine("[aqua bold underline]### Results:[/]");
var resultsTable = new Table()
.MarkdownBorder();

// Add columns
resultsTable.AddColumns(results.Select(r => new TableColumn($"[dodgerblue1 bold]{r.Name}[/]").Centered()).ToArray());
resultsTable.AddColumns(results.Scenarios.Select(r => new TableColumn($"[dodgerblue1 bold]{r.Name}[/]").Centered()).ToArray());

// Add rows
for (var i = 0; i < _options.Configuration.Count; i++)
{
resultsTable.AddRow(results.Select(r =>
resultsTable.AddRow(results.Scenarios.Select(r =>
{
if (i < r.Durations.Count)
{
Expand All @@ -65,13 +60,13 @@ public void Export(IEnumerable<ScenarioResult> results)
.MarkdownBorder();

// Add columns
outliersTable.AddColumns(results.Select(r => new TableColumn($"[dodgerblue1 bold]{r.Name}[/]").Centered()).ToArray());
outliersTable.AddColumns(results.Scenarios.Select(r => new TableColumn($"[dodgerblue1 bold]{r.Name}[/]").Centered()).ToArray());

// Add rows
var maxOutliersCount = results.Select(r => r.Outliers.Count).Max();
var maxOutliersCount = results.Scenarios.Select(r => r.Outliers.Count).Max();
for (var i = 0; i < maxOutliersCount; i++)
{
outliersTable.AddRow(results.Select(r =>
outliersTable.AddRow(results.Scenarios.Select(r =>
{
if (i < r.Outliers.Count)
{
Expand All @@ -91,7 +86,7 @@ public void Export(IEnumerable<ScenarioResult> results)
var summaryTable = new Table()
.MarkdownBorder();

var additionalMetrics = results
var additionalMetrics = results.Scenarios
.SelectMany(s => s.AdditionalMetrics.Select(item => new { item.Key, item.Value, ScenarioResult = s }))
.GroupBy(item => item.Key)
.ToList();
Expand Down Expand Up @@ -122,7 +117,7 @@ public void Export(IEnumerable<ScenarioResult> results)
summaryTable.AddColumns(columnList.ToArray());

// Add rows
var resultsList = results.ToList();
var resultsList = results.Scenarios.ToList();
for (var idx = 0; idx < resultsList.Count; idx++)
{
var result = resultsList[idx];
Expand Down Expand Up @@ -223,6 +218,49 @@ public void Export(IEnumerable<ScenarioResult> results)
// Write table
AnsiConsole.Write(summaryTable);
AnsiConsole.WriteLine();


// ******************************
// Write overhead table

AnsiConsole.MarkupLine("[aqua bold underline]### Overheads:[/]");
var overheadTable = new Table()
.MarkdownBorder();

var lstOverheadColumns = new List<string>();
lstOverheadColumns.Add(string.Empty);
foreach (var scenario in results.Scenarios)
{
lstOverheadColumns.Add($"[dodgerblue1 bold]{scenario.Name}[/]");
}

overheadTable.AddColumns(lstOverheadColumns.ToArray());
for (var i = 0; i < results.Scenarios.Count; i++)
{
var row = new List<string>
{
$"[dodgerblue1 bold]{results.Scenarios[i].Name}[/]"
};

for (var j = 0; j < results.Scenarios.Count; j++)
{
var value = results.Overheads?[i][j] ?? 0;
if (value == 0)
{
row.Add("--");
}
else
{
row.Add($"{value.ToString(CultureInfo.InvariantCulture)}%");
}
}

overheadTable.AddRow(row.ToArray());
}

// Write overhead table
AnsiConsole.Write(overheadTable);
AnsiConsole.WriteLine();

// Check if is bimodal
for (var idx = 0; idx < resultsList.Count; idx++)
Expand All @@ -244,17 +282,19 @@ public void Export(IEnumerable<ScenarioResult> results)
{
if (result.Status == Status.Failed)
{
AnsiConsole.MarkupLine("[red bold]Scenario '{0}':[/]{1}{2}", result.Name, Environment.NewLine, result.Error);
AnsiConsole.MarkupLine("[red bold]Scenario '{0}':[/]{1}", result.Name, Environment.NewLine);
AnsiConsole.WriteLine(result.Error);
}
else
{
AnsiConsole.MarkupLine("[green bold]Scenario '{0}':[/]{1}{2}", result.Name, Environment.NewLine, result.Error);
AnsiConsole.MarkupLine("[green bold]Scenario '{0}':[/]{1}", result.Name, Environment.NewLine);
AnsiConsole.WriteLine(result.Error);
}
}
}
}

private static void WriteHistogramHorizontal(int[] data, (double Start, double End)[] labels)
private static void WriteHistogramHorizontal(int[] data, Range<double>[] labels)
{
int maxVal = Int32.MinValue;
for (int i = 0; i < data.Length; i++)
Expand Down
6 changes: 3 additions & 3 deletions src/TimeItSharp.Common/Exporters/DatadogExporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ public void Initialize(InitOptions options)
}

/// <inheritdoc />
public void Export(IEnumerable<ScenarioResult> results)
public void Export(TimeitResult results)
{
var errors = false;
var minStartDate = results.Select(r => r.Start).Min();
var minStartDate = results.Scenarios.Select(r => r.Start).Min();
_testModule ??= _testSession.CreateModule(_options.Configuration?.FileName ?? "config_file", "time-it", typeof(DatadogExporter).Assembly.GetName().Version?.ToString() ?? "(unknown)", minStartDate);
var testSuite = _testModule.GetOrCreateSuite("scenarios", minStartDate);
try
{
foreach (var scenarioResult in results)
foreach (var scenarioResult in results.Scenarios)
{
var test = testSuite.CreateTest(scenarioResult.Name, scenarioResult.Start);

Expand Down
2 changes: 1 addition & 1 deletion src/TimeItSharp.Common/Exporters/IExporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ public interface IExporter : INamedExtension

void Initialize(InitOptions options);

void Export(IEnumerable<ScenarioResult> results);
void Export(TimeitResult results);
}
6 changes: 3 additions & 3 deletions src/TimeItSharp.Common/Exporters/JsonExporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public void Initialize(InitOptions options)
_options = options;
}

public void Export(IEnumerable<ScenarioResult> results)
public void Export(TimeitResult results)
{
try
{
Expand All @@ -27,7 +27,7 @@ public void Export(IEnumerable<ScenarioResult> results)
outputFile = Path.Combine(Environment.CurrentDirectory, $"jsonexporter_{Random.Shared.Next()}.json");
}

foreach (var scenarioResult in results)
foreach (var scenarioResult in results.Scenarios)
{
var tags = new Dictionary<string, string>(scenarioResult.Tags.Count);
// Expanding custom tags
Expand All @@ -42,7 +42,7 @@ public void Export(IEnumerable<ScenarioResult> results)
}

using var fStream = File.OpenWrite(outputFile);
JsonSerializer.Serialize(fStream, results, new JsonSerializerOptions(JsonSerializerDefaults.General)
JsonSerializer.Serialize(fStream, results.Scenarios, new JsonSerializerOptions(JsonSerializerDefaults.General)
{
WriteIndented = true
});
Expand Down
18 changes: 18 additions & 0 deletions src/TimeItSharp.Common/Range.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;

namespace TimeItSharp.Common;

public readonly struct Range<T>
{
[JsonPropertyName("start")]
public T Start { get; }

[JsonPropertyName("end")]
public T End { get; }

public Range(T start, T end)
{
Start = start;
End = end;
}
}
4 changes: 2 additions & 2 deletions src/TimeItSharp.Common/Results/ScenarioResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public sealed class ScenarioResult : Scenario
public int[] Histogram { get; set; }

[JsonPropertyName("histogramLabels")]
public (double Start, double End)[] HistogramLabels { get; set; }
public Range<double>[] HistogramLabels { get; set; }

[JsonPropertyName("metrics")]
public Dictionary<string, double> Metrics { get; set; }
Expand All @@ -92,7 +92,7 @@ public ScenarioResult()
Durations = new List<double>();
Outliers = new List<double>();
Histogram = Array.Empty<int>();
HistogramLabels = Array.Empty<(double Start, double End)>();
HistogramLabels = Array.Empty<Range<double>>();
Metrics = new Dictionary<string, double>();
MetricsData = new Dictionary<string, List<double>>();
AdditionalMetrics = new Dictionary<string, double>();
Expand Down
8 changes: 8 additions & 0 deletions src/TimeItSharp.Common/Results/TimeitResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace TimeItSharp.Common.Results;

public sealed class TimeitResult
{
public IReadOnlyList<ScenarioResult> Scenarios { get; set; } = Array.Empty<ScenarioResult>();

public double[][]? Overheads { get; set; }
}
Loading

0 comments on commit 2769b76

Please sign in to comment.