Skip to content

Commit

Permalink
Fix up first column unit on trace detail (#5133)
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesNK authored Aug 1, 2024
1 parent 72598d7 commit 1499990
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 8 deletions.
3 changes: 2 additions & 1 deletion src/Aspire.Dashboard/Components/Pages/TraceDetail.razor
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,9 @@
<TemplateColumn>
<HeaderCellItemTemplate>
<div class="ticks">
@* First column starts at 0. We don't want to display the smallest unit (0μs) because that looks odd. Use the unit from the next column *@
<div class="tick" style="grid-column: 1;"></div>
<span class="tick-label" style="grid-column: 1;">@DurationFormatter.FormatDuration(TimeSpan.Zero)</span>
<span class="tick-label" style="grid-column: 1;">@($"0{DurationFormatter.GetUnit(trace.Duration / 4)}")</span>

<div class="tick" style="grid-column: 2;"></div>
<span class="tick-label" style="grid-column: 2;">@DurationFormatter.FormatDuration(trace.Duration / 4)</span>
Expand Down
19 changes: 13 additions & 6 deletions src/Aspire.Dashboard/Otlp/Model/DurationFormatter.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Diagnostics;

namespace Aspire.Dashboard.Otlp.Model;

public static class DurationFormatter
{
[DebuggerDisplay("Unit = {Unit}, Ticks = {Ticks}, IsDecimal = {IsDecimal}")]
private sealed class UnitStep
{
public required string Unit { get; init; }
Expand All @@ -28,12 +31,6 @@ public static string FormatDuration(TimeSpan duration)
var ofPrevious = primaryUnit.Ticks / secondaryUnit.Ticks;
var ticks = (double)duration.Ticks;

// Special case time 0 to not display any unit, as "0μs" looks quirky
if (ticks == 0)
{
return "0";
}

if (primaryUnit.IsDecimal)
{
// If the unit is decimal based, display as a decimal
Expand All @@ -48,6 +45,16 @@ public static string FormatDuration(TimeSpan duration)
return secondaryValue == 0 ? primaryUnitString : $"{primaryUnitString} {secondaryUnitString}";
}

public static string GetUnit(TimeSpan duration)
{
var (primaryUnit, secondaryUnit) = ResolveUnits(duration.Ticks);
if (primaryUnit.IsDecimal)
{
return primaryUnit.Unit;
}
return secondaryUnit.Unit;
}

private static (UnitStep, UnitStep) ResolveUnits(long ticks)
{
for (var i = 0; i < s_unitSteps.Count; i++)
Expand Down
16 changes: 15 additions & 1 deletion tests/Aspire.Dashboard.Tests/DurationFormatterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,20 @@ namespace Aspire.Dashboard.Tests;

public class DurationFormatterTests
{
[Theory]
[InlineData(0, "μs")]
[InlineData(1, "μs")]
[InlineData(1_000, "μs")]
[InlineData(1_000_000, "ms")]
[InlineData(1_000_000_000, "s")]
[InlineData(1_000_000_000_000, "h")]
[InlineData(1_000_000_000_000_000, "h")]
[InlineData(1_000_000_000_000_000_000, "h")]
public void GetUnit(long ticks, string unit)
{
Assert.Equal(unit, DurationFormatter.GetUnit(TimeSpan.FromTicks(ticks)));
}

[Fact]
public void KeepsMicrosecondsTheSame()
{
Expand Down Expand Up @@ -68,6 +82,6 @@ public void DisplaysTimesLessThanMicroseconds()
public void DisplaysTimesOf0()
{
var input = 0;
Assert.Equal("0", DurationFormatter.FormatDuration(TimeSpan.FromTicks(input)));
Assert.Equal("0μs", DurationFormatter.FormatDuration(TimeSpan.FromTicks(input)));
}
}

0 comments on commit 1499990

Please sign in to comment.