Skip to content

Commit dbd0026

Browse files
authored
Use friendly name in console logs with single replica (#8470)
* Use display name for console logs when there is only one replica * clean up code behind * fix get selected option logic, disable resource select when resources are null * clean up * Redirect to correct console logs url * add space * use existing functions instead of adding duplicates * fix resource details tests * update console log url, move helper to ResourceViewModel
1 parent 6ff4a88 commit dbd0026

File tree

12 files changed

+57
-24
lines changed

12 files changed

+57
-24
lines changed

src/Aspire.Dashboard/Components/Controls/ResourceActions.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@namespace Aspire.Dashboard.Components
22
@using Aspire.Dashboard.Model
3-
@using Microsoft.FluentUI.AspNetCore.Components
3+
@using Aspire.Dashboard.Model.Otlp
44

55
@if (ViewportInformation.IsDesktop)
66
{
@@ -29,7 +29,7 @@
2929
}
3030
}
3131

32-
<FluentButton Appearance="Appearance.Lightweight" Title="@Loc[nameof(Resources.Resources.ResourceActionConsoleLogsText)]" OnClick="@(() => NavigationManager.NavigateTo(Aspire.Dashboard.Utils.DashboardUrls.ConsoleLogsUrl(resource: Resource.Name)))">
32+
<FluentButton Appearance="Appearance.Lightweight" Title="@Loc[nameof(Resources.Resources.ResourceActionConsoleLogsText)]" OnClick="@(() => NavigationManager.NavigateTo(Aspire.Dashboard.Utils.DashboardUrls.ConsoleLogsUrl(resource: ResourceViewModel.GetResourceName(Resource, ResourceByName))))">
3333
<FluentIcon Value="@s_consoleLogsIcon" />
3434
</FluentButton>
3535

src/Aspire.Dashboard/Components/Controls/ResourceActions.razor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Collections.Concurrent;
45
using Aspire.Dashboard.Model;
56
using Aspire.Dashboard.Otlp.Storage;
67
using Microsoft.AspNetCore.Components;
@@ -46,6 +47,9 @@ public partial class ResourceActions : ComponentBase
4647
[Parameter]
4748
public required int MaxHighlightedCount { get; set; }
4849

50+
[Parameter]
51+
public required ConcurrentDictionary<string, ResourceViewModel> ResourceByName { get; set; }
52+
4953
[CascadingParameter]
5054
public required ViewportInformation ViewportInformation { get; set; }
5155

src/Aspire.Dashboard/Components/Controls/ResourceDetails.razor

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
@using Aspire.Dashboard.Components.Controls.Grid
22
@using Aspire.Dashboard.Model
3-
@using Aspire.Dashboard.Otlp.Model
43
@using Aspire.Dashboard.Resources
54
@using Aspire.Dashboard.Utils
65
@using Humanizer
76
@using Microsoft.Extensions.Diagnostics.HealthChecks
8-
@using System.Net
7+
@using Aspire.Dashboard.Model.Otlp
98

109
@inject IStringLocalizer<ControlsStrings> ControlStringsLoc
1110
@inject IStringLocalizer<Resources> Loc
1211

1312
<div class="resource-details-layout">
1413

1514
<FluentToolbar Orientation="Orientation.Horizontal">
16-
<FluentAnchor Appearance="Appearance.Lightweight" Href="@DashboardUrls.ConsoleLogsUrl(Resource?.Name)" slot="end">@Loc[nameof(Resources.ResourceDetailsViewConsoleLogs)]</FluentAnchor>
15+
<FluentAnchor Appearance="Appearance.Lightweight" Href="@DashboardUrls.ConsoleLogsUrl(ResourceViewModel.GetResourceName(Resource, ResourceByName))" slot="end">@Loc[nameof(Resources.ResourceDetailsViewConsoleLogs)]</FluentAnchor>
1716

1817
@if (ShowSpecOnlyToggle)
1918
{

src/Aspire.Dashboard/Components/Controls/ResourceSelect.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
class="@LabelClass" />
99

1010
<FluentSelect Items="Resources"
11+
Disabled="@(Resources is null)"
1112
Id="@_selectId"
1213
OptionValue="@(c => c!.Name)"
1314
OptionDisabled="@(c => !CanSelectGrouping && c!.Id?.Type is Otlp.Model.OtlpApplicationType.ResourceGrouping)"

src/Aspire.Dashboard/Components/Controls/ResourceSelect.razor.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ public partial class ResourceSelect
1616
private readonly string _selectId = $"resource-select-{Guid.NewGuid():N}";
1717

1818
[Parameter]
19-
public IEnumerable<SelectViewModel<ResourceTypeDetails>> Resources { get; set; } = default!;
19+
public IEnumerable<SelectViewModel<ResourceTypeDetails>>? Resources { get; set; }
2020

2121
[Parameter]
22-
public SelectViewModel<ResourceTypeDetails> SelectedResource { get; set; } = default!;
22+
public SelectViewModel<ResourceTypeDetails>? SelectedResource { get; set; }
2323

2424
[Parameter]
2525
public EventCallback<SelectViewModel<ResourceTypeDetails>> SelectedResourceChanged { get; set; }
@@ -33,12 +33,12 @@ public partial class ResourceSelect
3333
[Parameter]
3434
public string? LabelClass { get; set; }
3535

36-
private async Task SelectedResourceChangedCore()
36+
private Task SelectedResourceChangedCore()
3737
{
38-
await SelectedResourceChanged.InvokeAsync(SelectedResource);
38+
return InvokeAsync(() => SelectedResourceChanged.InvokeAsync(SelectedResource));
3939
}
4040

41-
private static void ValuedChanged(string value)
41+
private static void ValuedChanged(string? value)
4242
{
4343
// Do nothing. Required for bunit change to trigger SelectedOptionChanged.
4444
}

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
using Aspire.Dashboard.Extensions;
1212
using Aspire.Dashboard.Model;
1313
using Aspire.Dashboard.Model.Otlp;
14-
using Aspire.Dashboard.Otlp.Model;
1514
using Aspire.Dashboard.Otlp.Storage;
1615
using Aspire.Dashboard.Resources;
1716
using Aspire.Dashboard.Utils;
@@ -188,7 +187,7 @@ async Task TrackResourceSnapshotsAsync()
188187
// Set loading task result if the selected resource is already in the snapshot or there is no selected resource.
189188
if (ResourceName != null)
190189
{
191-
if (_resourceByName.TryGetValue(ResourceName, out var selectedResource))
190+
if (ResourceViewModel.TryGetResourceByName(ResourceName, _resourceByName, out var selectedResource))
192191
{
193192
SetSelectedResourceOption(selectedResource);
194193
}
@@ -232,16 +231,20 @@ await InvokeAsync(() =>
232231

233232
void SetSelectedResourceOption(ResourceViewModel resource)
234233
{
235-
Debug.Assert(_resources is not null);
236-
237-
PageViewModel.SelectedOption = _resources.Single(option => option.Id?.Type is not OtlpApplicationType.ResourceGrouping && string.Equals(ResourceName, option.Id?.InstanceId, StringComparison.Ordinal));
234+
PageViewModel.SelectedOption = GetSelectedOption();
238235
PageViewModel.SelectedResource = resource;
239236

240237
Logger.LogDebug("Selected console resource from name {ResourceName}.", ResourceName);
241238
loadingTcs.TrySetResult();
242239
}
243240
}
244241

242+
private SelectViewModel<ResourceTypeDetails> GetSelectedOption()
243+
{
244+
Debug.Assert(_resources is not null);
245+
return _resources.GetApplication(Logger, ResourceName, canSelectGrouping: false, fallback: _noSelection);
246+
}
247+
245248
protected override async Task OnParametersSetAsync()
246249
{
247250
Logger.LogDebug("Initializing console logs view model.");
@@ -692,10 +695,8 @@ public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel)
692695
{
693696
if (_resources is not null && ResourceName is not null)
694697
{
695-
var selectedOption = _resources.FirstOrDefault(c => string.Equals(ResourceName, c.Id?.InstanceId, StringComparisons.ResourceName)) ?? _noSelection;
696-
697-
viewModel.SelectedOption = selectedOption;
698-
viewModel.SelectedResource = selectedOption.Id?.InstanceId is null ? null : _resourceByName[selectedOption.Id.InstanceId];
698+
viewModel.SelectedOption = GetSelectedOption();
699+
viewModel.SelectedResource = viewModel.SelectedOption.Id?.InstanceId is null ? null : _resourceByName[viewModel.SelectedOption.Id.InstanceId];
699700
viewModel.Status ??= Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsLogsNotYetAvailable)];
700701
}
701702
else
@@ -715,6 +716,10 @@ public string GetUrlFromSerializableViewModel(ConsoleLogsPageState serializable)
715716

716717
public ConsoleLogsPageState ConvertViewModelToSerializable()
717718
{
718-
return new ConsoleLogsPageState(PageViewModel.SelectedResource?.Name);
719+
var selectedResourceName = PageViewModel.SelectedOption.Id is not null
720+
? PageViewModel.SelectedOption.Name
721+
// _noSelection, which doesn't have a resource attached to it
722+
: null;
723+
return new ConsoleLogsPageState(selectedResourceName);
719724
}
720725
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@
182182
OnViewDetails="@((buttonId) => ShowResourceDetailsAsync(context.Resource, buttonId))"
183183
Resource="context.Resource"
184184
GetResourceName="GetResourceName"
185-
MaxHighlightedCount="_maxHighlightedCount" />
185+
MaxHighlightedCount="_maxHighlightedCount"
186+
ResourceByName="@_resourceByName" />
186187
</div>
187188
</AspireTemplateColumn>
188189
</ChildContent>

src/Aspire.Dashboard/Model/DashboardCommandExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public async Task ExecuteAsyncCore(ResourceViewModel resource, CommandViewModel
133133
toastParameters.Icon = GetIntentIcon(ToastIntent.Error);
134134
toastParameters.Content.Details = response.ErrorMessage;
135135
toastParameters.PrimaryAction = loc[nameof(Dashboard.Resources.Resources.ResourceCommandToastViewLogs)];
136-
toastParameters.OnPrimaryAction = EventCallback.Factory.Create<ToastResult>(this, () => navigationManager.NavigateTo(DashboardUrls.ConsoleLogsUrl(resource: resource.Name)));
136+
toastParameters.OnPrimaryAction = EventCallback.Factory.Create<ToastResult>(this, () => navigationManager.NavigateTo(DashboardUrls.ConsoleLogsUrl(resource: getResourceName(resource))));
137137
}
138138

139139
if (!toastClosed)

src/Aspire.Dashboard/Model/Otlp/ApplicationsSelectHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace Aspire.Dashboard.Model.Otlp;
77

88
public static class ApplicationsSelectHelpers
99
{
10-
public static SelectViewModel<ResourceTypeDetails> GetApplication(this List<SelectViewModel<ResourceTypeDetails>> applications, ILogger logger, string? name, bool canSelectGrouping, SelectViewModel<ResourceTypeDetails> fallback)
10+
public static SelectViewModel<ResourceTypeDetails> GetApplication(this ICollection<SelectViewModel<ResourceTypeDetails>> applications, ILogger logger, string? name, bool canSelectGrouping, SelectViewModel<ResourceTypeDetails> fallback)
1111
{
1212
if (name is null)
1313
{

src/Aspire.Dashboard/Model/ResourceMenuItems.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static void AddMenuItems(
4747
Icon = s_consoleLogsIcon,
4848
OnClick = () =>
4949
{
50-
navigationManager.NavigateTo(DashboardUrls.ConsoleLogsUrl(resource: resource.Name));
50+
navigationManager.NavigateTo(DashboardUrls.ConsoleLogsUrl(resource: getResourceName(resource)));
5151
return Task.CompletedTask;
5252
}
5353
});

0 commit comments

Comments
 (0)