Skip to content

Commit 838d0a1

Browse files
adamintAdam Ratzman
andauthored
Add details column to trace view, remove status badge and put counter badge on resource name (#1788)
* add details column to trace detail * Update xlfs, style button * remove error badge * Put unread error counter on name * update trace detail details column to absolute width * Remove unused resx strings, re-add titles for resource name * Make error counter badge text white in dark theme * fixed variable name --------- Co-authored-by: Adam Ratzman <[email protected]>
1 parent e02b371 commit 838d0a1

File tree

74 files changed

+294
-434
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+294
-434
lines changed

src/Aspire.Dashboard/Components/Pages/Resources.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@
5252
<ChildContent>
5353
<PropertyColumn Title="@Loc[nameof(Dashboard.Resources.Resources.ResourcesTypeColumnHeader)]" Property="@(c => c.ResourceType)" Sortable="true" />
5454
<TemplateColumn Title="@ControlsStringsLoc[nameof(ControlsStrings.NameColumnHeader)]" Sortable="true" SortBy="@_nameSort">
55-
<ResourceNameDisplay Resource="context" FilterText="@_filter" FormatName="GetResourceName" />
55+
<ResourceNameDisplay Resource="context" FilterText="@_filter" FormatName="GetResourceName" UnviewedErrorCounts="@_applicationUnviewedErrorCounts" />
5656
</TemplateColumn>
5757
<TemplateColumn Title="@Loc[nameof(Dashboard.Resources.Resources.ResourcesStateColumnHeader)]" Sortable="true" SortBy="@_stateSort">
58-
<StateColumnDisplay UnviewedErrorCounts="@_applicationUnviewedErrorCounts" Resource="@context" />
58+
<StateColumnDisplay Resource="@context"/>
5959
</TemplateColumn>
6060
<PropertyColumn Property="@(c => c.CreationTimeStamp)" Title="@Loc[nameof(Dashboard.Resources.Resources.ResourcesStartTimeColumnHeader)]" Sortable="true" Tooltip="true" />
6161
<TemplateColumn Title="@Loc[nameof(Dashboard.Resources.Resources.ResourcesSourceColumnHeader)]">

src/Aspire.Dashboard/Components/Pages/Resources.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,5 +182,5 @@ public void Dispose()
182182
}
183183

184184
private string? GetRowClass(ResourceViewModel resource)
185-
=> resource == SelectedResource ? "selected-row" : null;
185+
=> resource == SelectedResource ? "selected-row resource-row" : "resource-row";
186186
}

src/Aspire.Dashboard/Components/Pages/Resources.razor.css

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
::deep .resource-state-container {
2-
display: flex;
3-
align-items: center;
4-
}
5-
61
::deep .resource-state-badge {
72
padding: 0 3px;
83
cursor: pointer;
@@ -18,3 +13,6 @@
1813
margin-left: 3px;
1914
}
2015

16+
::deep .resource-row > fluent-data-grid-cell {
17+
overflow: visible;
18+
}

src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
</a>
9393
}
9494
</TemplateColumn>
95-
<TemplateColumn Title="@Loc[nameof(Dashboard.Resources.StructuredLogs.StructuredLogsDetailsColumnHeader)]">
95+
<TemplateColumn Title="@ControlsStringsLoc[nameof(ControlsStrings.DetailsColumnHeader)]">
9696
<FluentButton Appearance="Appearance.Lightweight" OnClick="() => OnShowProperties(context)">@ControlsStringsLoc[nameof(ControlsStrings.ViewAction)]</FluentButton>
9797
</TemplateColumn>
9898
</ChildContent>

src/Aspire.Dashboard/Components/Pages/TraceDetail.razor

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
@page "/Trace/{traceId}"
22
@page "/Trace/{traceId}/Span/{spanId}"
33

4-
@using Aspire.Dashboard.Model
54
@using Aspire.Dashboard.Model.Otlp
65
@using Aspire.Dashboard.Otlp.Model
76
@using System.Globalization
87
@using Aspire.Dashboard.Resources
98
@inject IStringLocalizer<Dashboard.Resources.TraceDetail> Loc
109
@inject IStringLocalizer<ControlsStrings> ControlStringsLoc
11-
@inject IDashboardClient DashboardClient
1210

1311
<PageTitle><ApplicationName ResourceName="@nameof(Dashboard.Resources.TraceDetail.TraceDetailPageTitle)" Loc="@Loc" /></PageTitle>
1412

@@ -53,7 +51,7 @@
5351
</div>
5452
</DetailsTitleTemplate>
5553
<Summary>
56-
<FluentDataGrid Class="trace-view-grid" ResizableColumns="true" ItemsProvider="@GetData" TGridItem="SpanWaterfallViewModel" RowClass="@GetRowClass" GridTemplateColumns="2fr 6fr">
54+
<FluentDataGrid Class="trace-view-grid" ResizableColumns="true" ItemsProvider="@GetData" TGridItem="SpanWaterfallViewModel" RowClass="@GetRowClass" GridTemplateColumns="4fr 12fr 85px">
5755
<TemplateColumn Title="Name">
5856
<div class="col-long-content" title="@context.GetTooltip()" @onclick="() => OnShowProperties(context)">
5957
@{
@@ -126,6 +124,12 @@
126124
</div>
127125
</ChildContent>
128126
</TemplateColumn>
127+
<TemplateColumn Title="@ControlStringsLoc[nameof(ControlsStrings.DetailsColumnHeader)]">
128+
<FluentButton
129+
Style="margin-left: 7px;"
130+
Title="@ControlStringsLoc[nameof(ControlsStrings.ViewAction)]"
131+
Appearance="Appearance.Lightweight" OnClick="() => OnShowProperties(context)">@ControlStringsLoc[nameof(ControlsStrings.ViewAction)]</FluentButton>
132+
</TemplateColumn>
129133
</FluentDataGrid>
130134
</Summary>
131135
<Details>

src/Aspire.Dashboard/Components/Pages/Traces.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
</div>
7575
</TemplateColumn>
7676

77-
<TemplateColumn Title="@Loc[nameof(Dashboard.Resources.Traces.TracesDetailsColumnHeader)]">
77+
<TemplateColumn Title="@ControlsStringsLoc[nameof(ControlsStrings.DetailsColumnHeader)]">
7878
<FluentAnchor Appearance="Appearance.Lightweight" Href="@($"/Trace/{context.TraceId}")">@ControlsStringsLoc[nameof(ControlsStrings.ViewAction)]</FluentAnchor>
7979
</TemplateColumn>
8080
</ChildContent>
Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
1-
@using Aspire.Dashboard.Model
1+
@namespace Aspire.Dashboard.Components
2+
3+
@using Aspire.Dashboard.Model
4+
@using Aspire.Dashboard.Otlp.Model
25
@using Aspire.Dashboard.Resources
36
@inject IStringLocalizer<Columns> Loc
47

5-
<FluentStack Orientation="Orientation.Horizontal" VerticalAlignment="VerticalAlignment.Center">
6-
<span><FluentHighlighter HighlightedText="@FilterText" Text="@FormatName(Resource)" /></span>
7-
</FluentStack>
8+
@{
9+
var unviewedErrorCount = GetUnviewedErrorCount(Resource);
10+
}
11+
12+
@if (unviewedErrorCount > 0)
13+
{
14+
<FluentCounterBadge Class="error-counter-badge" Max="9" BackgroundColor="@Color.Error" Color="Color.Fill" Appearance="Appearance.Lightweight" Count="@unviewedErrorCount" HorizontalPosition="100">
15+
<a href="@GetResourceErrorStructuredLogsUrl(Resource)" title="@FormatLogLinkTitle(unviewedErrorCount)"><FluentHighlighter HighlightedText="@FilterText" Text="@FormatName(Resource)" /></a>
16+
</FluentCounterBadge>
17+
}
18+
else
19+
{
20+
<span title="@FormatName(Resource)"><FluentHighlighter HighlightedText="@FilterText" Text="@FormatName(Resource)"/></span>
21+
}
822

923
@code {
1024
[Parameter, EditorRequired]
@@ -15,4 +29,7 @@
1529

1630
[Parameter, EditorRequired]
1731
public required string FilterText { get; set; }
32+
33+
[Parameter, EditorRequired]
34+
public required Dictionary<OtlpApplication, int>? UnviewedErrorCounts { get; set; }
1835
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Globalization;
5+
using Aspire.Dashboard.Model;
6+
using Aspire.Dashboard.Otlp.Storage;
7+
using Aspire.Dashboard.Resources;
8+
using Microsoft.AspNetCore.Components;
9+
10+
namespace Aspire.Dashboard.Components;
11+
12+
public partial class ResourceNameDisplay
13+
{
14+
[Inject]
15+
public required TelemetryRepository TelemetryRepository { get; init; }
16+
17+
private int GetUnviewedErrorCount(ResourceViewModel resource)
18+
{
19+
if (UnviewedErrorCounts is null)
20+
{
21+
return 0;
22+
}
23+
24+
var application = TelemetryRepository.GetApplication(resource.Uid);
25+
return application is null ? 0 : UnviewedErrorCounts.GetValueOrDefault(application, 0);
26+
}
27+
28+
private static string GetResourceErrorStructuredLogsUrl(ResourceViewModel resource)
29+
{
30+
return $"/StructuredLogs/{resource.Uid}?level=error";
31+
}
32+
33+
private string FormatLogLinkTitle(int unviewedErrorCount)
34+
{
35+
return FormatName(Resource) + Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Loc[nameof(Columns.UnreadLogErrors)], unviewedErrorCount);
36+
}
37+
}

src/Aspire.Dashboard/Components/ResourcesGridColumns/StateColumnDisplay.razor

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,35 @@
33
@using Aspire.Dashboard.Resources
44
@inject IStringLocalizer<Columns> Loc
55

6-
<div class="resource-state-container">
7-
@if (Resource is { State: ResourceStates.ExitedState /* containers */ or ResourceStates.FinishedState /* executables */ })
6+
@if (Resource is { State: ResourceStates.ExitedState /* containers */ or ResourceStates.FinishedState /* executables */ })
7+
{
8+
if (Resource.TryGetExitCode(out int exitCode) && exitCode is not 0)
89
{
9-
if (Resource.TryGetExitCode(out int exitCode) && exitCode is not 0)
10-
{
11-
<!-- process completed unexpectedly, hence the non-zero code. this is almost certainly an error, so warn users -->
12-
<FluentIcon Title="@string.Format(Loc[Columns.StateColumnResourceExitedUnexpectedly], Resource.ResourceType, exitCode)"
13-
Icon="Icons.Filled.Size16.ErrorCircle"
14-
Color="Color.Error"
15-
Class="severity-icon" />
16-
}
17-
else
18-
{
19-
<!-- process completed, which may not have been unexpected -->
20-
<FluentIcon Title="@string.Format(Loc[Columns.StateColumnResourceExited], Resource.ResourceType)"
21-
Icon="Icons.Filled.Size16.Warning"
22-
Color="Color.Warning"
23-
Class="severity-icon" />
24-
}
10+
<!-- process completed unexpectedly, hence the non-zero code. this is almost certainly an error, so warn users -->
11+
<FluentIcon Title="@string.Format(Loc[Columns.StateColumnResourceExitedUnexpectedly], Resource.ResourceType, exitCode)"
12+
Icon="Icons.Filled.Size16.ErrorCircle"
13+
Color="Color.Error"
14+
Class="severity-icon"/>
2515
}
16+
else
17+
{
18+
<!-- process completed, which may not have been unexpected -->
19+
<FluentIcon Title="@string.Format(Loc[Columns.StateColumnResourceExited], Resource.ResourceType)"
20+
Icon="Icons.Filled.Size16.Warning"
21+
Color="Color.Warning"
22+
Class="severity-icon"/>
23+
}
24+
}
25+
else
26+
{
27+
<FluentIcon Icon="Icons.Filled.Size16.CheckmarkCircle"
28+
Color="Color.Success"
29+
Class="severity-icon"/>
30+
}
31+
32+
@Resource.State
2633

27-
@Resource.State
28-
<UnreadLogErrorsBadge UnviewedErrorCounts="UnviewedErrorCounts" Resource="@Resource" />
29-
</div>
34+
@code {
35+
[Parameter, EditorRequired]
36+
public required ResourceViewModel Resource { get; set; }
37+
}

src/Aspire.Dashboard/Components/ResourcesGridColumns/StateColumnDisplay.razor.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)