diff --git a/src/Aspire.Dashboard/Components/Controls/Chart/ChartBase.cs b/src/Aspire.Dashboard/Components/Controls/Chart/ChartBase.cs index 033b67da828..800eac92ec8 100644 --- a/src/Aspire.Dashboard/Components/Controls/Chart/ChartBase.cs +++ b/src/Aspire.Dashboard/Components/Controls/Chart/ChartBase.cs @@ -56,7 +56,7 @@ public abstract class ChartBase : ComponentBase, IAsyncDisposable public required TimeSpan Duration { get; set; } [Parameter] - public required List Applications { get; set; } + public required List Resources { get; set; } // Stores a cache of the last set of spans returned as exemplars. // This dictionary is replaced each time the chart is updated. diff --git a/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor b/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor index 7fff43728cb..6197b37750e 100644 --- a/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor +++ b/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor @@ -38,7 +38,7 @@ else Label="@Loc[nameof(ControlsStrings.ChartContainerGraphTab)]" Icon="@(new Icons.Regular.Size24.DataArea())">
- +
@@ -47,7 +47,7 @@ else Label="@Loc[nameof(ControlsStrings.ChartContainerTableTab)]" Icon="@(new Icons.Regular.Size24.Table())">
- +
diff --git a/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor.cs b/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor.cs index 4c872c43cad..aaa3e38021c 100644 --- a/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/Chart/ChartContainer.razor.cs @@ -23,7 +23,7 @@ public partial class ChartContainer : ComponentBase, IAsyncDisposable private readonly InstrumentViewModel _instrumentViewModel = new InstrumentViewModel(); [Parameter, EditorRequired] - public required ApplicationKey ApplicationKey { get; set; } + public required ResourceKey ResourceKey { get; set; } [Parameter, EditorRequired] public required string MeterName { get; set; } @@ -41,7 +41,7 @@ public partial class ChartContainer : ComponentBase, IAsyncDisposable public required Func OnViewChangedAsync { get; set; } [Parameter, EditorRequired] - public required List Applications { get; set; } + public required List Resources { get; set; } [Parameter, EditorRequired] public required string? PauseText { get; set; } @@ -190,7 +190,7 @@ protected override async Task OnParametersSetAsync() var instrument = TelemetryRepository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = ApplicationKey, + ResourceKey = ResourceKey, MeterName = MeterName, InstrumentName = InstrumentName, StartTime = startDate, @@ -200,8 +200,8 @@ protected override async Task OnParametersSetAsync() if (instrument == null) { Logger.LogDebug( - "Unable to find instrument. ApplicationKey: {ApplicationKey}, MeterName: {MeterName}, InstrumentName: {InstrumentName}", - ApplicationKey, + "Unable to find instrument. ResourceKey: {ResourceKey}, MeterName: {MeterName}, InstrumentName: {InstrumentName}", + ResourceKey, MeterName, InstrumentName); } diff --git a/src/Aspire.Dashboard/Components/Controls/Chart/MetricTable.razor.cs b/src/Aspire.Dashboard/Components/Controls/Chart/MetricTable.razor.cs index b4a31926cd2..27c08916c46 100644 --- a/src/Aspire.Dashboard/Components/Controls/Chart/MetricTable.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/Chart/MetricTable.razor.cs @@ -96,14 +96,14 @@ private async Task OpenExemplarsDialogAsync(MetricViewBase metric) var vm = new ExemplarsDialogViewModel { Exemplars = metric.Exemplars, - Applications = Applications, + Resources = Resources, Instrument = InstrumentViewModel.Instrument! }; var parameters = new DialogParameters { - Title = DialogsLoc[nameof(Resources.Dialogs.ExemplarsDialogTitle)], - PrimaryAction = DialogsLoc[nameof(Resources.Dialogs.DialogCloseButtonText)], - DismissTitle = DialogsLoc[nameof(Resources.Dialogs.DialogCloseButtonText)], + Title = DialogsLoc[nameof(Dashboard.Resources.Dialogs.ExemplarsDialogTitle)], + PrimaryAction = DialogsLoc[nameof(Dashboard.Resources.Dialogs.DialogCloseButtonText)], + DismissTitle = DialogsLoc[nameof(Dashboard.Resources.Dialogs.DialogCloseButtonText)], SecondaryAction = string.Empty, Width = "800px", Height = "auto" diff --git a/src/Aspire.Dashboard/Components/Controls/Chart/PlotlyChart.razor.cs b/src/Aspire.Dashboard/Components/Controls/Chart/PlotlyChart.razor.cs index 77dd5612d16..38f631342de 100644 --- a/src/Aspire.Dashboard/Components/Controls/Chart/PlotlyChart.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/Chart/PlotlyChart.razor.cs @@ -156,7 +156,7 @@ private PlotlyTrace CalculateExemplarsTrace(List xValues, List SelectedResource { get; set; } [Parameter] - public required Func HandleClearSignal { get; set; } + public required Func HandleClearSignal { get; set; } private readonly List _clearMenuItems = new(); @@ -45,7 +45,7 @@ protected override void OnParametersSet() { Id = "clear-menu-resource", Icon = s_clearSelectedResourceIcon, - OnClick = () => HandleClearSignal(SelectedResource.Id?.GetApplicationKey()), + OnClick = () => HandleClearSignal(SelectedResource.Id?.GetResourceKey()), IsDisabled = SelectedResource.Id == null, Text = SelectedResource.Id == null ? ControlsStringsLoc[nameof(ControlsStrings.ClearPendingSelectedResource)] diff --git a/src/Aspire.Dashboard/Components/Controls/LogViewer.razor.cs b/src/Aspire.Dashboard/Components/Controls/LogViewer.razor.cs index 10c81dd3968..4bd0df71949 100644 --- a/src/Aspire.Dashboard/Components/Controls/LogViewer.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/LogViewer.razor.cs @@ -43,7 +43,7 @@ public sealed partial class LogViewer public bool NoWrapLogs { get; set; } [Parameter] - public string? ApplicationName { get; set; } + public string? ResourceName { get; set; } protected override void OnParametersSet() { diff --git a/src/Aspire.Dashboard/Components/Controls/PropertyValues/ResourceNameButtonValue.razor.cs b/src/Aspire.Dashboard/Components/Controls/PropertyValues/ResourceNameButtonValue.razor.cs index 5103e276cad..4dbe5dff9b4 100644 --- a/src/Aspire.Dashboard/Components/Controls/PropertyValues/ResourceNameButtonValue.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/PropertyValues/ResourceNameButtonValue.razor.cs @@ -19,7 +19,7 @@ public partial class ResourceNameButtonValue public required string HighlightText { get; set; } [Parameter, EditorRequired] - public required OtlpApplication Resource { get; set; } + public required OtlpResource Resource { get; set; } [Inject] public required NavigationManager NavigationManager { get; init; } @@ -36,7 +36,7 @@ protected override void OnParametersSet() if (DashboardClient.IsEnabled) { - _resource = DashboardClient.GetResource(Resource.ApplicationKey.ToString()); + _resource = DashboardClient.GetResource(Resource.ResourceKey.ToString()); if (_resource != null) { _resourceIcon = ResourceIconHelpers.GetIconForResource(_resource, IconSize.Size16, IconVariant.Regular); diff --git a/src/Aspire.Dashboard/Components/Controls/ResourceSelect.razor b/src/Aspire.Dashboard/Components/Controls/ResourceSelect.razor index 78afa322c69..276b685cb1d 100644 --- a/src/Aspire.Dashboard/Components/Controls/ResourceSelect.razor +++ b/src/Aspire.Dashboard/Components/Controls/ResourceSelect.razor @@ -12,7 +12,7 @@ @key="@Resources?.Count()" Id="@_selectId" OptionValue="@(c => c!.Name)" - OptionDisabled="@(c => !CanSelectGrouping && c!.Id?.Type is Otlp.Model.OtlpApplicationType.ResourceGrouping)" + OptionDisabled="@(c => !CanSelectGrouping && c!.Id?.Type is Otlp.Model.OtlpResourceType.ResourceGrouping)" @bind-SelectedOption="SelectedResource" @bind-SelectedOption:after="SelectedResourceChangedCore" ValueChanged="ValuedChanged" diff --git a/src/Aspire.Dashboard/Components/Controls/ResourceSelectOptionTemplate.razor b/src/Aspire.Dashboard/Components/Controls/ResourceSelectOptionTemplate.razor index b2b16dbc5be..5484e4e4407 100644 --- a/src/Aspire.Dashboard/Components/Controls/ResourceSelectOptionTemplate.razor +++ b/src/Aspire.Dashboard/Components/Controls/ResourceSelectOptionTemplate.razor @@ -6,14 +6,14 @@ @inject IStringLocalizer Loc - @if (ViewModel.Id?.Type is OtlpApplicationType.ResourceGrouping) + @if (ViewModel.Id?.Type is OtlpResourceType.ResourceGrouping) { - @ViewModel.Name (@Loc[nameof(ControlsStrings.ApplicationLower)]) + @ViewModel.Name (@Loc[nameof(ControlsStrings.ApplicationLower)]) } - else if (ViewModel.Id?.Type is OtlpApplicationType.Instance) + else if (ViewModel.Id?.Type is OtlpResourceType.Instance) { @ViewModel.Name } diff --git a/src/Aspire.Dashboard/Components/Controls/SignalsActionsDisplay.razor.cs b/src/Aspire.Dashboard/Components/Controls/SignalsActionsDisplay.razor.cs index e8902a02407..45a41a2fd78 100644 --- a/src/Aspire.Dashboard/Components/Controls/SignalsActionsDisplay.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/SignalsActionsDisplay.razor.cs @@ -23,7 +23,7 @@ public partial class SignalsActionsDisplay public required Action OnPausedChanged { get; set; } [Parameter, EditorRequired] - public required Func HandleClearSignal { get; set; } + public required Func HandleClearSignal { get; set; } [Parameter, EditorRequired] public required SelectViewModel SelectedResource { get; set; } diff --git a/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor b/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor index b73121ae150..585912d59cc 100644 --- a/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor +++ b/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor @@ -10,7 +10,7 @@
- @((MarkupString)string.Format(ControlsStrings.SpanDetailsResource, ViewModel.Span.Source.Application.ApplicationName)) + @((MarkupString)string.Format(ControlsStrings.SpanDetailsResource, ViewModel.Span.Source.Resource.ResourceName))
@@ -158,10 +158,10 @@ RenderFragment WriteSpanLink(SpanLinkViewModel context) { var content = context.Span != null - ? SpanWaterfallViewModel.GetTitle(context.Span, ViewModel.Applications) + ? SpanWaterfallViewModel.GetTitle(context.Span, ViewModel.Resources) : $"{Loc[nameof(ControlsStrings.SpanDetailsSpanPrefix)]}: {OtlpHelpers.ToShortenedId(context.SpanId)}"; var color = context.Span != null - ? ColorGenerator.Instance.GetColorHexByKey(OtlpApplication.GetResourceName(context.Span.Source, ViewModel.Applications)) + ? ColorGenerator.Instance.GetColorHexByKey(OtlpResource.GetResourceName(context.Span.Source, ViewModel.Resources)) : "transparent"; return @
diff --git a/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor.cs b/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor.cs index 2213afd3376..a7bae9d409d 100644 --- a/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/SpanDetails.razor.cs @@ -133,7 +133,7 @@ protected override void OnParametersSet() [KnownResourceFields.ServiceNameField] = new ComponentMetadata { Type = typeof(ResourceNameButtonValue), - Parameters = { ["Resource"] = _viewModel.Span.Source.Application } + Parameters = { ["Resource"] = _viewModel.Span.Source.Resource } }, [KnownTraceFields.StatusField] = new ComponentMetadata { diff --git a/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor b/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor index d9bbc689340..716009e471b 100644 --- a/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor +++ b/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor @@ -7,7 +7,7 @@
- @((MarkupString)string.Format(ControlsStrings.StructuredLogsDetailsResource, ViewModel.LogEntry.ApplicationView.Application.ApplicationName)) + @((MarkupString)string.Format(ControlsStrings.StructuredLogsDetailsResource, ViewModel.LogEntry.ResourceView.Resource.ResourceName))
diff --git a/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor.cs b/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor.cs index 3c287da85a3..fc629941feb 100644 --- a/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor.cs +++ b/src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor.cs @@ -38,7 +38,7 @@ public partial class StructuredLogDetails : IDisposable _contextAttributes.Where(ApplyFilter).AsQueryable(); internal IQueryable FilteredResourceItems => - ViewModel.LogEntry.ApplicationView.AllProperties().Select(p => new TelemetryPropertyViewModel { Name = p.DisplayName, Key = p.Key, Value = p.Value }) + ViewModel.LogEntry.ResourceView.AllProperties().Select(p => new TelemetryPropertyViewModel { Name = p.DisplayName, Key = p.Key, Value = p.Value }) .Where(ApplyFilter).AsQueryable(); private string _filter = ""; @@ -112,7 +112,7 @@ protected override void OnParametersSet() [KnownResourceFields.ServiceNameField] = new ComponentMetadata { Type = typeof(ResourceNameButtonValue), - Parameters = { ["Resource"] = _viewModel.LogEntry.ApplicationView.Application } + Parameters = { ["Resource"] = _viewModel.LogEntry.ResourceView.Resource } }, [KnownStructuredLogFields.LevelField] = new ComponentMetadata { diff --git a/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor b/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor index bea1e9c3d65..11273751e6f 100644 --- a/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor +++ b/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor @@ -19,7 +19,7 @@ TGridItem="ChartExemplar"> - + @GetTitle(context) diff --git a/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor.cs b/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor.cs index 0b79232a2ba..293bd0d0506 100644 --- a/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor.cs +++ b/src/Aspire.Dashboard/Components/Dialogs/ExemplarsDialog.razor.cs @@ -54,7 +54,7 @@ public async Task OnViewDetailsAsync(ChartExemplar exemplar) private string GetTitle(ChartExemplar exemplar) { return (exemplar.Span != null) - ? SpanWaterfallViewModel.GetTitle(exemplar.Span, Content.Applications) + ? SpanWaterfallViewModel.GetTitle(exemplar.Span, Content.Resources) : $"{Loc[nameof(Resources.Dialogs.ExemplarsDialogTrace)]}: {OtlpHelpers.ToShortenedId(exemplar.TraceId)}"; } diff --git a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor index f7f232cb3ad..cb6b7946089 100644 --- a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor +++ b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor @@ -110,7 +110,7 @@ ShowTimestamp="@_showTimestamp" IsTimestampUtc="@_isTimestampUtc" NoWrapLogs="@_noWrapLogs" - ApplicationName="@PageViewModel.SelectedResource?.Name"/> + ResourceName="@PageViewModel.SelectedResource?.Name"/>
diff --git a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs index 7914c9a40ba..5e0be53e8a8 100644 --- a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs @@ -259,7 +259,7 @@ void SetSelectedResourceOption(ResourceViewModel resource) private SelectViewModel GetSelectedOption() { Debug.Assert(_resources is not null); - return _resources.GetApplication(Logger, ResourceName, canSelectGrouping: false, fallback: _noSelection); + return _resources.GetResource(Logger, ResourceName, canSelectGrouping: false, fallback: _noSelection); } protected override async Task OnParametersSetAsync() @@ -451,26 +451,26 @@ internal static ImmutableList> GetConsoleLo .OrderBy(c => c.Value, ResourceViewModelNameComparer.Instance) .GroupBy(r => r.Value.DisplayName, StringComparers.ResourceName)) { - string applicationName; + string resourceName; if (grouping.Count() > 1) { - applicationName = grouping.Key; + resourceName = grouping.Key; builder.Add(new SelectViewModel { - Id = ResourceTypeDetails.CreateApplicationGrouping(applicationName, true), - Name = applicationName + Id = ResourceTypeDetails.CreateResourceGrouping(resourceName, true), + Name = resourceName }); } else { - applicationName = grouping.First().Value.DisplayName; + resourceName = grouping.First().Value.DisplayName; } foreach (var resource in grouping.Select(g => g.Value).OrderBy(r => r, ResourceViewModelNameComparer.Instance)) { - builder.Add(ToOption(resource, grouping.Count() > 1, applicationName)); + builder.Add(ToOption(resource, grouping.Count() > 1, resourceName)); } } @@ -488,11 +488,11 @@ internal static ImmutableList> GetConsoleLo return builder.ToImmutableList(); - SelectViewModel ToOption(ResourceViewModel resource, bool isReplica, string applicationName) + SelectViewModel ToOption(ResourceViewModel resource, bool isReplica, string resourceName) { var id = isReplica - ? ResourceTypeDetails.CreateReplicaInstance(resource.Name, applicationName) - : ResourceTypeDetails.CreateSingleton(resource.Name, applicationName); + ? ResourceTypeDetails.CreateReplicaInstance(resource.Name, resourceName) + : ResourceTypeDetails.CreateSingleton(resource.Name, resourceName); return new SelectViewModel { @@ -631,7 +631,7 @@ private void LoadLogs(ConsoleLogsSubscription newConsoleLogsSubscription) if (PageViewModel.SelectedOption.Id is not null && _consoleLogFilters.FilterResourceLogsDates.TryGetValue( - PageViewModel.SelectedOption.Id.GetApplicationKey().ToString(), + PageViewModel.SelectedOption.Id.GetResourceKey().ToString(), out var filterResourceLogsDate)) { // There is a filter for this individual resource. @@ -725,7 +725,7 @@ private async Task DownloadLogsAsync() await JS.InvokeVoidAsync("downloadStreamAsFile", fileName, streamReference); } - private async Task ClearConsoleLogs(ApplicationKey? key) + private async Task ClearConsoleLogs(ResourceKey? key) { var now = TimeProvider.GetUtcNow().UtcDateTime; if (key is null) @@ -808,8 +808,8 @@ public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) } else if (TryGetSingleResource() is { } r) { - // If there is no app selected and there is only one application available, select it. - viewModel.SelectedOption = _resources.GetApplication(Logger, r.Name, canSelectGrouping: false, fallback: _noSelection); + // If there is no resource selected and there is only one resource available, select it. + viewModel.SelectedOption = _resources.GetResource(Logger, r.Name, canSelectGrouping: false, fallback: _noSelection); viewModel.SelectedResource = r; return this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: false); } diff --git a/src/Aspire.Dashboard/Components/Pages/Metrics.razor b/src/Aspire.Dashboard/Components/Pages/Metrics.razor index 3bff9147e3a..6563271c8e0 100644 --- a/src/Aspire.Dashboard/Components/Pages/Metrics.razor +++ b/src/Aspire.Dashboard/Components/Pages/Metrics.razor @@ -1,7 +1,7 @@ @page "/metrics" -@page "/metrics/resource/{applicationName}" -@page "/metrics/resource/{applicationName}/meter/{meterName}" -@page "/metrics/resource/{applicationName}/meter/{meterName}/instrument/{instrumentName}" +@page "/metrics/resource/{resourceName}" +@page "/metrics/resource/{resourceName}/meter/{meterName}" +@page "/metrics/resource/{resourceName}/meter/{meterName}/instrument/{instrumentName}" @using Aspire.Dashboard.Model.Otlp @using Aspire.Dashboard.Otlp.Model @@ -13,7 +13,7 @@ @{ string? additionalText; - if (PageViewModel.SelectedApplication.Id is { ReplicaSetName: { } replicaSetName }) + if (PageViewModel.SelectedResource.Id is { ReplicaSetName: { } replicaSetName }) { additionalText = PageViewModel.SelectedInstrument is { } selectedInstrument ? $"{replicaSetName} - {selectedInstrument.Name}" @@ -41,17 +41,17 @@

@Loc[nameof(Dashboard.Resources.Metrics.MetricsHeader)]

- + SelectedResource="@PageViewModel.SelectedResource"/>
- @if (PageViewModel.SelectedApplication.Id?.ReplicaSetName != null && PageViewModel is { SelectedMeter: not null, SelectedInstrument: not null }) + @if (PageViewModel.SelectedResource.Id?.ReplicaSetName != null && PageViewModel is { SelectedMeter: not null, SelectedInstrument: not null }) { } else if (PageViewModel.SelectedMeter != null) @@ -126,7 +126,7 @@ TGridItem="OtlpInstrumentSummary"> - + @context.Name diff --git a/src/Aspire.Dashboard/Components/Pages/Metrics.razor.cs b/src/Aspire.Dashboard/Components/Pages/Metrics.razor.cs index 75adf834297..455083788a5 100644 --- a/src/Aspire.Dashboard/Components/Pages/Metrics.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/Metrics.razor.cs @@ -18,16 +18,16 @@ namespace Aspire.Dashboard.Components.Pages; public partial class Metrics : IDisposable, IComponentWithTelemetry, IPageWithSessionAndUrlState { - private SelectViewModel _selectApplication = null!; + private SelectViewModel _selectResource = null!; private List> _durations = null!; private static readonly TimeSpan s_defaultDuration = TimeSpan.FromMinutes(5); private AspirePageContentLayout? _contentLayout; private TreeMetricSelector? _treeMetricSelector; private readonly string _selectDurationId = $"select-duration-{Guid.NewGuid():N}"; - private List _applications = default!; - private List> _applicationViewModels = default!; - private Subscription? _applicationsSubscription; + private List _resources = default!; + private List> _resourceViewModels = default!; + private Subscription? _resourcesSubscription; private Subscription? _metricsSubscription; public string BasePath => DashboardUrls.MetricsBasePath; @@ -35,7 +35,7 @@ public partial class Metrics : IDisposable, IComponentWithTelemetry, IPageWithSe public MetricsViewModel PageViewModel { get; set; } = null!; [Parameter] - public string? ApplicationName { get; set; } + public string? ResourceName { get; set; } [Parameter] [SupplyParameterFromQuery(Name = "meter")] @@ -93,7 +93,7 @@ protected override void OnInitialized() new() { Name = Loc[nameof(Dashboard.Resources.Metrics.MetricsLastTwelveHours)], Id = TimeSpan.FromHours(12) }, }; - _selectApplication = new SelectViewModel + _selectResource = new SelectViewModel { Id = null, Name = ControlsStringsLoc[nameof(ControlsStrings.LabelNone)] @@ -101,15 +101,15 @@ protected override void OnInitialized() PageViewModel = new MetricsViewModel { - SelectedApplication = _selectApplication, + SelectedResource = _selectResource, SelectedDuration = _durations.Single(d => d.Id == s_defaultDuration), SelectedViewKind = null }; - UpdateApplications(); - _applicationsSubscription = TelemetryRepository.OnNewApplications(() => InvokeAsync(() => + UpdateResources(); + _resourcesSubscription = TelemetryRepository.OnNewResources(() => InvokeAsync(() => { - UpdateApplications(); + UpdateResources(); StateHasChanged(); })); } @@ -129,7 +129,7 @@ public MetricsPageState ConvertViewModelToSerializable() { return new MetricsPageState { - ApplicationName = PageViewModel.SelectedApplication.Id is not null ? PageViewModel.SelectedApplication.Name : null, + ResourceName = PageViewModel.SelectedResource.Id is not null ? PageViewModel.SelectedResource.Name : null, MeterName = PageViewModel.SelectedMeter?.Name, InstrumentName = PageViewModel.SelectedInstrument?.Name, DurationMinutes = (int)PageViewModel.SelectedDuration.Id.TotalMinutes, @@ -139,16 +139,16 @@ public MetricsPageState ConvertViewModelToSerializable() public Task UpdateViewModelFromQueryAsync(MetricsViewModel viewModel) { - if (ApplicationName is null && TryGetSingleResource() is { } r) + if (ResourceName is null && TryGetSingleResource() is { } r) { - // If there is no app selected and there is only one application available, select it. - PageViewModel.SelectedApplication = r; - ApplicationName = r.Name; + // If there is no resource selected and there is only one resource available, select it. + PageViewModel.SelectedResource = r; + ResourceName = r.Name; return this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: false); } viewModel.SelectedDuration = _durations.SingleOrDefault(d => (int)d.Id.TotalMinutes == DurationMinutes) ?? _durations.Single(d => d.Id == s_defaultDuration); - viewModel.SelectedApplication = _applicationViewModels.GetApplication(Logger, ApplicationName, canSelectGrouping: true, _selectApplication); + viewModel.SelectedResource = _resourceViewModels.GetResource(Logger, ResourceName, canSelectGrouping: true, _selectResource); UpdateInstruments(viewModel); @@ -168,35 +168,35 @@ public Task UpdateViewModelFromQueryAsync(MetricsViewModel viewModel) SelectViewModel? TryGetSingleResource() { - var apps = _applicationViewModels.Where(e => e != _selectApplication).ToList(); + var apps = _resourceViewModels.Where(e => e != _selectResource).ToList(); return apps.Count == 1 ? apps[0] : null; } } private void UpdateInstruments(MetricsViewModel viewModel) { - var selectedInstance = viewModel.SelectedApplication.Id?.GetApplicationKey(); + var selectedInstance = viewModel.SelectedResource.Id?.GetResourceKey(); viewModel.Instruments = selectedInstance != null ? TelemetryRepository.GetInstrumentsSummaries(selectedInstance.Value) : null; } - private void UpdateApplications() + private void UpdateResources() { - _applications = TelemetryRepository.GetApplications(); - _applicationViewModels = ApplicationsSelectHelpers.CreateApplications(_applications); + _resources = TelemetryRepository.GetResources(); + _resourceViewModels = ResourcesSelectHelpers.CreateResources(_resources); - if (_applicationViewModels.Count != 1) + if (_resourceViewModels.Count != 1) { - _applicationViewModels.Insert(0, _selectApplication); + _resourceViewModels.Insert(0, _selectResource); } else { - PageViewModel.SelectedApplication = _applicationViewModels.Single(); + PageViewModel.SelectedResource = _resourceViewModels.Single(); } UpdateSubscription(); } - private async Task HandleSelectedApplicationChangedAsync() + private async Task HandleSelectedResourceChangedAsync() { UpdateInstruments(PageViewModel); @@ -214,9 +214,9 @@ private async Task HandleSelectedApplicationChangedAsync() await this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: true); - // The mobile view doesn't update the URL when the application changes. + // The mobile view doesn't update the URL when the resource changes. // Because of this, the page doesn't autoamtically use updated instruments. - // Force the metrics tree to update so it re-renders with the new app's instruments. + // Force the metrics tree to update so it re-renders with the new resource's instruments. _treeMetricSelector?.OnResourceChanged(); } @@ -234,7 +234,7 @@ private bool ShouldClearSelectedMetrics(List instruments) return false; } - private Task ClearMetrics(ApplicationKey? key) + private Task ClearMetrics(ResourceKey? key) { TelemetryRepository.ClearMetrics(key); return Task.CompletedTask; @@ -257,7 +257,7 @@ public sealed class MetricsViewModel public FluentTreeItem? SelectedTreeItem { get; set; } public OtlpScope? SelectedMeter { get; set; } public OtlpInstrumentSummary? SelectedInstrument { get; set; } - public required SelectViewModel SelectedApplication { get; set; } + public required SelectViewModel SelectedResource { get; set; } public SelectViewModel SelectedDuration { get; set; } = null!; public List? Instruments { get; set; } public required MetricViewKind? SelectedViewKind { get; set; } @@ -265,7 +265,7 @@ public sealed class MetricsViewModel public class MetricsPageState { - public string? ApplicationName { get; set; } + public string? ResourceName { get; set; } public string? MeterName { get; set; } public string? InstrumentName { get; set; } public int DurationMinutes { get; set; } @@ -302,7 +302,7 @@ private Task HandleSelectedTreeItemChangedAsync() public string GetUrlFromSerializableViewModel(MetricsPageState serializable) { var url = DashboardUrls.MetricsUrl( - resource: serializable.ApplicationName, + resource: serializable.ResourceName, meter: serializable.MeterName, instrument: serializable.InstrumentName, duration: serializable.DurationMinutes, @@ -319,18 +319,18 @@ private async Task OnViewChangedAsync(MetricViewKind newView) private void UpdateSubscription() { - var selectedApplicationKey = PageViewModel.SelectedApplication.Id?.GetApplicationKey(); + var selectedResourceKey = PageViewModel.SelectedResource.Id?.GetResourceKey(); // Subscribe to updates. - if (_metricsSubscription is null || _metricsSubscription.ApplicationKey != selectedApplicationKey) + if (_metricsSubscription is null || _metricsSubscription.ResourceKey != selectedResourceKey) { _metricsSubscription?.Dispose(); - _metricsSubscription = TelemetryRepository.OnNewMetrics(selectedApplicationKey, SubscriptionType.Read, async () => + _metricsSubscription = TelemetryRepository.OnNewMetrics(selectedResourceKey, SubscriptionType.Read, async () => { - if (selectedApplicationKey != null) + if (selectedResourceKey != null) { // If there are more instruments than before then update the UI. - var instruments = TelemetryRepository.GetInstrumentsSummaries(selectedApplicationKey.Value); + var instruments = TelemetryRepository.GetInstrumentsSummaries(selectedResourceKey.Value); if (PageViewModel.Instruments is null || instruments.Count != PageViewModel.Instruments.Count) { @@ -344,7 +344,7 @@ private void UpdateSubscription() public void Dispose() { - _applicationsSubscription?.Dispose(); + _resourcesSubscription?.Dispose(); _metricsSubscription?.Dispose(); TelemetryContext.Dispose(); } @@ -355,7 +355,7 @@ public void Dispose() public void UpdateTelemetryProperties() { TelemetryContext.UpdateTelemetryProperties([ - new ComponentTelemetryProperty(TelemetryPropertyKeys.MetricsApplicationIsReplica, new AspireTelemetryProperty(PageViewModel.SelectedApplication.Id?.ReplicaSetName is not null)), + new ComponentTelemetryProperty(TelemetryPropertyKeys.MetricsResourceIsReplica, new AspireTelemetryProperty(PageViewModel.SelectedResource.Id?.ReplicaSetName is not null)), new ComponentTelemetryProperty(TelemetryPropertyKeys.MetricsInstrumentsCount, new AspireTelemetryProperty((PageViewModel.Instruments?.Count ?? -1).ToString(CultureInfo.InvariantCulture), AspireTelemetryPropertyType.Metric)), new ComponentTelemetryProperty(TelemetryPropertyKeys.MetricsSelectedDuration, new AspireTelemetryProperty(PageViewModel.SelectedDuration.Id.ToString(), AspireTelemetryPropertyType.UserSetting)), new ComponentTelemetryProperty(TelemetryPropertyKeys.MetricsSelectedView, new AspireTelemetryProperty(PageViewModel.SelectedViewKind?.ToString() ?? string.Empty, AspireTelemetryPropertyType.UserSetting)) diff --git a/src/Aspire.Dashboard/Components/Pages/Resources.razor b/src/Aspire.Dashboard/Components/Pages/Resources.razor index fa6c77155b6..64e1bc2c8d0 100644 --- a/src/Aspire.Dashboard/Components/Pages/Resources.razor +++ b/src/Aspire.Dashboard/Components/Pages/Resources.razor @@ -157,7 +157,7 @@ - + diff --git a/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs b/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs index 5b3b0f24626..cfe3c8dcee0 100644 --- a/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs @@ -38,7 +38,7 @@ public partial class Resources : ComponentBase, IComponentWithTelemetry, IAsyncD private EventCallback _onToggleCollapseAllCallback; private EventCallback _onToggleResourceTypeCallback; private bool _hideResourceGraph; - private Dictionary? _applicationUnviewedErrorCounts; + private Dictionary? _resourceUnviewedErrorCounts; [Inject] public required IDashboardClient DashboardClient { get; init; } @@ -194,7 +194,7 @@ protected override async Task OnInitializedAsync() SelectedViewKind = ResourceViewKind.Table }; - _applicationUnviewedErrorCounts = TelemetryRepository.GetApplicationUnviewedErrorLogsCount(); + _resourceUnviewedErrorCounts = TelemetryRepository.GetResourceUnviewedErrorLogsCount(); var showResourceTypeColumn = await SessionStorage.GetAsync(BrowserStorageKeys.ResourcesShowResourceTypes); if (showResourceTypeColumn.Success) @@ -225,12 +225,12 @@ protected override async Task OnInitializedAsync() _logsSubscription = TelemetryRepository.OnNewLogs(null, SubscriptionType.Other, async () => { - var newApplicationUnviewedErrorCounts = TelemetryRepository.GetApplicationUnviewedErrorLogsCount(); + var newResourceUnviewedErrorCounts = TelemetryRepository.GetResourceUnviewedErrorLogsCount(); // Only update UI if the error counts have changed. - if (ApplicationErrorCountsChanged(newApplicationUnviewedErrorCounts)) + if (ResourceErrorCountsChanged(newResourceUnviewedErrorCounts)) { - _applicationUnviewedErrorCounts = newApplicationUnviewedErrorCounts; + _resourceUnviewedErrorCounts = newResourceUnviewedErrorCounts; await InvokeAsync(_dataGrid.SafeRefreshDataAsync); } }); @@ -549,16 +549,16 @@ protected override async Task OnParametersSetAsync() UpdateTelemetryProperties(); } - private bool ApplicationErrorCountsChanged(Dictionary newApplicationUnviewedErrorCounts) + private bool ResourceErrorCountsChanged(Dictionary newResourceUnviewedErrorCounts) { - if (_applicationUnviewedErrorCounts == null || _applicationUnviewedErrorCounts.Count != newApplicationUnviewedErrorCounts.Count) + if (_resourceUnviewedErrorCounts == null || _resourceUnviewedErrorCounts.Count != newResourceUnviewedErrorCounts.Count) { return true; } - foreach (var (application, count) in newApplicationUnviewedErrorCounts) + foreach (var (resource, count) in newResourceUnviewedErrorCounts) { - if (!_applicationUnviewedErrorCounts.TryGetValue(application, out var oldCount) || oldCount != count) + if (!_resourceUnviewedErrorCounts.TryGetValue(resource, out var oldCount) || oldCount != count) { return true; } diff --git a/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor b/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor index 044d9c6b9bd..b0f800eeca6 100644 --- a/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor +++ b/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor @@ -1,5 +1,5 @@ @page "/structuredlogs" -@page "/structuredlogs/resource/{applicationName}" +@page "/structuredlogs/resource/{resourceName}" @using Aspire.Dashboard.Otlp.Model @using Aspire.Dashboard.Utils @@ -17,7 +17,7 @@ @@ -30,17 +30,17 @@

@Loc[nameof(Dashboard.Resources.StructuredLogs.StructuredLogsHeader)]

- + SelectedResource="@PageViewModel.SelectedResource" /> - - - @GetResourceName(context.ApplicationView) + + + @GetResourceName(context.ResourceView) diff --git a/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor.cs b/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor.cs index b909cd99683..67c7be305c7 100644 --- a/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor.cs @@ -29,16 +29,16 @@ public partial class StructuredLogs : IComponentWithTelemetry, IPageWithSessionA private const string TraceColumn = nameof(TraceColumn); private const string ActionsColumn = nameof(ActionsColumn); - private SelectViewModel _allApplication = default!; + private SelectViewModel _allResource = default!; private TotalItemsFooter _totalItemsFooter = default!; private int _totalItemsCount; - private List _applications = default!; - private List> _applicationViewModels = default!; + private List _resources = default!; + private List> _resourceViewModels = default!; private List> _logLevels = default!; - private Subscription? _applicationsSubscription; + private Subscription? _resourcesSubscription; private Subscription? _logsSubscription; - private bool _applicationChanged; + private bool _resourceChanged; private string? _elementIdBeforeDetailsViewOpened; private AspirePageContentLayout? _contentLayout; private string _filter = string.Empty; @@ -93,7 +93,7 @@ public partial class StructuredLogs : IComponentWithTelemetry, IPageWithSessionA public required ViewportInformation ViewportInformation { get; set; } [Parameter] - public string? ApplicationName { get; set; } + public string? ResourceName { get; set; } [Parameter] [SupplyParameterFromQuery] @@ -143,7 +143,7 @@ private async ValueTask> GetData(GridItems _totalItemsCount = logs.TotalItemCount; _totalItemsFooter.UpdateDisplayedCount(_totalItemsCount); - TelemetryRepository.MarkViewedErrorLogs(ViewModel.ApplicationKey); + TelemetryRepository.MarkViewedErrorLogs(ViewModel.ResourceKey); return GridItemsProviderResult.From(logs.Items, logs.TotalItemCount); } @@ -177,7 +177,7 @@ protected override void OnInitialized() }); } - _allApplication = new() + _allResource = new() { Id = null, Name = ControlsStringsLoc[nameof(Dashboard.Resources.ControlsStrings.LabelAll)] @@ -197,13 +197,13 @@ protected override void OnInitialized() PageViewModel = new StructuredLogsPageViewModel { SelectedLogLevel = _logLevels[0], - SelectedApplication = _allApplication + SelectedResource = _allResource }; - UpdateApplications(); - _applicationsSubscription = TelemetryRepository.OnNewApplications(() => InvokeAsync(() => + UpdateResources(); + _resourcesSubscription = TelemetryRepository.OnNewResources(() => InvokeAsync(() => { - UpdateApplications(); + UpdateResources(); StateHasChanged(); })); } @@ -219,23 +219,23 @@ protected override async Task OnParametersSetAsync() UpdateTelemetryProperties(); } - private void UpdateApplications() + private void UpdateResources() { - _applications = TelemetryRepository.GetApplications(); - _applicationViewModels = ApplicationsSelectHelpers.CreateApplications(_applications); - _applicationViewModels.Insert(0, _allApplication); + _resources = TelemetryRepository.GetResources(); + _resourceViewModels = ResourcesSelectHelpers.CreateResources(_resources); + _resourceViewModels.Insert(0, _allResource); } - private Task HandleSelectedApplicationChangedAsync() + private Task HandleSelectedResourceChangedAsync() { - _applicationChanged = true; + _resourceChanged = true; return this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: true); } private async Task HandleSelectedLogLevelChangedAsync() { - _applicationChanged = true; + _resourceChanged = true; await ClearSelectedLogEntryAsync(); await this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: true); @@ -244,10 +244,10 @@ private async Task HandleSelectedLogLevelChangedAsync() private void UpdateSubscription() { // Subscribe to updates. - if (_logsSubscription is null || _logsSubscription.ApplicationKey != PageViewModel.SelectedApplication.Id?.GetApplicationKey()) + if (_logsSubscription is null || _logsSubscription.ResourceKey != PageViewModel.SelectedResource.Id?.GetResourceKey()) { _logsSubscription?.Dispose(); - _logsSubscription = TelemetryRepository.OnNewLogs(PageViewModel.SelectedApplication.Id?.GetApplicationKey(), SubscriptionType.Read, async () => + _logsSubscription = TelemetryRepository.OnNewLogs(PageViewModel.SelectedResource.Id?.GetResourceKey(), SubscriptionType.Read, async () => { ViewModel.ClearData(); await InvokeAsync(_dataGrid.SafeRefreshDataAsync); @@ -307,7 +307,7 @@ private async Task OpenFilterAsync(TelemetryFilter? entry) var data = new FilterDialogViewModel { Filter = entry, - PropertyKeys = TelemetryRepository.GetLogPropertyKeys(PageViewModel.SelectedApplication.Id?.GetApplicationKey()), + PropertyKeys = TelemetryRepository.GetLogPropertyKeys(PageViewModel.SelectedResource.Id?.GetResourceKey()), KnownKeys = KnownStructuredLogFields.AllFields, GetFieldValues = TelemetryRepository.GetLogsFieldValues }; @@ -354,7 +354,7 @@ private async Task HandleAfterFilterBindAsync() await ClearSelectedLogEntryAsync(); } - private string GetResourceName(OtlpApplicationView app) => OtlpApplication.GetResourceName(app.Application, _applications); + private string GetResourceName(OtlpResourceView app) => OtlpResource.GetResourceName(app.Resource, _resources); private string GetRowClass(OtlpLogEntry entry) { @@ -381,10 +381,10 @@ private List GetFilterMenuItems() protected override async Task OnAfterRenderAsync(bool firstRender) { - if (_applicationChanged) + if (_resourceChanged) { await JS.InvokeVoidAsync("resetContinuousScrollPosition"); - _applicationChanged = false; + _resourceChanged = false; } if (firstRender) { @@ -411,7 +411,7 @@ private void OnBrowserResize(object? o, EventArgs args) public void Dispose() { - _applicationsSubscription?.Dispose(); + _resourcesSubscription?.Dispose(); _logsSubscription?.Dispose(); DimensionManager.OnViewportInformationChanged -= OnBrowserResize; TelemetryContext.Dispose(); @@ -422,7 +422,7 @@ public string GetUrlFromSerializableViewModel(StructuredLogsPageState serializab var filters = (serializable.Filters.Count > 0) ? TelemetryFilterFormatter.SerializeFiltersToString(serializable.Filters) : null; var url = DashboardUrls.StructuredLogsUrl( - resource: serializable.SelectedApplication, + resource: serializable.SelectedResource, logLevel: serializable.LogLevelText, filters: filters); @@ -434,15 +434,15 @@ public StructuredLogsPageState ConvertViewModelToSerializable() return new StructuredLogsPageState { LogLevelText = PageViewModel.SelectedLogLevel.Id?.ToString().ToLowerInvariant(), - SelectedApplication = PageViewModel.SelectedApplication.Id is not null ? PageViewModel.SelectedApplication.Name : null, + SelectedResource = PageViewModel.SelectedResource.Id is not null ? PageViewModel.SelectedResource.Name : null, Filters = ViewModel.Filters }; } public async Task UpdateViewModelFromQueryAsync(StructuredLogsPageViewModel viewModel) { - viewModel.SelectedApplication = _applicationViewModels.GetApplication(Logger, ApplicationName, canSelectGrouping: true, _allApplication); - ViewModel.ApplicationKey = PageViewModel.SelectedApplication.Id?.GetApplicationKey(); + viewModel.SelectedResource = _resourceViewModels.GetResource(Logger, ResourceName, canSelectGrouping: true, _allResource); + ViewModel.ResourceKey = PageViewModel.SelectedResource.Id?.GetResourceKey(); if (LogLevelText is not null && Enum.TryParse(LogLevelText, ignoreCase: true, out var logLevel)) { @@ -472,7 +472,7 @@ public async Task UpdateViewModelFromQueryAsync(StructuredLogsPageViewModel view await InvokeAsync(_dataGrid.SafeRefreshDataAsync); } - private Task ClearStructureLogs(ApplicationKey? key) + private Task ClearStructureLogs(ResourceKey? key) { TelemetryRepository.ClearStructuredLogs(key); return Task.CompletedTask; @@ -480,13 +480,13 @@ private Task ClearStructureLogs(ApplicationKey? key) public class StructuredLogsPageViewModel { - public required SelectViewModel SelectedApplication { get; set; } + public required SelectViewModel SelectedResource { get; set; } public SelectViewModel SelectedLogLevel { get; set; } = default!; } public class StructuredLogsPageState { - public string? SelectedApplication { get; set; } + public string? SelectedResource { get; set; } public string? LogLevelText { get; set; } public required IReadOnlyCollection Filters { get; set; } } diff --git a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor index 524bbe2ca13..3f06783c978 100644 --- a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor +++ b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor @@ -113,7 +113,7 @@ ShowHover="true" ItemKey="@(r => r.Span.SpanId)" OnRowClick="@(r => r.ExecuteOnDefault(d => OnShowPropertiesAsync(d, buttonId: null)))"> - + @{ var isServerOrConsumer = context.Span.Kind == OtlpSpanKind.Server || context.Span.Kind == OtlpSpanKind.Consumer; // Indent the span name based on the depth of the span. @@ -270,7 +270,7 @@
- @SpanWaterfallViewModel.GetTitle(context.Span, _applications) + @SpanWaterfallViewModel.GetTitle(context.Span, _resources) @DurationFormatter.FormatDuration(context.Span.Duration)
diff --git a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs index f78674e2e9f..fe9acbf9762 100644 --- a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs @@ -30,7 +30,7 @@ public partial class TraceDetail : ComponentBase, IComponentWithTelemetry, IDisp private List? _spanWaterfallViewModels; private int _maxDepth; private int _resourceCount; - private List _applications = default!; + private List _resources = default!; private readonly List _collapsedSpanIds = []; private string? _elementIdBeforeDetailsViewOpened; private FluentDataGrid _dataGrid = null!; @@ -175,7 +175,7 @@ protected override async Task OnParametersSetAsync() private void UpdateDetailViewData() { - _applications = TelemetryRepository.GetApplications(); + _resources = TelemetryRepository.GetResources(); Logger.LogInformation("Getting trace '{TraceId}'.", TraceId); _trace = (TraceId != null) ? TelemetryRepository.GetTrace(TraceId) : null; @@ -194,7 +194,7 @@ private void UpdateDetailViewData() // If there are performance issues with displaying all logs then consider adding a limit to this query. var logsContext = new GetLogsContext { - ApplicationKey = null, + ResourceKey = null, Count = int.MaxValue, StartIndex = 0, Filters = [new TelemetryFilter @@ -210,10 +210,10 @@ private void UpdateDetailViewData() _spanWaterfallViewModels = SpanWaterfallViewModel.Create(_trace, result.Items, new SpanWaterfallViewModel.TraceDetailState(OutgoingPeerResolvers.ToArray(), _collapsedSpanIds)); _maxDepth = _spanWaterfallViewModels.Max(s => s.Depth); - var apps = new HashSet(); + var apps = new HashSet(); foreach (var span in _trace.Spans) { - apps.Add(span.Source.Application); + apps.Add(span.Source.Resource); if (span.UninstrumentedPeer != null) { apps.Add(span.UninstrumentedPeer); @@ -238,10 +238,10 @@ private void UpdateSubscription() return; } - if (_tracesSubscription is null || _tracesSubscription.ApplicationKey != _trace.FirstSpan.Source.ApplicationKey) + if (_tracesSubscription is null || _tracesSubscription.ResourceKey != _trace.FirstSpan.Source.ResourceKey) { _tracesSubscription?.Dispose(); - _tracesSubscription = TelemetryRepository.OnNewTraces(_trace.FirstSpan.Source.ApplicationKey, SubscriptionType.Read, () => InvokeAsync(async () => + _tracesSubscription = TelemetryRepository.OnNewTraces(_trace.FirstSpan.Source.ResourceKey, SubscriptionType.Read, () => InvokeAsync(async () => { if (_trace == null) { @@ -321,9 +321,9 @@ private async Task OnShowPropertiesAsync(SpanWaterfallViewModel viewModel, strin var spanDetailsViewModel = new SpanDetailsViewModel { Span = viewModel.Span, - Applications = _applications, + Resources = _resources, Properties = entryProperties, - Title = SpanWaterfallViewModel.GetTitle(viewModel.Span, _applications), + Title = SpanWaterfallViewModel.GetTitle(viewModel.Span, _resources), Links = links, Backlinks = backlinks, }; @@ -364,7 +364,7 @@ private async Task ClearSelectedSpanAsync(bool causedByUserAction = false) _elementIdBeforeDetailsViewOpened = null; } - private string GetResourceName(OtlpApplicationView app) => OtlpApplication.GetResourceName(app, _applications); + private string GetResourceName(OtlpResourceView app) => OtlpResource.GetResourceName(app, _resources); private async Task ToggleSpanLogsAsync(OtlpLogEntry logEntry) { diff --git a/src/Aspire.Dashboard/Components/Pages/Traces.razor b/src/Aspire.Dashboard/Components/Pages/Traces.razor index f86ae4a4da3..7ac94b4a9a8 100644 --- a/src/Aspire.Dashboard/Components/Pages/Traces.razor +++ b/src/Aspire.Dashboard/Components/Pages/Traces.razor @@ -1,5 +1,5 @@ @page "/traces" -@page "/traces/resource/{applicationName}" +@page "/traces/resource/{resourceName}" @using Aspire.Dashboard.Model @using Aspire.Dashboard.Otlp.Model @@ -18,7 +18,7 @@ @@ -29,17 +29,17 @@

@Loc[nameof(Dashboard.Resources.Traces.TracesHeader)]

- + SelectedResource="@PageViewModel.SelectedResource" /> - @foreach (var item in TraceHelpers.GetOrderedApplications(context)) + @foreach (var item in TraceHelpers.GetOrderedResources(context)) { - + @if (item.ErroredSpans > 0) { } - @GetResourceName(item.Application) (@item.TotalSpans) + @GetResourceName(item.Resource) (@item.TotalSpans) } diff --git a/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs b/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs index 9e3d1936d91..a32642a8c16 100644 --- a/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs @@ -28,15 +28,15 @@ public partial class Traces : IComponentWithTelemetry, IPageWithSessionAndUrlSta private const string DurationColumn = nameof(DurationColumn); private const string ActionsColumn = nameof(ActionsColumn); private IList _gridColumns = null!; - private SelectViewModel _allApplication = null!; + private SelectViewModel _allResource = null!; private TotalItemsFooter _totalItemsFooter = default!; private int _totalItemsCount; - private List _applications = default!; - private List> _applicationViewModels = default!; - private Subscription? _applicationsSubscription; + private List _resources = default!; + private List> _resourceViewModels = default!; + private Subscription? _resourcesSubscription; private Subscription? _tracesSubscription; - private bool _applicationChanged; + private bool _resourceChanged; private string _filter = string.Empty; private AspirePageContentLayout? _contentLayout; private FluentDataGrid _dataGrid = null!; @@ -50,7 +50,7 @@ public partial class Traces : IComponentWithTelemetry, IPageWithSessionAndUrlSta public TracesPageViewModel PageViewModel { get; set; } = null!; [Parameter] - public string? ApplicationName { get; set; } + public string? ResourceName { get; set; } [Inject] public required TelemetryRepository TelemetryRepository { get; init; } @@ -103,12 +103,12 @@ private string GetNameTooltip(OtlpTrace trace) return tooltip; } - private string GetSpansTooltip(OrderedApplication applicationSpans) + private string GetSpansTooltip(OrderedResource resourceSpans) { - var count = applicationSpans.TotalSpans; - var errorCount = applicationSpans.ErroredSpans; + var count = resourceSpans.TotalSpans; + var errorCount = resourceSpans.ErroredSpans; - var tooltip = string.Format(CultureInfo.InvariantCulture, Loc[nameof(Dashboard.Resources.Traces.TracesResourceSpans)], GetResourceName(applicationSpans.Application)); + var tooltip = string.Format(CultureInfo.InvariantCulture, Loc[nameof(Dashboard.Resources.Traces.TracesResourceSpans)], GetResourceName(resourceSpans.Resource)); tooltip += Environment.NewLine + string.Format(CultureInfo.InvariantCulture, Loc[nameof(Dashboard.Resources.Traces.TracesTotalTraces)], count); if (errorCount > 0) { @@ -161,13 +161,13 @@ protected override void OnInitialized() new GridColumn(Name: ActionsColumn, DesktopWidth: "0.5fr", MobileWidth: "1fr") ]; - _allApplication = new SelectViewModel { Id = null, Name = ControlsStringsLoc[name: nameof(ControlsStrings.LabelAll)] }; - PageViewModel = new TracesPageViewModel { SelectedApplication = _allApplication }; + _allResource = new SelectViewModel { Id = null, Name = ControlsStringsLoc[name: nameof(ControlsStrings.LabelAll)] }; + PageViewModel = new TracesPageViewModel { SelectedResource = _allResource }; - UpdateApplications(); - _applicationsSubscription = TelemetryRepository.OnNewApplications(callback: () => InvokeAsync(workItem: () => + UpdateResources(); + _resourcesSubscription = TelemetryRepository.OnNewResources(callback: () => InvokeAsync(workItem: () => { - UpdateApplications(); + UpdateResources(); StateHasChanged(); })); } @@ -179,35 +179,35 @@ protected override async Task OnParametersSetAsync() return; } - TracesViewModel.ApplicationKey = PageViewModel.SelectedApplication.Id?.GetApplicationKey(); + TracesViewModel.ResourceKey = PageViewModel.SelectedResource.Id?.GetResourceKey(); UpdateSubscription(); } - private void UpdateApplications() + private void UpdateResources() { - _applications = TelemetryRepository.GetApplications(includeUninstrumentedPeers: true); - _applicationViewModels = ApplicationsSelectHelpers.CreateApplications(_applications); - _applicationViewModels.Insert(0, _allApplication); + _resources = TelemetryRepository.GetResources(includeUninstrumentedPeers: true); + _resourceViewModels = ResourcesSelectHelpers.CreateResources(_resources); + _resourceViewModels.Insert(0, _allResource); UpdateSubscription(); } - private Task HandleSelectedApplicationChanged() + private Task HandleSelectedResourceChanged() { - _applicationChanged = true; + _resourceChanged = true; return this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: true); } private void UpdateSubscription() { - var selectedApplicationKey = PageViewModel.SelectedApplication.Id?.GetApplicationKey(); + var selectedResourceKey = PageViewModel.SelectedResource.Id?.GetResourceKey(); // Subscribe to updates. - if (_tracesSubscription is null || _tracesSubscription.ApplicationKey != selectedApplicationKey) + if (_tracesSubscription is null || _tracesSubscription.ResourceKey != selectedResourceKey) { _tracesSubscription?.Dispose(); - _tracesSubscription = TelemetryRepository.OnNewTraces(selectedApplicationKey, SubscriptionType.Read, async () => + _tracesSubscription = TelemetryRepository.OnNewTraces(selectedResourceKey, SubscriptionType.Read, async () => { TracesViewModel.ClearData(); await InvokeAsync(_dataGrid.SafeRefreshDataAsync); @@ -221,8 +221,8 @@ private async Task HandleAfterFilterBindAsync() await InvokeAsync(_dataGrid.SafeRefreshDataAsync); } - private string GetResourceName(OtlpApplication app) => OtlpApplication.GetResourceName(app, _applications); - private string GetResourceName(OtlpApplicationView app) => OtlpApplication.GetResourceName(app, _applications); + private string GetResourceName(OtlpResource app) => OtlpResource.GetResourceName(app, _resources); + private string GetResourceName(OtlpResourceView app) => OtlpResource.GetResourceName(app, _resources); private static string GetRowClass(OtlpTrace entry) { @@ -236,10 +236,10 @@ private static string GetRowClass(OtlpTrace entry) protected override async Task OnAfterRenderAsync(bool firstRender) { - if (_applicationChanged) + if (_resourceChanged) { await JS.InvokeVoidAsync("resetContinuousScrollPosition"); - _applicationChanged = false; + _resourceChanged = false; } if (firstRender) { @@ -266,15 +266,15 @@ private void OnBrowserResize(object? o, EventArgs args) public void Dispose() { - _applicationsSubscription?.Dispose(); + _resourcesSubscription?.Dispose(); _tracesSubscription?.Dispose(); DimensionManager.OnViewportInformationChanged -= OnBrowserResize; } public async Task UpdateViewModelFromQueryAsync(TracesPageViewModel viewModel) { - viewModel.SelectedApplication = _applicationViewModels.GetApplication(Logger, ApplicationName, canSelectGrouping: true, _allApplication); - TracesViewModel.ApplicationKey = PageViewModel.SelectedApplication.Id?.GetApplicationKey(); + viewModel.SelectedResource = _resourceViewModels.GetResource(Logger, ResourceName, canSelectGrouping: true, _allResource); + TracesViewModel.ResourceKey = PageViewModel.SelectedResource.Id?.GetResourceKey(); if (SerializedFilters is not null) { @@ -298,7 +298,7 @@ public string GetUrlFromSerializableViewModel(TracesPageState serializable) var filters = (serializable.Filters.Count > 0) ? TelemetryFilterFormatter.SerializeFiltersToString(serializable.Filters) : null; return DashboardUrls.TracesUrl( - resource: serializable.SelectedApplication, + resource: serializable.SelectedResource, filters: filters); } @@ -306,7 +306,7 @@ public TracesPageState ConvertViewModelToSerializable() { return new TracesPageState { - SelectedApplication = PageViewModel.SelectedApplication.Id is not null ? PageViewModel.SelectedApplication.Name : null, + SelectedResource = PageViewModel.SelectedResource.Id is not null ? PageViewModel.SelectedResource.Name : null, Filters = TracesViewModel.Filters }; } @@ -332,7 +332,7 @@ private async Task OpenFilterAsync(TelemetryFilter? entry) var data = new FilterDialogViewModel { Filter = entry, - PropertyKeys = TelemetryRepository.GetTracePropertyKeys(PageViewModel.SelectedApplication.Id?.GetApplicationKey()), + PropertyKeys = TelemetryRepository.GetTracePropertyKeys(PageViewModel.SelectedResource.Id?.GetResourceKey()), KnownKeys = KnownTraceFields.AllFields, GetFieldValues = TelemetryRepository.GetTraceFieldValues }; @@ -364,7 +364,7 @@ private async Task HandleFilterDialog(DialogResult result) await this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: false); } - private Task ClearTraces(ApplicationKey? key) + private Task ClearTraces(ResourceKey? key) { TelemetryRepository.ClearTraces(key); return Task.CompletedTask; @@ -383,12 +383,12 @@ private List GetFilterMenuItems() public class TracesPageViewModel { - public required SelectViewModel SelectedApplication { get; set; } + public required SelectViewModel SelectedResource { get; set; } } public class TracesPageState { - public string? SelectedApplication { get; set; } + public string? SelectedResource { get; set; } public required IReadOnlyCollection Filters { get; set; } } diff --git a/src/Aspire.Dashboard/Components/ResourcesGridColumns/StateColumnDisplay.razor.cs b/src/Aspire.Dashboard/Components/ResourcesGridColumns/StateColumnDisplay.razor.cs index 2511ad3b9ad..1eb08823740 100644 --- a/src/Aspire.Dashboard/Components/ResourcesGridColumns/StateColumnDisplay.razor.cs +++ b/src/Aspire.Dashboard/Components/ResourcesGridColumns/StateColumnDisplay.razor.cs @@ -15,7 +15,7 @@ public partial class StateColumnDisplay public required ResourceViewModel Resource { get; set; } [Parameter, EditorRequired] - public required Dictionary? UnviewedErrorCounts { get; set; } + public required Dictionary? UnviewedErrorCounts { get; set; } [Inject] public required IStringLocalizer Loc { get; init; } diff --git a/src/Aspire.Dashboard/Components/ResourcesGridColumns/UnreadLogErrorsBadge.razor.cs b/src/Aspire.Dashboard/Components/ResourcesGridColumns/UnreadLogErrorsBadge.razor.cs index d67e5495c40..9db58df002f 100644 --- a/src/Aspire.Dashboard/Components/ResourcesGridColumns/UnreadLogErrorsBadge.razor.cs +++ b/src/Aspire.Dashboard/Components/ResourcesGridColumns/UnreadLogErrorsBadge.razor.cs @@ -10,50 +10,51 @@ namespace Aspire.Dashboard.Components; public partial class UnreadLogErrorsBadge { - private string? _applicationName; + private string? _resourceName; private int _unviewedCount; [Parameter, EditorRequired] public required ResourceViewModel Resource { get; set; } + [Parameter, EditorRequired] - public required Dictionary? UnviewedErrorCounts { get; set; } + public required Dictionary? UnviewedErrorCounts { get; set; } [Inject] public required TelemetryRepository TelemetryRepository { get; init; } protected override void OnParametersSet() { - (_applicationName, _unviewedCount) = GetUnviewedErrorCount(Resource); + (_resourceName, _unviewedCount) = GetUnviewedErrorCount(Resource); } - private (string? applicationName, int unviewedErrorCount) GetUnviewedErrorCount(ResourceViewModel resource) + private (string? resourceName, int unviewedErrorCount) GetUnviewedErrorCount(ResourceViewModel resource) { if (UnviewedErrorCounts is null) { return (null, 0); } - var application = TelemetryRepository.GetApplicationByCompositeName(resource.Name); - if (application is null) + var otlpResource = TelemetryRepository.GetResourceByCompositeName(resource.Name); + if (otlpResource is null) { return (null, 0); } - if (!UnviewedErrorCounts.TryGetValue(application.ApplicationKey, out var count) || count == 0) + if (!UnviewedErrorCounts.TryGetValue(otlpResource.ResourceKey, out var count) || count == 0) { return (null, 0); } - var applications = TelemetryRepository.GetApplications(); - var applicationName = applications.Count(a => a.ApplicationName == application.ApplicationName) > 1 - ? application.InstanceId - : application.ApplicationName; + var resources = TelemetryRepository.GetResources(); + var resourceName = resources.Count(a => a.ResourceName == otlpResource.ResourceName) > 1 + ? otlpResource.InstanceId + : otlpResource.ResourceName; - return (applicationName, count); + return (resourceName, count); } private string GetResourceErrorStructuredLogsUrl() { - return DashboardUrls.StructuredLogsUrl(resource: _applicationName, logLevel: "error"); + return DashboardUrls.StructuredLogsUrl(resource: _resourceName, logLevel: "error"); } } diff --git a/src/Aspire.Dashboard/Model/ExemplarsDialogViewModel.cs b/src/Aspire.Dashboard/Model/ExemplarsDialogViewModel.cs index a4825ccd918..1ff99405296 100644 --- a/src/Aspire.Dashboard/Model/ExemplarsDialogViewModel.cs +++ b/src/Aspire.Dashboard/Model/ExemplarsDialogViewModel.cs @@ -9,6 +9,6 @@ namespace Aspire.Dashboard.Model; public sealed class ExemplarsDialogViewModel { public required List Exemplars { get; init; } - public required List Applications { get; init; } + public required List Resources { get; init; } public required OtlpInstrumentSummary Instrument { get; init; } } diff --git a/src/Aspire.Dashboard/Model/Otlp/ApplicationsSelectHelpers.cs b/src/Aspire.Dashboard/Model/Otlp/ResourcesSelectHelpers.cs similarity index 57% rename from src/Aspire.Dashboard/Model/Otlp/ApplicationsSelectHelpers.cs rename to src/Aspire.Dashboard/Model/Otlp/ResourcesSelectHelpers.cs index bcf005b60b1..5fb9b28d07f 100644 --- a/src/Aspire.Dashboard/Model/Otlp/ApplicationsSelectHelpers.cs +++ b/src/Aspire.Dashboard/Model/Otlp/ResourcesSelectHelpers.cs @@ -5,16 +5,16 @@ namespace Aspire.Dashboard.Model.Otlp; -public static class ApplicationsSelectHelpers +public static class ResourcesSelectHelpers { - public static SelectViewModel GetApplication(this ICollection> applications, ILogger logger, string? name, bool canSelectGrouping, SelectViewModel fallback) + public static SelectViewModel GetResource(this ICollection> resources, ILogger logger, string? name, bool canSelectGrouping, SelectViewModel fallback) { if (name is null) { return fallback; } - var allowedMatches = applications.Where(e => SupportType(e.Id?.Type, canSelectGrouping)).ToList(); + var allowedMatches = resources.Where(e => SupportType(e.Id?.Type, canSelectGrouping)).ToList(); // First attempt an exact match on the instance id. var instanceIdMatches = allowedMatches.Where(e => string.Equals(name, e.Id?.InstanceId, StringComparisons.ResourceName)).ToList(); @@ -24,8 +24,8 @@ public static SelectViewModel GetApplication(this ICollecti } else if (instanceIdMatches.Count == 0) { - // Fallback to matching on app name. This is commonly used when there is only one instance of the app. - var replicaSetMatches = allowedMatches.Where(e => e.Id?.Type != OtlpApplicationType.Instance && string.Equals(name, e.Id?.ReplicaSetName, StringComparisons.ResourceName)).ToList(); + // Fallback to matching on resource name. This is commonly used when there is only one instance of the resource. + var replicaSetMatches = allowedMatches.Where(e => e.Id?.Type != OtlpResourceType.Instance && string.Equals(name, e.Id?.ReplicaSetName, StringComparisons.ResourceName)).ToList(); if (replicaSetMatches.Count == 1) { @@ -46,39 +46,39 @@ public static SelectViewModel GetApplication(this ICollecti return MultipleMatches(allowedMatches, logger, name, instanceIdMatches); } - static SelectViewModel MultipleMatches(ICollection> applications, ILogger logger, string name, List> matches) + static SelectViewModel MultipleMatches(ICollection> resources, ILogger logger, string name, List> matches) { - // There are multiple matches. Log as much information as possible about applications. + // There are multiple matches. Log as much information as possible about resources. logger.LogWarning( """ - Multiple matches found when getting application '{Name}'. - Available applications: - {AvailableApplications} - Matched applications: - {MatchedApplications} - """, name, string.Join(Environment.NewLine, applications), string.Join(Environment.NewLine, matches)); + Multiple matches found when getting resource '{Name}'. + Available resources: + {AvailableResources} + Matched resources: + {MatchedResources} + """, name, string.Join(Environment.NewLine, resources), string.Join(Environment.NewLine, matches)); // Return first match to not break app. Make the UI resilient to unexpectedly bad data. return matches[0]; } } - public static List> CreateApplications(List applications) + public static List> CreateResources(List resources) { - var replicasByApplicationName = OtlpApplication.GetReplicasByApplicationName(applications); + var replicasByResourceName = OtlpResource.GetReplicasByResourceName(resources); var selectViewModels = new List>(); - foreach (var (applicationName, replicas) in replicasByApplicationName) + foreach (var (resourceName, replicas) in replicasByResourceName) { if (replicas.Count == 1) { // not replicated - var app = replicas.Single(); + var resource = replicas.Single(); selectViewModels.Add(new SelectViewModel { - Id = ResourceTypeDetails.CreateSingleton($"{applicationName}-{app.InstanceId}", applicationName), - Name = applicationName + Id = ResourceTypeDetails.CreateSingleton($"{resourceName}-{resource.InstanceId}", resourceName), + Name = resourceName }); continue; @@ -87,16 +87,16 @@ public static List> CreateApplications(List // add a disabled "Resource" as a header selectViewModels.Add(new SelectViewModel { - Id = ResourceTypeDetails.CreateApplicationGrouping(applicationName, isReplicaSet: true), - Name = applicationName + Id = ResourceTypeDetails.CreateResourceGrouping(resourceName, isReplicaSet: true), + Name = resourceName }); // add each individual replica selectViewModels.AddRange(replicas.Select(replica => new SelectViewModel { - Id = ResourceTypeDetails.CreateReplicaInstance($"{applicationName}-{replica.InstanceId}", applicationName), - Name = OtlpApplication.GetResourceName(replica, applications) + Id = ResourceTypeDetails.CreateReplicaInstance($"{resourceName}-{replica.InstanceId}", resourceName), + Name = OtlpResource.GetResourceName(replica, resources) })); } @@ -104,14 +104,14 @@ public static List> CreateApplications(List return sortedVMs; } - private static bool SupportType(OtlpApplicationType? type, bool canSelectGrouping) + private static bool SupportType(OtlpResourceType? type, bool canSelectGrouping) { - if (type is OtlpApplicationType.Instance or OtlpApplicationType.Singleton) + if (type is OtlpResourceType.Instance or OtlpResourceType.Singleton) { return true; } - if (canSelectGrouping && type is OtlpApplicationType.ResourceGrouping) + if (canSelectGrouping && type is OtlpResourceType.ResourceGrouping) { return true; } diff --git a/src/Aspire.Dashboard/Model/Otlp/SpanWaterfallViewModel.cs b/src/Aspire.Dashboard/Model/Otlp/SpanWaterfallViewModel.cs index 2fbc725c7c7..f0c020ec6dc 100644 --- a/src/Aspire.Dashboard/Model/Otlp/SpanWaterfallViewModel.cs +++ b/src/Aspire.Dashboard/Model/Otlp/SpanWaterfallViewModel.cs @@ -31,9 +31,9 @@ public bool IsCollapsed } } - public string GetTooltip(List allApplications) + public string GetTooltip(List allResources) { - var tooltip = GetTitle(Span, allApplications); + var tooltip = GetTitle(Span, allResources); if (IsError) { tooltip += Environment.NewLine + "Status = Error"; @@ -46,7 +46,7 @@ public string GetTooltip(List allApplications) return tooltip; } - public bool MatchesFilter(string filter, Func getResourceName, [NotNullWhen(true)] out IEnumerable? matchedDescendents) + public bool MatchesFilter(string filter, Func getResourceName, [NotNullWhen(true)] out IEnumerable? matchedDescendents) { if (Filter(this)) { @@ -110,9 +110,9 @@ private void UpdateHidden(bool isParentCollapsed = false) public sealed record TraceDetailState(IOutgoingPeerResolver[] OutgoingPeerResolvers, List CollapsedSpanIds); - public static string GetTitle(OtlpSpan span, List allApplications) + public static string GetTitle(OtlpSpan span, List allResources) { - return $"{OtlpApplication.GetResourceName(span.Source, allApplications)}: {span.GetDisplaySummary()}"; + return $"{OtlpResource.GetResourceName(span.Source, allResources)}: {span.GetDisplaySummary()}"; } public static List Create(OtlpTrace trace, List logs, TraceDetailState state) @@ -205,7 +205,7 @@ static double CalculatePercent(double value, double total) private static string? ResolveUninstrumentedPeerName(OtlpSpan span, IOutgoingPeerResolver[] outgoingPeerResolvers) { - if (span.UninstrumentedPeer?.ApplicationName is { } peerName) + if (span.UninstrumentedPeer?.ResourceName is { } peerName) { // If the span has a peer name, use it. return peerName; diff --git a/src/Aspire.Dashboard/Model/Otlp/TelemetryFilter.cs b/src/Aspire.Dashboard/Model/Otlp/TelemetryFilter.cs index 5ec71da1a96..62966d253c7 100644 --- a/src/Aspire.Dashboard/Model/Otlp/TelemetryFilter.cs +++ b/src/Aspire.Dashboard/Model/Otlp/TelemetryFilter.cs @@ -36,7 +36,7 @@ public static string ResolveFieldName(string name) KnownTraceFields.KindField => "Kind", KnownTraceFields.StatusField => "Status", KnownSourceFields.NameField => "Source", - KnownResourceFields.ServiceNameField => "Application", + KnownResourceFields.ServiceNameField => "Resource", _ => name }; } diff --git a/src/Aspire.Dashboard/Model/ResourceMenuItems.cs b/src/Aspire.Dashboard/Model/ResourceMenuItems.cs index d39148fe436..321b934453f 100644 --- a/src/Aspire.Dashboard/Model/ResourceMenuItems.cs +++ b/src/Aspire.Dashboard/Model/ResourceMenuItems.cs @@ -57,12 +57,12 @@ public static void AddMenuItems( } // Show telemetry menu items if there is telemetry for the resource. - var telemetryApplication = telemetryRepository.GetApplicationByCompositeName(resource.Name); - if (telemetryApplication != null) + var telemetryResource = telemetryRepository.GetResourceByCompositeName(resource.Name); + if (telemetryResource != null) { menuItems.Add(new MenuButtonItem { IsDivider = true }); - if (!telemetryApplication.UninstrumentedPeer) + if (!telemetryResource.UninstrumentedPeer) { menuItems.Add(new MenuButtonItem { @@ -89,7 +89,7 @@ public static void AddMenuItems( } }); - if (!telemetryApplication.UninstrumentedPeer) + if (!telemetryResource.UninstrumentedPeer) { menuItems.Add(new MenuButtonItem { diff --git a/src/Aspire.Dashboard/Model/ResourceTypeDetails.cs b/src/Aspire.Dashboard/Model/ResourceTypeDetails.cs index 62324eb5917..f33503f3e23 100644 --- a/src/Aspire.Dashboard/Model/ResourceTypeDetails.cs +++ b/src/Aspire.Dashboard/Model/ResourceTypeDetails.cs @@ -10,44 +10,44 @@ namespace Aspire.Dashboard.Model; [DebuggerDisplay("Type = {Type}, InstanceId = {InstanceId}, ReplicaSetName = {ReplicaSetName}")] public class ResourceTypeDetails : IEquatable { - private ResourceTypeDetails(OtlpApplicationType type, string? instanceId, string? replicaSetName) + private ResourceTypeDetails(OtlpResourceType type, string? instanceId, string? replicaSetName) { Type = type; InstanceId = instanceId; ReplicaSetName = replicaSetName; } - public OtlpApplicationType Type { get; } + public OtlpResourceType Type { get; } public string? InstanceId { get; } public string? ReplicaSetName { get; } - public ApplicationKey GetApplicationKey() + public ResourceKey GetResourceKey() { if (ReplicaSetName == null) { - throw new InvalidOperationException($"Can't get ApplicationKey from resource type details '{ToString()}' because {nameof(ReplicaSetName)} is null."); + throw new InvalidOperationException($"Can't get ResourceKey from resource type details '{ToString()}' because {nameof(ReplicaSetName)} is null."); } if (InstanceId is null) { - return new ApplicationKey(ReplicaSetName, InstanceId: null); + return new ResourceKey(ReplicaSetName, InstanceId: null); } - return ApplicationKey.Create(name: ReplicaSetName, instanceId: InstanceId); + return ResourceKey.Create(name: ReplicaSetName, instanceId: InstanceId); } - public static ResourceTypeDetails CreateApplicationGrouping(string groupingName, bool isReplicaSet) + public static ResourceTypeDetails CreateResourceGrouping(string groupingName, bool isReplicaSet) { - return new ResourceTypeDetails(OtlpApplicationType.ResourceGrouping, instanceId: null, replicaSetName: isReplicaSet ? groupingName : null); + return new ResourceTypeDetails(OtlpResourceType.ResourceGrouping, instanceId: null, replicaSetName: isReplicaSet ? groupingName : null); } public static ResourceTypeDetails CreateSingleton(string instanceId, string replicaSetName) { - return new ResourceTypeDetails(OtlpApplicationType.Singleton, instanceId, replicaSetName: replicaSetName); + return new ResourceTypeDetails(OtlpResourceType.Singleton, instanceId, replicaSetName: replicaSetName); } public static ResourceTypeDetails CreateReplicaInstance(string instanceId, string replicaSetName) { - return new ResourceTypeDetails(OtlpApplicationType.Instance, instanceId, replicaSetName); + return new ResourceTypeDetails(OtlpResourceType.Instance, instanceId, replicaSetName); } public override string ToString() diff --git a/src/Aspire.Dashboard/Model/SpanDetailsViewModel.cs b/src/Aspire.Dashboard/Model/SpanDetailsViewModel.cs index 54108e839fa..53685a744d0 100644 --- a/src/Aspire.Dashboard/Model/SpanDetailsViewModel.cs +++ b/src/Aspire.Dashboard/Model/SpanDetailsViewModel.cs @@ -12,5 +12,5 @@ public sealed class SpanDetailsViewModel public required List Links { get; init; } public required List Backlinks { get; init; } public required string Title { get; init; } - public required List Applications { get; init; } + public required List Resources { get; init; } } diff --git a/src/Aspire.Dashboard/Model/StructuredLogsViewModel.cs b/src/Aspire.Dashboard/Model/StructuredLogsViewModel.cs index 7eaf5c8a784..1fbe0bfb97f 100644 --- a/src/Aspire.Dashboard/Model/StructuredLogsViewModel.cs +++ b/src/Aspire.Dashboard/Model/StructuredLogsViewModel.cs @@ -13,7 +13,7 @@ public class StructuredLogsViewModel private readonly List _filters = new(); private PagedResult? _logs; - private ApplicationKey? _applicationKey; + private ResourceKey? _resourceKey; private string _filterText = string.Empty; private int _logsStartIndex; private int _logsCount; @@ -24,7 +24,7 @@ public StructuredLogsViewModel(TelemetryRepository telemetryRepository) _telemetryRepository = telemetryRepository; } - public ApplicationKey? ApplicationKey { get => _applicationKey; set => SetValue(ref _applicationKey, value); } + public ResourceKey? ResourceKey { get => _resourceKey; set => SetValue(ref _resourceKey, value); } public string FilterText { get => _filterText; set => SetValue(ref _filterText, value); } public IReadOnlyList Filters => _filters; @@ -92,7 +92,7 @@ public PagedResult GetLogs() logs = _telemetryRepository.GetLogs(new GetLogsContext { - ApplicationKey = ApplicationKey, + ResourceKey = ResourceKey, StartIndex = StartIndex, Count = Count, Filters = filters diff --git a/src/Aspire.Dashboard/Model/TraceHelpers.cs b/src/Aspire.Dashboard/Model/TraceHelpers.cs index 6c47d7bf28a..1da22a433f3 100644 --- a/src/Aspire.Dashboard/Model/TraceHelpers.cs +++ b/src/Aspire.Dashboard/Model/TraceHelpers.cs @@ -38,58 +38,58 @@ static void Visit(OtlpSpanCollection allSpans, OtlpSpan span, Func - /// Get applications for a trace, with grouped information, and ordered using min date. + /// Get resources for a trace, with grouped information, and ordered using min date. /// It is possible for spans to arrive with dates that are out of order (i.e. child span has earlier /// start date than the parent) so ensure it isn't possible for a child to appear before parent. /// - public static IEnumerable GetOrderedApplications(OtlpTrace trace) + public static IEnumerable GetOrderedResources(OtlpTrace trace) { - var appFirstTimes = new Dictionary(); + var resourceFirstTimes = new Dictionary(); - VisitSpans(trace, (OtlpSpan span, OrderedApplicationsState state) => + VisitSpans(trace, (OtlpSpan span, OrderedResourcesState state) => { var currentMinDate = (state.CurrentMinDate == null || state.CurrentMinDate < span.StartTime) ? span.StartTime : state.CurrentMinDate.Value; - ProcessSpanApp(span, span.Source.Application, appFirstTimes, currentMinDate); + ProcessSpanResource(span, span.Source.Resource, resourceFirstTimes, currentMinDate); if (span.UninstrumentedPeer is { } peer) { - ProcessSpanApp(span, peer, appFirstTimes, currentMinDate); + ProcessSpanResource(span, peer, resourceFirstTimes, currentMinDate); } - return new OrderedApplicationsState(currentMinDate); - }, new OrderedApplicationsState(null)); + return new OrderedResourcesState(currentMinDate); + }, new OrderedResourcesState(null)); - return appFirstTimes.Select(kvp => kvp.Value) + return resourceFirstTimes.Select(kvp => kvp.Value) .OrderBy(s => s.FirstDateTime) .ThenBy(s => s.Index); } - private static void ProcessSpanApp(OtlpSpan span, OtlpApplication application, Dictionary appFirstTimes, DateTime currentMinDate) + private static void ProcessSpanResource(OtlpSpan span, OtlpResource resource, Dictionary resourceFirstTimes, DateTime currentMinDate) { - if (appFirstTimes.TryGetValue(application, out var orderedApp)) + if (resourceFirstTimes.TryGetValue(resource, out var orderedResource)) { - if (currentMinDate < orderedApp.FirstDateTime) + if (currentMinDate < orderedResource.FirstDateTime) { - orderedApp.FirstDateTime = currentMinDate; + orderedResource.FirstDateTime = currentMinDate; } if (span.Status == OtlpSpanStatusCode.Error) { - orderedApp.ErroredSpans++; + orderedResource.ErroredSpans++; } - orderedApp.TotalSpans++; + orderedResource.TotalSpans++; } else { - appFirstTimes.Add( - application, - new OrderedApplication(application, appFirstTimes.Count, currentMinDate, totalSpans: 1, erroredSpans: span.Status == OtlpSpanStatusCode.Error ? 1 : 0)); + resourceFirstTimes.Add( + resource, + new OrderedResource(resource, resourceFirstTimes.Count, currentMinDate, totalSpans: 1, erroredSpans: span.Status == OtlpSpanStatusCode.Error ? 1 : 0)); } } @@ -148,9 +148,9 @@ static Icon GetIcon(Icon regular, Icon filled, IconVariant iconVariant) } } -public sealed class OrderedApplication(OtlpApplication application, int index, DateTime firstDateTime, int totalSpans, int erroredSpans) +public sealed class OrderedResource(OtlpResource resource, int index, DateTime firstDateTime, int totalSpans, int erroredSpans) { - public OtlpApplication Application { get; } = application; + public OtlpResource Resource { get; } = resource; public int Index { get; } = index; public DateTime FirstDateTime { get; set; } = firstDateTime; public int TotalSpans { get; set; } = totalSpans; diff --git a/src/Aspire.Dashboard/Model/TracesViewModel.cs b/src/Aspire.Dashboard/Model/TracesViewModel.cs index b9b7f7eb8c8..d028297d624 100644 --- a/src/Aspire.Dashboard/Model/TracesViewModel.cs +++ b/src/Aspire.Dashboard/Model/TracesViewModel.cs @@ -13,7 +13,7 @@ public class TracesViewModel private readonly List _filters = new(); private PagedResult? _traces; - private ApplicationKey? _applicationKey; + private ResourceKey? _resourceKey; private string _filterText = string.Empty; private int _startIndex; private int _count; @@ -23,7 +23,7 @@ public TracesViewModel(TelemetryRepository telemetryRepository) _telemetryRepository = telemetryRepository; } - public ApplicationKey? ApplicationKey { get => _applicationKey; set => SetValue(ref _applicationKey, value); } + public ResourceKey? ResourceKey { get => _resourceKey; set => SetValue(ref _resourceKey, value); } public string FilterText { get => _filterText; set => SetValue(ref _filterText, value); } public int StartIndex { get => _startIndex; set => SetValue(ref _startIndex, value); } public int Count { get => _count; set => SetValue(ref _count, value); } @@ -81,7 +81,7 @@ public PagedResult GetTraces() var result = _telemetryRepository.GetTraces(new GetTracesRequest { - ApplicationKey = ApplicationKey, + ResourceKey = ResourceKey, FilterText = FilterText, StartIndex = StartIndex, Count = Count, diff --git a/src/Aspire.Dashboard/Otlp/Model/OtlpHelpers.cs b/src/Aspire.Dashboard/Otlp/Model/OtlpHelpers.cs index 174e86eab28..18045a34208 100644 --- a/src/Aspire.Dashboard/Otlp/Model/OtlpHelpers.cs +++ b/src/Aspire.Dashboard/Otlp/Model/OtlpHelpers.cs @@ -26,7 +26,7 @@ public static class OtlpHelpers public const int ShortenedIdLength = 7; - public static ApplicationKey GetApplicationKey(this Resource resource) + public static ResourceKey GetResourceKey(this Resource resource) { string? serviceName = null; string? serviceInstanceId = null; @@ -35,15 +35,15 @@ public static ApplicationKey GetApplicationKey(this Resource resource) for (var i = 0; i < resource.Attributes.Count; i++) { var attribute = resource.Attributes[i]; - if (attribute.Key == OtlpApplication.SERVICE_INSTANCE_ID) + if (attribute.Key == OtlpResource.SERVICE_INSTANCE_ID) { serviceInstanceId = attribute.Value.GetString(); } - if (attribute.Key == OtlpApplication.SERVICE_NAME) + if (attribute.Key == OtlpResource.SERVICE_NAME) { serviceName = attribute.Value.GetString(); } - if (attribute.Key == OtlpApplication.PROCESS_EXECUTABLE_NAME) + if (attribute.Key == OtlpResource.PROCESS_EXECUTABLE_NAME) { processExecutableName = attribute.Value.GetString(); } @@ -61,7 +61,7 @@ public static ApplicationKey GetApplicationKey(this Resource resource) } // service.instance.id is recommended but not required. - return new ApplicationKey(serviceName, serviceInstanceId ?? serviceName); + return new ResourceKey(serviceName, serviceInstanceId ?? serviceName); } public static string ToShortenedId(string id) => TruncateString(id, maxLength: ShortenedIdLength); diff --git a/src/Aspire.Dashboard/Otlp/Model/OtlpLogEntry.cs b/src/Aspire.Dashboard/Otlp/Model/OtlpLogEntry.cs index e529cd22775..83bb3cc53c9 100644 --- a/src/Aspire.Dashboard/Otlp/Model/OtlpLogEntry.cs +++ b/src/Aspire.Dashboard/Otlp/Model/OtlpLogEntry.cs @@ -21,13 +21,13 @@ public class OtlpLogEntry public string TraceId { get; } public string ParentId { get; } public string? OriginalFormat { get; } - public OtlpApplicationView ApplicationView { get; } + public OtlpResourceView ResourceView { get; } public OtlpScope Scope { get; } public long InternalId { get; } public bool IsError => Severity is LogLevel.Error or LogLevel.Critical; public bool IsWarning => Severity is LogLevel.Warning; - public OtlpLogEntry(LogRecord record, OtlpApplicationView logApp, OtlpScope scope, OtlpContext context) + public OtlpLogEntry(LogRecord record, OtlpResourceView resourceView, OtlpScope scope, OtlpContext context) { InternalId = Interlocked.Increment(ref s_nextLogEntryId); TimeStamp = ResolveTimeStamp(record); @@ -63,7 +63,7 @@ public OtlpLogEntry(LogRecord record, OtlpApplicationView logApp, OtlpScope scop SpanId = record.SpanId.ToHexString(); TraceId = record.TraceId.ToHexString(); ParentId = parentId ?? string.Empty; - ApplicationView = logApp; + ResourceView = resourceView; Scope = scope; } @@ -118,7 +118,7 @@ private static DateTime ResolveTimeStamp(LogRecord record) KnownStructuredLogFields.SpanIdField => log.SpanId, KnownStructuredLogFields.OriginalFormatField => log.OriginalFormat, KnownStructuredLogFields.CategoryField => log.Scope.Name, - KnownResourceFields.ServiceNameField => log.ApplicationView.Application.ApplicationName, + KnownResourceFields.ServiceNameField => log.ResourceView.Resource.ResourceName, _ => log.Attributes.GetValue(field) }; } diff --git a/src/Aspire.Dashboard/Otlp/Model/OtlpApplication.cs b/src/Aspire.Dashboard/Otlp/Model/OtlpResource.cs similarity index 85% rename from src/Aspire.Dashboard/Otlp/Model/OtlpApplication.cs rename to src/Aspire.Dashboard/Otlp/Model/OtlpResource.cs index e7d62d3f062..a7020aa236b 100644 --- a/src/Aspire.Dashboard/Otlp/Model/OtlpApplication.cs +++ b/src/Aspire.Dashboard/Otlp/Model/OtlpResource.cs @@ -12,14 +12,14 @@ namespace Aspire.Dashboard.Otlp.Model; -[DebuggerDisplay("ApplicationName = {ApplicationName}, InstanceId = {InstanceId}")] -public class OtlpApplication +[DebuggerDisplay("ResourceName = {ResourceName}, InstanceId = {InstanceId}")] +public class OtlpResource { public const string SERVICE_NAME = "service.name"; public const string SERVICE_INSTANCE_ID = "service.instance.id"; public const string PROCESS_EXECUTABLE_NAME = "process.executable.name"; - public string ApplicationName { get; } + public string ResourceName { get; } public string InstanceId { get; } public OtlpContext Context { get; } // This flag indicates whether the app was created for an uninstrumented peer. @@ -27,16 +27,16 @@ public class OtlpApplication // Traces uses uninstrumented peers, structured logs and metrics don't. public bool UninstrumentedPeer { get; private set; } - public ApplicationKey ApplicationKey => new ApplicationKey(ApplicationName, InstanceId); + public ResourceKey ResourceKey => new ResourceKey(ResourceName, InstanceId); private readonly ReaderWriterLockSlim _metricsLock = new(); private readonly Dictionary _meters = new(); private readonly Dictionary _instruments = new(); - private readonly ConcurrentDictionary[], OtlpApplicationView> _applicationViews = new(ApplicationViewKeyComparer.Instance); + private readonly ConcurrentDictionary[], OtlpResourceView> _resourceViews = new(ResourceViewKeyComparer.Instance); - public OtlpApplication(string name, string instanceId, bool uninstrumentedPeer, OtlpContext context) + public OtlpResource(string name, string instanceId, bool uninstrumentedPeer, OtlpContext context) { - ApplicationName = name; + ResourceName = name; InstanceId = instanceId; UninstrumentedPeer = uninstrumentedPeer; Context = context; @@ -247,27 +247,27 @@ public List GetInstrumentsSummary() } } - public static Dictionary> GetReplicasByApplicationName(IEnumerable allApplications) + public static Dictionary> GetReplicasByResourceName(IEnumerable allResources) { - return allApplications - .GroupBy(application => application.ApplicationName, StringComparers.ResourceName) + return allResources + .GroupBy(resource => resource.ResourceName, StringComparers.ResourceName) .ToDictionary(grouping => grouping.Key, grouping => grouping.ToList()); } - public static string GetResourceName(OtlpApplicationView app, List allApplications) => - GetResourceName(app.Application, allApplications); + public static string GetResourceName(OtlpResourceView resource, List allResources) => + GetResourceName(resource.Resource, allResources); - public static string GetResourceName(OtlpApplication app, List allApplications) + public static string GetResourceName(OtlpResource resource, List allResources) { var count = 0; - foreach (var item in allApplications) + foreach (var item in allResources) { - if (string.Equals(item.ApplicationName, app.ApplicationName, StringComparisons.ResourceName)) + if (string.Equals(item.ResourceName, resource.ResourceName, StringComparisons.ResourceName)) { count++; if (count >= 2) { - var instanceId = app.InstanceId; + var instanceId = resource.InstanceId; // Convert long GUID into a shorter, more human friendly format. // Before: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee @@ -281,27 +281,27 @@ public static string GetResourceName(OtlpApplication app, List instanceId = chars.Slice(0, 8).ToString(); } - return $"{item.ApplicationName}-{instanceId}"; + return $"{item.ResourceName}-{instanceId}"; } } } - return app.ApplicationName; + return resource.ResourceName; } - internal List GetViews() => _applicationViews.Values.ToList(); + internal List GetViews() => _resourceViews.Values.ToList(); - internal OtlpApplicationView GetView(RepeatedField attributes) + internal OtlpResourceView GetView(RepeatedField attributes) { // Inefficient to create this to possibly throw it away. - var view = new OtlpApplicationView(this, attributes); + var view = new OtlpResourceView(this, attributes); - if (_applicationViews.TryGetValue(view.Properties, out var applicationView)) + if (_resourceViews.TryGetValue(view.Properties, out var resourceView)) { - return applicationView; + return resourceView; } - return _applicationViews.GetOrAdd(view.Properties, view); + return _resourceViews.GetOrAdd(view.Properties, view); } internal void SetUninstrumentedPeer(bool uninstrumentedPeer) @@ -315,11 +315,11 @@ internal void SetUninstrumentedPeer(bool uninstrumentedPeer) } /// - /// Application views are equal when all properties are equal. + /// Resource views are equal when all properties are equal. /// - private sealed class ApplicationViewKeyComparer : IEqualityComparer[]> + private sealed class ResourceViewKeyComparer : IEqualityComparer[]> { - public static readonly ApplicationViewKeyComparer Instance = new(); + public static readonly ResourceViewKeyComparer Instance = new(); public bool Equals(KeyValuePair[]? x, KeyValuePair[]? y) { diff --git a/src/Aspire.Dashboard/Otlp/Model/OtlpApplicationType.cs b/src/Aspire.Dashboard/Otlp/Model/OtlpResourceType.cs similarity index 88% rename from src/Aspire.Dashboard/Otlp/Model/OtlpApplicationType.cs rename to src/Aspire.Dashboard/Otlp/Model/OtlpResourceType.cs index b99b35eb098..10ac77b4312 100644 --- a/src/Aspire.Dashboard/Otlp/Model/OtlpApplicationType.cs +++ b/src/Aspire.Dashboard/Otlp/Model/OtlpResourceType.cs @@ -3,7 +3,7 @@ namespace Aspire.Dashboard.Otlp.Model; -public enum OtlpApplicationType +public enum OtlpResourceType { ResourceGrouping, Singleton, diff --git a/src/Aspire.Dashboard/Otlp/Model/OtlpApplicationView.cs b/src/Aspire.Dashboard/Otlp/Model/OtlpResourceView.cs similarity index 67% rename from src/Aspire.Dashboard/Otlp/Model/OtlpApplicationView.cs rename to src/Aspire.Dashboard/Otlp/Model/OtlpResourceView.cs index 9bd19465cef..8ae39b4c09b 100644 --- a/src/Aspire.Dashboard/Otlp/Model/OtlpApplicationView.cs +++ b/src/Aspire.Dashboard/Otlp/Model/OtlpResourceView.cs @@ -9,23 +9,23 @@ namespace Aspire.Dashboard.Otlp.Model; -[DebuggerDisplay("Application = {Application}, Properties = {Properties.Count}")] -public class OtlpApplicationView +[DebuggerDisplay("Resource = {Resource}, Properties = {Properties.Count}")] +public class OtlpResourceView { - public ApplicationKey ApplicationKey => Application.ApplicationKey; - public OtlpApplication Application { get; } + public ResourceKey ResourceKey => Resource.ResourceKey; + public OtlpResource Resource { get; } public KeyValuePair[] Properties { get; } - public OtlpApplicationView(OtlpApplication application, RepeatedField attributes) + public OtlpResourceView(OtlpResource resource, RepeatedField attributes) { - Application = application; + Resource = resource; - var properties = attributes.ToKeyValuePairs(application.Context, filter: attribute => + var properties = attributes.ToKeyValuePairs(resource.Context, filter: attribute => { switch (attribute.Key) { - case OtlpApplication.SERVICE_NAME: - case OtlpApplication.SERVICE_INSTANCE_ID: + case OtlpResource.SERVICE_NAME: + case OtlpResource.SERVICE_INSTANCE_ID: // Explicitly ignore these return false; default: @@ -43,8 +43,8 @@ public List AllProperties() { var props = new List { - new OtlpDisplayField { DisplayName = "service.name", Key = KnownResourceFields.ServiceNameField, Value = Application.ApplicationName }, - new OtlpDisplayField { DisplayName = "service.instance.id", Key = KnownResourceFields.ServiceInstanceIdField, Value = Application.InstanceId } + new OtlpDisplayField { DisplayName = "service.name", Key = KnownResourceFields.ServiceNameField, Value = Resource.ResourceName }, + new OtlpDisplayField { DisplayName = "service.instance.id", Key = KnownResourceFields.ServiceInstanceIdField, Value = Resource.InstanceId } }; foreach (var kv in Properties) diff --git a/src/Aspire.Dashboard/Otlp/Model/OtlpSpan.cs b/src/Aspire.Dashboard/Otlp/Model/OtlpSpan.cs index 6651937478b..dbb7e2ea26a 100644 --- a/src/Aspire.Dashboard/Otlp/Model/OtlpSpan.cs +++ b/src/Aspire.Dashboard/Otlp/Model/OtlpSpan.cs @@ -23,7 +23,7 @@ public class OtlpSpan public string TraceId => Trace.TraceId; public OtlpTrace Trace { get; } - public OtlpApplicationView Source { get; } + public OtlpResourceView Source { get; } public required string SpanId { get; init; } public required string? ParentSpanId { get; init; } @@ -42,15 +42,15 @@ public class OtlpSpan public OtlpScope Scope { get; } public TimeSpan Duration => EndTime - StartTime; - public OtlpApplication? UninstrumentedPeer { get => _uninstrumentedPeer; init => _uninstrumentedPeer = value; } + public OtlpResource? UninstrumentedPeer { get => _uninstrumentedPeer; init => _uninstrumentedPeer = value; } public IEnumerable GetChildSpans() => GetChildSpans(this, Trace.Spans); public static IEnumerable GetChildSpans(OtlpSpan parentSpan, OtlpSpanCollection spans) => spans.Where(s => s.ParentSpanId == parentSpan.SpanId); private string? _cachedDisplaySummary; - private OtlpApplication? _uninstrumentedPeer; + private OtlpResource? _uninstrumentedPeer; - public void SetUninstrumentedPeer(OtlpApplication? peer) + public void SetUninstrumentedPeer(OtlpResource? peer) { _uninstrumentedPeer = peer; } @@ -70,9 +70,9 @@ public void SetUninstrumentedPeer(OtlpApplication? peer) return null; } - public OtlpSpan(OtlpApplicationView applicationView, OtlpTrace trace, OtlpScope scope) + public OtlpSpan(OtlpResourceView resourceView, OtlpTrace trace, OtlpScope scope) { - Source = applicationView; + Source = resourceView; Trace = trace; Scope = scope; } @@ -127,7 +127,7 @@ public List AllProperties() private string DebuggerToString() { - return $@"SpanId = {SpanId}, StartTime = {StartTime.ToLocalTime():h:mm:ss.fff tt}, ParentSpanId = {ParentSpanId}, Application = {Source.ApplicationKey}, UninstrumentedPeerApplication = {UninstrumentedPeer?.ApplicationKey}, TraceId = {Trace.TraceId}"; + return $@"SpanId = {SpanId}, StartTime = {StartTime.ToLocalTime():h:mm:ss.fff tt}, ParentSpanId = {ParentSpanId}, Resource = {Source.ResourceKey}, UninstrumentedPeerResource = {UninstrumentedPeer?.ResourceKey}, TraceId = {Trace.TraceId}"; } public string GetDisplaySummary() @@ -195,7 +195,7 @@ public static FieldValues GetFieldValue(OtlpSpan span, string field) // Find a better way to do this if more than two values are needed. return field switch { - KnownResourceFields.ServiceNameField => new FieldValues(span.Source.Application.ApplicationName, span.UninstrumentedPeer?.ApplicationName), + KnownResourceFields.ServiceNameField => new FieldValues(span.Source.Resource.ResourceName, span.UninstrumentedPeer?.ResourceName), KnownTraceFields.TraceIdField => span.TraceId, KnownTraceFields.SpanIdField => span.SpanId, KnownTraceFields.KindField => span.Kind.ToString(), diff --git a/src/Aspire.Dashboard/Otlp/Model/OtlpTrace.cs b/src/Aspire.Dashboard/Otlp/Model/OtlpTrace.cs index 9d89065c2cd..67715a10c51 100644 --- a/src/Aspire.Dashboard/Otlp/Model/OtlpTrace.cs +++ b/src/Aspire.Dashboard/Otlp/Model/OtlpTrace.cs @@ -109,7 +109,7 @@ public void AddSpan(OtlpSpan span, bool skipLastUpdatedDate = false) static string BuildFullName(OtlpSpan existingSpan) { - return $"{existingSpan.Source.Application.ApplicationName}: {existingSpan.Name}"; + return $"{existingSpan.Source.Resource.ResourceName}: {existingSpan.Name}"; } } @@ -178,14 +178,14 @@ private string DebuggerToString() return $@"TraceId = ""{TraceId}"", Spans = {Spans.Count}, StartDate = {FirstSpan?.StartTime.ToLocalTime():yyyy:MM:dd}, StartTime = {FirstSpan?.StartTime.ToLocalTime():h:mm:ss.fff tt}, Duration = {Duration}"; } - public void SetSpanUninstrumentedPeer(OtlpSpan span, OtlpApplication? app) + public void SetSpanUninstrumentedPeer(OtlpSpan span, OtlpResource? resource) { if (span.Trace != this) { throw new ArgumentException("Span does not belong to this trace.", nameof(span)); } - span.SetUninstrumentedPeer(app); + span.SetUninstrumentedPeer(resource); LastUpdatedDate = DateTime.UtcNow; } diff --git a/src/Aspire.Dashboard/Otlp/Storage/GetInstrumentRequest.cs b/src/Aspire.Dashboard/Otlp/Storage/GetInstrumentRequest.cs index 0be7db12ea9..a8dd465eaa6 100644 --- a/src/Aspire.Dashboard/Otlp/Storage/GetInstrumentRequest.cs +++ b/src/Aspire.Dashboard/Otlp/Storage/GetInstrumentRequest.cs @@ -6,7 +6,7 @@ namespace Aspire.Dashboard.Otlp.Storage; public sealed class GetInstrumentRequest { public required string InstrumentName { get; init; } - public required ApplicationKey ApplicationKey { get; init; } + public required ResourceKey ResourceKey { get; init; } public required string MeterName { get; init; } public DateTime? StartTime { get; init; } public DateTime? EndTime { get; init; } diff --git a/src/Aspire.Dashboard/Otlp/Storage/GetLogsContext.cs b/src/Aspire.Dashboard/Otlp/Storage/GetLogsContext.cs index 0174903b35e..85150ae37e0 100644 --- a/src/Aspire.Dashboard/Otlp/Storage/GetLogsContext.cs +++ b/src/Aspire.Dashboard/Otlp/Storage/GetLogsContext.cs @@ -7,7 +7,7 @@ namespace Aspire.Dashboard.Otlp.Storage; public sealed class GetLogsContext { - public required ApplicationKey? ApplicationKey { get; init; } + public required ResourceKey? ResourceKey { get; init; } public required int StartIndex { get; init; } public required int Count { get; init; } public required List Filters { get; init; } diff --git a/src/Aspire.Dashboard/Otlp/Storage/GetTracesRequest.cs b/src/Aspire.Dashboard/Otlp/Storage/GetTracesRequest.cs index d08d9691673..8941cf5cf5d 100644 --- a/src/Aspire.Dashboard/Otlp/Storage/GetTracesRequest.cs +++ b/src/Aspire.Dashboard/Otlp/Storage/GetTracesRequest.cs @@ -7,7 +7,7 @@ namespace Aspire.Dashboard.Otlp.Storage; public sealed class GetTracesRequest { - public required ApplicationKey? ApplicationKey { get; init; } + public required ResourceKey? ResourceKey { get; init; } public required int StartIndex { get; init; } public required int Count { get; init; } public required string FilterText { get; init; } diff --git a/src/Aspire.Dashboard/Otlp/Storage/ApplicationKey.cs b/src/Aspire.Dashboard/Otlp/Storage/ResourceKey.cs similarity index 82% rename from src/Aspire.Dashboard/Otlp/Storage/ApplicationKey.cs rename to src/Aspire.Dashboard/Otlp/Storage/ResourceKey.cs index 800cfa5ae97..7c48b3a8e57 100644 --- a/src/Aspire.Dashboard/Otlp/Storage/ApplicationKey.cs +++ b/src/Aspire.Dashboard/Otlp/Storage/ResourceKey.cs @@ -3,15 +3,15 @@ namespace Aspire.Dashboard.Otlp.Storage; -public readonly record struct ApplicationKey(string Name, string? InstanceId) : IComparable +public readonly record struct ResourceKey(string Name, string? InstanceId) : IComparable { - public static ApplicationKey Create(string name, string instanceId) + public static ResourceKey Create(string name, string instanceId) { if (string.Equals(name, instanceId, StringComparisons.ResourceName)) { // If the name and instanceId are the same, we can just return the name. // This is useful for resources that do not have an instanceId. - return new ApplicationKey(Name: name, InstanceId: null); + return new ResourceKey(Name: name, InstanceId: null); } // Check if instanceId combines name, e.g. @@ -22,7 +22,7 @@ public static ApplicationKey Create(string name, string instanceId) instanceId.StartsWith(name, StringComparisons.ResourceName) && instanceId[name.Length] == '-') { - return new ApplicationKey(name, instanceId.Substring(name.Length + 1)); + return new ResourceKey(name, instanceId.Substring(name.Length + 1)); } // Fall back to splitting based on a dash delimiter. @@ -31,13 +31,13 @@ public static ApplicationKey Create(string name, string instanceId) var separator = instanceId.LastIndexOf('-'); if (separator == -1) { - return new ApplicationKey(Name: instanceId, InstanceId: null); + return new ResourceKey(Name: instanceId, InstanceId: null); } - return new ApplicationKey(Name: instanceId.Substring(0, separator), InstanceId: instanceId.Substring(separator + 1)); + return new ResourceKey(Name: instanceId.Substring(0, separator), InstanceId: instanceId.Substring(separator + 1)); } - public int CompareTo(ApplicationKey other) + public int CompareTo(ResourceKey other) { var c = string.Compare(Name, other.Name, StringComparisons.ResourceName); if (c != 0) diff --git a/src/Aspire.Dashboard/Otlp/Storage/Subscription.cs b/src/Aspire.Dashboard/Otlp/Storage/Subscription.cs index 9772d8bba96..33a57ee1053 100644 --- a/src/Aspire.Dashboard/Otlp/Storage/Subscription.cs +++ b/src/Aspire.Dashboard/Otlp/Storage/Subscription.cs @@ -6,7 +6,7 @@ namespace Aspire.Dashboard.Otlp.Storage; -[DebuggerDisplay("Name = {Name}, ApplicationKey = {ApplicationKey}, SubscriptionId = {SubscriptionId}")] +[DebuggerDisplay("Name = {Name}, ResourceKey = {ResourceKey}, SubscriptionId = {SubscriptionId}")] public sealed class Subscription : IDisposable { private static int s_subscriptionId; @@ -16,14 +16,14 @@ public sealed class Subscription : IDisposable private readonly int _subscriptionId = Interlocked.Increment(ref s_subscriptionId); public int SubscriptionId => _subscriptionId; - public ApplicationKey? ApplicationKey { get; } + public ResourceKey? ResourceKey { get; } public SubscriptionType SubscriptionType { get; } public string Name { get; } - public Subscription(string name, ApplicationKey? applicationKey, SubscriptionType subscriptionType, Func callback, Action unsubscribe, ExecutionContext? executionContext, TelemetryRepository telemetryRepository) + public Subscription(string name, ResourceKey? resourceKey, SubscriptionType subscriptionType, Func callback, Action unsubscribe, ExecutionContext? executionContext, TelemetryRepository telemetryRepository) { Name = name; - ApplicationKey = applicationKey; + ResourceKey = resourceKey; SubscriptionType = subscriptionType; _callbackThrottler = new CallbackThrottler(name, telemetryRepository._otlpContext.Logger, telemetryRepository._subscriptionMinExecuteInterval, callback, executionContext); _unsubscribe = unsubscribe; diff --git a/src/Aspire.Dashboard/Otlp/Storage/TelemetryRepository.cs b/src/Aspire.Dashboard/Otlp/Storage/TelemetryRepository.cs index 9f14bbdc1ef..56918d2bd3e 100644 --- a/src/Aspire.Dashboard/Otlp/Storage/TelemetryRepository.cs +++ b/src/Aspire.Dashboard/Otlp/Storage/TelemetryRepository.cs @@ -32,19 +32,19 @@ public sealed class TelemetryRepository : IDisposable private readonly object _lock = new(); internal TimeSpan _subscriptionMinExecuteInterval = TimeSpan.FromMilliseconds(100); - private readonly List _applicationSubscriptions = new(); + private readonly List _resourceSubscriptions = new(); private readonly List _logSubscriptions = new(); private readonly List _metricsSubscriptions = new(); private readonly List _tracesSubscriptions = new(); - private readonly ConcurrentDictionary _applications = new(); + private readonly ConcurrentDictionary _resources = new(); private readonly ReaderWriterLockSlim _logsLock = new(); private readonly Dictionary _logScopes = new(); private readonly CircularBuffer _logs; - private readonly HashSet<(OtlpApplication Application, string PropertyKey)> _logPropertyKeys = new(); - private readonly HashSet<(OtlpApplication Application, string PropertyKey)> _tracePropertyKeys = new(); - private readonly Dictionary _applicationUnviewedErrorLogs = new(); + private readonly HashSet<(OtlpResource Resource, string PropertyKey)> _logPropertyKeys = new(); + private readonly HashSet<(OtlpResource Resource, string PropertyKey)> _tracePropertyKeys = new(); + private readonly Dictionary _resourceUnviewedErrorLogs = new(); private readonly ReaderWriterLockSlim _tracesLock = new(); private readonly Dictionary _traceScopes = new(); @@ -95,35 +95,35 @@ private void TracesItemRemovedForCapacity(OtlpTrace trace) } } - public List GetApplications(bool includeUninstrumentedPeers = false) + public List GetResources(bool includeUninstrumentedPeers = false) { - return GetApplicationsCore(includeUninstrumentedPeers, name: null); + return GetResourcesCore(includeUninstrumentedPeers, name: null); } - public List GetApplicationsByName(string name, bool includeUninstrumentedPeers = false) + public List GetResourcesByName(string name, bool includeUninstrumentedPeers = false) { - return GetApplicationsCore(includeUninstrumentedPeers, name); + return GetResourcesCore(includeUninstrumentedPeers, name); } - private List GetApplicationsCore(bool includeUninstrumentedPeers, string? name) + private List GetResourcesCore(bool includeUninstrumentedPeers, string? name) { - IEnumerable results = _applications.Values; + IEnumerable results = _resources.Values; if (!includeUninstrumentedPeers) { results = results.Where(a => !a.UninstrumentedPeer); } if (name != null) { - results = results.Where(a => string.Equals(a.ApplicationKey.Name, name, StringComparisons.ResourceName)); + results = results.Where(a => string.Equals(a.ResourceKey.Name, name, StringComparisons.ResourceName)); } - var applications = results.OrderBy(a => a.ApplicationKey).ToList(); - return applications; + var resources = results.OrderBy(a => a.ResourceKey).ToList(); + return resources; } - public OtlpApplication? GetApplicationByCompositeName(string compositeName) + public OtlpResource? GetResourceByCompositeName(string compositeName) { - foreach (var kvp in _applications) + foreach (var kvp in _resources) { if (kvp.Key.EqualsCompositeName(compositeName)) { @@ -134,40 +134,40 @@ private List GetApplicationsCore(bool includeUninstrumentedPeer return null; } - public OtlpApplication? GetApplication(ApplicationKey key) + public OtlpResource? GetResource(ResourceKey key) { if (key.InstanceId == null) { - throw new InvalidOperationException($"{nameof(ApplicationKey)} must have an instance ID."); + throw new InvalidOperationException($"{nameof(ResourceKey)} must have an instance ID."); } - _applications.TryGetValue(key, out var application); - return application; + _resources.TryGetValue(key, out var resource); + return resource; } - public List GetApplications(ApplicationKey key, bool includeUninstrumentedPeers = false) + public List GetResources(ResourceKey key, bool includeUninstrumentedPeers = false) { if (key.InstanceId == null) { - return GetApplicationsByName(key.Name, includeUninstrumentedPeers: includeUninstrumentedPeers); + return GetResourcesByName(key.Name, includeUninstrumentedPeers: includeUninstrumentedPeers); } - var app = GetApplication(key); - if (app == null || (app.UninstrumentedPeer && !includeUninstrumentedPeers)) + var resource = GetResource(key); + if (resource == null || (resource.UninstrumentedPeer && !includeUninstrumentedPeers)) { return []; } - return [app]; + return [resource]; } - public Dictionary GetApplicationUnviewedErrorLogsCount() + public Dictionary GetResourceUnviewedErrorLogsCount() { _logsLock.EnterReadLock(); try { - return _applicationUnviewedErrorLogs.ToDictionary(); + return _resourceUnviewedErrorLogs.ToDictionary(); } finally { @@ -175,7 +175,7 @@ public Dictionary GetApplicationUnviewedErrorLogsCount() } } - internal void MarkViewedErrorLogs(ApplicationKey? key) + internal void MarkViewedErrorLogs(ResourceKey? key) { _logsLock.EnterWriteLock(); @@ -184,18 +184,18 @@ internal void MarkViewedErrorLogs(ApplicationKey? key) if (key == null) { // Mark all logs as viewed. - if (_applicationUnviewedErrorLogs.Count > 0) + if (_resourceUnviewedErrorLogs.Count > 0) { - _applicationUnviewedErrorLogs.Clear(); + _resourceUnviewedErrorLogs.Clear(); RaiseSubscriptionChanged(_logSubscriptions); } return; } - var applications = GetApplications(key.Value); - foreach (var application in applications) + var resources = GetResources(key.Value); + foreach (var resource in resources) { - // Mark one application logs as viewed. - if (_applicationUnviewedErrorLogs.Remove(application.ApplicationKey)) + // Mark one resource logs as viewed. + if (_resourceUnviewedErrorLogs.Remove(resource.ResourceKey)) { RaiseSubscriptionChanged(_logSubscriptions); } @@ -207,73 +207,73 @@ internal void MarkViewedErrorLogs(ApplicationKey? key) } } - private OtlpApplicationView GetOrAddApplicationView(Resource resource) + private OtlpResourceView GetOrAddResourceView(Resource resource) { ArgumentNullException.ThrowIfNull(resource); - var key = resource.GetApplicationKey(); + var key = resource.GetResourceKey(); - var (application, isNew) = GetOrAddApplication(key, uninstrumentedPeer: false); + var (otlpResource, isNew) = GetOrAddResource(key, uninstrumentedPeer: false); if (isNew) { - RaiseSubscriptionChanged(_applicationSubscriptions); + RaiseSubscriptionChanged(_resourceSubscriptions); } - return application.GetView(resource.Attributes); + return otlpResource.GetView(resource.Attributes); } - private (OtlpApplication Application, bool IsNew) GetOrAddApplication(ApplicationKey key, bool uninstrumentedPeer) + private (OtlpResource Resource, bool IsNew) GetOrAddResource(ResourceKey key, bool uninstrumentedPeer) { // Fast path. - if (_applications.TryGetValue(key, out var application)) + if (_resources.TryGetValue(key, out var resource)) { - application.SetUninstrumentedPeer(uninstrumentedPeer); - return (Application: application, IsNew: false); + resource.SetUninstrumentedPeer(uninstrumentedPeer); + return (Resource: resource, IsNew: false); } // Slower get or add path. // This GetOrAdd allocates a closure, so we avoid it if possible. - var newApplication = false; - application = _applications.GetOrAdd(key, _ => + var newResource = false; + resource = _resources.GetOrAdd(key, _ => { - newApplication = true; - return new OtlpApplication(key.Name, key.InstanceId!, uninstrumentedPeer, _otlpContext); + newResource = true; + return new OtlpResource(key.Name, key.InstanceId!, uninstrumentedPeer, _otlpContext); }); - if (!newApplication) + if (!newResource) { - application.SetUninstrumentedPeer(uninstrumentedPeer); + resource.SetUninstrumentedPeer(uninstrumentedPeer); } else { - _logger.LogTrace("New application added: {ApplicationKey}", key); + _logger.LogTrace("New resource added: {ResourceKey}", key); } - return (Application: application, IsNew: newApplication); + return (Resource: resource, IsNew: newResource); } - public Subscription OnNewApplications(Func callback) + public Subscription OnNewResources(Func callback) { - return AddSubscription(nameof(OnNewApplications), null, SubscriptionType.Read, callback, _applicationSubscriptions); + return AddSubscription(nameof(OnNewResources), null, SubscriptionType.Read, callback, _resourceSubscriptions); } - public Subscription OnNewLogs(ApplicationKey? applicationKey, SubscriptionType subscriptionType, Func callback) + public Subscription OnNewLogs(ResourceKey? resourceKey, SubscriptionType subscriptionType, Func callback) { - return AddSubscription(nameof(OnNewLogs), applicationKey, subscriptionType, callback, _logSubscriptions); + return AddSubscription(nameof(OnNewLogs), resourceKey, subscriptionType, callback, _logSubscriptions); } - public Subscription OnNewMetrics(ApplicationKey? applicationKey, SubscriptionType subscriptionType, Func callback) + public Subscription OnNewMetrics(ResourceKey? resourceKey, SubscriptionType subscriptionType, Func callback) { - return AddSubscription(nameof(OnNewMetrics), applicationKey, subscriptionType, callback, _metricsSubscriptions); + return AddSubscription(nameof(OnNewMetrics), resourceKey, subscriptionType, callback, _metricsSubscriptions); } - public Subscription OnNewTraces(ApplicationKey? applicationKey, SubscriptionType subscriptionType, Func callback) + public Subscription OnNewTraces(ResourceKey? resourceKey, SubscriptionType subscriptionType, Func callback) { - return AddSubscription(nameof(OnNewTraces), applicationKey, subscriptionType, callback, _tracesSubscriptions); + return AddSubscription(nameof(OnNewTraces), resourceKey, subscriptionType, callback, _tracesSubscriptions); } - private Subscription AddSubscription(string name, ApplicationKey? applicationKey, SubscriptionType subscriptionType, Func callback, List subscriptions) + private Subscription AddSubscription(string name, ResourceKey? resourceKey, SubscriptionType subscriptionType, Func callback, List subscriptions) { Subscription? subscription = null; - subscription = new Subscription(name, applicationKey, subscriptionType, callback, () => + subscription = new Subscription(name, resourceKey, subscriptionType, callback, () => { lock (_lock) { @@ -310,25 +310,25 @@ public void AddLogs(AddContext context, RepeatedField resourceLogs foreach (var rl in resourceLogs) { - OtlpApplicationView applicationView; + OtlpResourceView resourceView; try { - applicationView = GetOrAddApplicationView(rl.Resource); + resourceView = GetOrAddResourceView(rl.Resource); } catch (Exception ex) { context.FailureCount += rl.ScopeLogs.Count; - _otlpContext.Logger.LogInformation(ex, "Error adding application."); + _otlpContext.Logger.LogInformation(ex, "Error adding resource."); continue; } - AddLogsCore(context, applicationView, rl.ScopeLogs); + AddLogsCore(context, resourceView, rl.ScopeLogs); } RaiseSubscriptionChanged(_logSubscriptions); } - public void AddLogsCore(AddContext context, OtlpApplicationView applicationView, RepeatedField scopeLogs) + public void AddLogsCore(AddContext context, OtlpResourceView resourceView, RepeatedField scopeLogs) { _logsLock.EnterWriteLock(); @@ -346,7 +346,7 @@ public void AddLogsCore(AddContext context, OtlpApplicationView applicationView, { try { - var logEntry = new OtlpLogEntry(record, applicationView, scope, _otlpContext); + var logEntry = new OtlpLogEntry(record, resourceView, scope, _otlpContext); // Insert log entry in the correct position based on timestamp. // Logs can be added out of order by different services. @@ -365,14 +365,14 @@ public void AddLogsCore(AddContext context, OtlpApplicationView applicationView, _logs.Insert(0, logEntry); } - // For log entries error and above, increment the unviewed count if there are no read log subscriptions for the application. + // For log entries error and above, increment the unviewed count if there are no read log subscriptions for the resource. // We don't increment the count if there are active read subscriptions because the count will be quickly decremented when the subscription callback is run. // Notifying the user there are errors and then immediately clearing the notification is confusing. if (logEntry.IsError) { - if (!_logSubscriptions.Any(s => s.SubscriptionType == SubscriptionType.Read && (s.ApplicationKey == applicationView.ApplicationKey || s.ApplicationKey == null))) + if (!_logSubscriptions.Any(s => s.SubscriptionType == SubscriptionType.Read && (s.ResourceKey == resourceView.ResourceKey || s.ResourceKey == null))) { - ref var count = ref CollectionsMarshal.GetValueRefOrAddDefault(_applicationUnviewedErrorLogs, applicationView.ApplicationKey, out _); + ref var count = ref CollectionsMarshal.GetValueRefOrAddDefault(_resourceUnviewedErrorLogs, resourceView.ResourceKey, out _); // Adds to dictionary if not present. count++; } @@ -380,7 +380,7 @@ public void AddLogsCore(AddContext context, OtlpApplicationView applicationView, foreach (var kvp in logEntry.Attributes) { - _logPropertyKeys.Add((applicationView.Application, kvp.Key)); + _logPropertyKeys.Add((resourceView.Resource, kvp.Key)); } context.SuccessCount++; } @@ -400,12 +400,12 @@ public void AddLogsCore(AddContext context, OtlpApplicationView applicationView, public PagedResult GetLogs(GetLogsContext context) { - List? applications = null; - if (context.ApplicationKey is { } key) + List? resources = null; + if (context.ResourceKey is { } key) { - applications = GetApplications(key); + resources = GetResources(key); - if (applications.Count == 0) + if (resources.Count == 0) { return PagedResult.Empty; } @@ -416,9 +416,9 @@ public PagedResult GetLogs(GetLogsContext context) try { var results = _logs.AsEnumerable(); - if (applications?.Count > 0) + if (resources?.Count > 0) { - results = results.Where(l => MatchApplications(l.ApplicationView.ApplicationKey, applications)); + results = results.Where(l => MatchResources(l.ResourceView.ResourceKey, resources)); } foreach (var filter in context.Filters.GetEnabledFilters()) @@ -434,25 +434,25 @@ public PagedResult GetLogs(GetLogsContext context) } } - public List GetLogPropertyKeys(ApplicationKey? applicationKey) + public List GetLogPropertyKeys(ResourceKey? resourceKey) { - List? applications = null; - if (applicationKey != null) + List? resources = null; + if (resourceKey != null) { - applications = GetApplications(applicationKey.Value); + resources = GetResources(resourceKey.Value); } _logsLock.EnterReadLock(); try { - var applicationKeys = _logPropertyKeys.AsEnumerable(); - if (applications?.Count > 0) + var resourceKeys = _logPropertyKeys.AsEnumerable(); + if (resources?.Count > 0) { - applicationKeys = applicationKeys.Where(keys => MatchApplications(keys.Application.ApplicationKey, applications)); + resourceKeys = resourceKeys.Where(keys => MatchResources(keys.Resource.ResourceKey, resources)); } - var keys = applicationKeys.Select(keys => keys.PropertyKey).Distinct(); + var keys = resourceKeys.Select(keys => keys.PropertyKey).Distinct(); return keys.OrderBy(k => k).ToList(); } finally @@ -461,25 +461,25 @@ public List GetLogPropertyKeys(ApplicationKey? applicationKey) } } - public List GetTracePropertyKeys(ApplicationKey? applicationKey) + public List GetTracePropertyKeys(ResourceKey? resourceKey) { - List? applications = null; - if (applicationKey != null) + List? resources = null; + if (resourceKey != null) { - applications = GetApplications(applicationKey.Value, includeUninstrumentedPeers: true); + resources = GetResources(resourceKey.Value, includeUninstrumentedPeers: true); } _tracesLock.EnterReadLock(); try { - var applicationKeys = _tracePropertyKeys.AsEnumerable(); - if (applications?.Count > 0) + var resourceKeys = _tracePropertyKeys.AsEnumerable(); + if (resources?.Count > 0) { - applicationKeys = applicationKeys.Where(keys => MatchApplications(keys.Application.ApplicationKey, applications)); + resourceKeys = resourceKeys.Where(keys => MatchResources(keys.Resource.ResourceKey, resources)); } - var keys = applicationKeys.Select(keys => keys.PropertyKey).Distinct(); + var keys = resourceKeys.Select(keys => keys.PropertyKey).Distinct(); return keys.OrderBy(k => k).ToList(); } finally @@ -490,12 +490,12 @@ public List GetTracePropertyKeys(ApplicationKey? applicationKey) public GetTracesResponse GetTraces(GetTracesRequest context) { - List? applications = null; - if (context.ApplicationKey is { } key) + List? resources = null; + if (context.ResourceKey is { } key) { - applications = GetApplications(key, includeUninstrumentedPeers: true); + resources = GetResources(key, includeUninstrumentedPeers: true); - if (applications.Count == 0) + if (resources.Count == 0) { return new GetTracesResponse { @@ -510,11 +510,11 @@ public GetTracesResponse GetTraces(GetTracesRequest context) try { var results = _traces.AsEnumerable(); - if (applications?.Count > 0) + if (resources?.Count > 0) { results = results.Where(t => { - return MatchApplications(t, applications); + return MatchResources(t, resources); }); } if (!string.IsNullOrWhiteSpace(context.FilterText)) @@ -569,11 +569,11 @@ public GetTracesResponse GetTraces(GetTracesRequest context) } } - private static bool MatchApplications(ApplicationKey applicationKey, List applications) + private static bool MatchResources(ResourceKey resourceKey, List resources) { - foreach (var application in applications) + foreach (var resource in resources) { - if (applicationKey == application.ApplicationKey) + if (resourceKey == resource.ResourceKey) { return true; } @@ -582,16 +582,16 @@ private static bool MatchApplications(ApplicationKey applicationKey, List applications) + private static bool MatchResources(OtlpTrace t, List resources) { - for (var i = 0; i < applications.Count; i++) + for (var i = 0; i < resources.Count; i++) { - var applicationKey = applications[i].ApplicationKey; + var resourceKey = resources[i].ResourceKey; // Spans collection type returns a struct enumerator so it's ok to foreach inside another loop. foreach (var span in t.Spans) { - if (span.Source.ApplicationKey == applicationKey || span.UninstrumentedPeer?.ApplicationKey == applicationKey) + if (span.Source.ResourceKey == resourceKey || span.UninstrumentedPeer?.ResourceKey == resourceKey) { return true; } @@ -608,18 +608,18 @@ public void ClearAllSignals() ClearMetrics(null); } - public void ClearTraces(ApplicationKey? applicationKey = null) + public void ClearTraces(ResourceKey? resourceKey = null) { - List? applications = null; - if (applicationKey.HasValue) + List? resources = null; + if (resourceKey.HasValue) { - applications = GetApplications(applicationKey.Value, includeUninstrumentedPeers: true); + resources = GetResources(resourceKey.Value, includeUninstrumentedPeers: true); } _tracesLock.EnterWriteLock(); try { - if (applications is null || applications.Count == 0) + if (resources is null || resources.Count == 0) { // Nothing selected, clear everything. _traces.Clear(); @@ -628,8 +628,8 @@ public void ClearTraces(ApplicationKey? applicationKey = null) { for (var i = _traces.Count - 1; i >= 0; i--) { - // Remove trace if any span matches one of the applications. This matches filter behavior. - if (MatchApplications(_traces[i], applications)) + // Remove trace if any span matches one of the resources. This matches filter behavior. + if (MatchResources(_traces[i], resources)) { _traces.RemoveAt(i); continue; @@ -645,19 +645,19 @@ public void ClearTraces(ApplicationKey? applicationKey = null) RaiseSubscriptionChanged(_tracesSubscriptions); } - public void ClearStructuredLogs(ApplicationKey? applicationKey = null) + public void ClearStructuredLogs(ResourceKey? resourceKey = null) { - List? applications = null; - if (applicationKey.HasValue) + List? resources = null; + if (resourceKey.HasValue) { - applications = GetApplications(applicationKey.Value); + resources = GetResources(resourceKey.Value); } _logsLock.EnterWriteLock(); try { - if (applications is null || applications.Count == 0) + if (resources is null || resources.Count == 0) { // Nothing selected, clear everything. _logs.Clear(); @@ -666,7 +666,7 @@ public void ClearStructuredLogs(ApplicationKey? applicationKey = null) { for (var i = _logs.Count - 1; i >= 0; i--) { - if (MatchApplications(_logs[i].ApplicationView.ApplicationKey, applications)) + if (MatchResources(_logs[i].ResourceView.ResourceKey, resources)) { _logs.RemoveAt(i); continue; @@ -682,21 +682,21 @@ public void ClearStructuredLogs(ApplicationKey? applicationKey = null) RaiseSubscriptionChanged(_logSubscriptions); } - public void ClearMetrics(ApplicationKey? applicationKey = null) + public void ClearMetrics(ResourceKey? resourceKey = null) { - List applications; - if (applicationKey.HasValue) + List resources; + if (resourceKey.HasValue) { - applications = GetApplications(applicationKey.Value); + resources = GetResources(resourceKey.Value); } else { - applications = _applications.Values.ToList(); + resources = _resources.Values.ToList(); } - foreach (var app in applications) + foreach (var resource in resources) { - app.ClearMetrics(); + resource.ClearMetrics(); } RaiseSubscriptionChanged(_metricsSubscriptions); @@ -868,19 +868,19 @@ public void AddMetrics(AddContext context, RepeatedField resour foreach (var rm in resourceMetrics) { - OtlpApplicationView applicationView; + OtlpResourceView resourceView; try { - applicationView = GetOrAddApplicationView(rm.Resource); + resourceView = GetOrAddResourceView(rm.Resource); } catch (Exception ex) { context.FailureCount += rm.ScopeMetrics.Sum(s => s.Metrics.Count); - _otlpContext.Logger.LogInformation(ex, "Error adding application."); + _otlpContext.Logger.LogInformation(ex, "Error adding resource."); continue; } - applicationView.Application.AddMetrics(context, rm.ScopeMetrics); + resourceView.Resource.AddMetrics(context, rm.ScopeMetrics); } RaiseSubscriptionChanged(_metricsSubscriptions); @@ -896,19 +896,19 @@ public void AddTraces(AddContext context, RepeatedField resourceS foreach (var rs in resourceSpans) { - OtlpApplicationView applicationView; + OtlpResourceView resourceView; try { - applicationView = GetOrAddApplicationView(rs.Resource); + resourceView = GetOrAddResourceView(rs.Resource); } catch (Exception ex) { context.FailureCount += rs.ScopeSpans.Sum(s => s.Spans.Count); - _otlpContext.Logger.LogInformation(ex, "Error adding application."); + _otlpContext.Logger.LogInformation(ex, "Error adding resource."); continue; } - AddTracesCore(context, applicationView, rs.ScopeSpans); + AddTracesCore(context, resourceView, rs.ScopeSpans); } RaiseSubscriptionChanged(_tracesSubscriptions); @@ -941,7 +941,7 @@ internal static OtlpSpanKind ConvertSpanKind(SpanKind? kind) }; } - internal void AddTracesCore(AddContext context, OtlpApplicationView applicationView, RepeatedField scopeSpans) + internal void AddTracesCore(AddContext context, OtlpResourceView resourceView, RepeatedField scopeSpans) { _tracesLock.EnterWriteLock(); @@ -974,7 +974,7 @@ internal void AddTracesCore(AddContext context, OtlpApplicationView applicationV } } - var newSpan = CreateSpan(applicationView, span, trace, scope, _otlpContext); + var newSpan = CreateSpan(resourceView, span, trace, scope, _otlpContext); trace.AddSpan(newSpan); // The new span might be linked to by an existing span. @@ -1053,7 +1053,7 @@ internal void AddTracesCore(AddContext context, OtlpApplicationView applicationV foreach (var kvp in newSpan.Attributes) { - _tracePropertyKeys.Add((applicationView.Application, kvp.Key)); + _tracePropertyKeys.Add((resourceView.Resource, kvp.Key)); } // Newly added or updated trace should always been in the collection. @@ -1113,15 +1113,15 @@ private void CalculateTraceUninstrumentedPeers(OtlpTrace trace) if (uninstrumentedPeer != null) { - if (span.UninstrumentedPeer?.ApplicationKey.EqualsCompositeName(uninstrumentedPeer.Name) ?? false) + if (span.UninstrumentedPeer?.ResourceKey.EqualsCompositeName(uninstrumentedPeer.Name) ?? false) { // Already the correct value. No changes needed. continue; } - var appKey = ApplicationKey.Create(name: uninstrumentedPeer.DisplayName, instanceId: uninstrumentedPeer.Name); - var (app, _) = GetOrAddApplication(appKey, uninstrumentedPeer: true); - trace.SetSpanUninstrumentedPeer(span, app); + var resourceKey = ResourceKey.Create(name: uninstrumentedPeer.DisplayName, instanceId: uninstrumentedPeer.Name); + var (resource, _) = GetOrAddResource(resourceKey, uninstrumentedPeer: true); + trace.SetSpanUninstrumentedPeer(span, resource); } else { @@ -1196,7 +1196,7 @@ private void AssertSpanLinks() } } - private static OtlpSpan CreateSpan(OtlpApplicationView applicationView, Span span, OtlpTrace trace, OtlpScope scope, OtlpContext context) + private static OtlpSpan CreateSpan(OtlpResourceView resourceView, Span span, OtlpTrace trace, OtlpScope scope, OtlpContext context) { var id = span.SpanId?.ToHexString(); if (id is null) @@ -1220,7 +1220,7 @@ private static OtlpSpan CreateSpan(OtlpApplicationView applicationView, Span spa }); } - var newSpan = new OtlpSpan(applicationView, trace, scope) + var newSpan = new OtlpSpan(resourceView, trace, scope) { SpanId = id, ParentSpanId = span.ParentSpanId?.ToHexString(), @@ -1255,33 +1255,33 @@ private static OtlpSpan CreateSpan(OtlpApplicationView applicationView, Span spa return newSpan; } - public List GetInstrumentsSummaries(ApplicationKey key) + public List GetInstrumentsSummaries(ResourceKey key) { - var applications = GetApplications(key); - if (applications.Count == 0) + var resources = GetResources(key); + if (resources.Count == 0) { return new List(); } - else if (applications.Count == 1) + else if (resources.Count == 1) { - return applications[0].GetInstrumentsSummary(); + return resources[0].GetInstrumentsSummary(); } else { - var allApplicationSummaries = applications + var allResourceSummaries = resources .SelectMany(a => a.GetInstrumentsSummary()) .DistinctBy(s => s.GetKey()) .ToList(); - return allApplicationSummaries; + return allResourceSummaries; } } public OtlpInstrumentData? GetInstrument(GetInstrumentRequest request) { - var applications = GetApplications(request.ApplicationKey); - var instruments = applications + var resources = GetResources(request.ResourceKey); + var instruments = resources .Select(a => a.GetInstrument(request.MeterName, request.InstrumentName, request.StartTime, request.EndTime)) .OfType() .ToList(); diff --git a/src/Aspire.Dashboard/Resources/ControlsStrings.Designer.cs b/src/Aspire.Dashboard/Resources/ControlsStrings.Designer.cs index 52f8166b06c..1c19c2e4102 100644 --- a/src/Aspire.Dashboard/Resources/ControlsStrings.Designer.cs +++ b/src/Aspire.Dashboard/Resources/ControlsStrings.Designer.cs @@ -835,11 +835,11 @@ public static string ResumeButtonTitle { } /// - /// Looks up a localized string similar to Select an application. + /// Looks up a localized string similar to Select a resource. /// - public static string SelectAnApplication { + public static string SelectAResource { get { - return ResourceManager.GetString("SelectAnApplication", resourceCulture); + return ResourceManager.GetString("SelectAResource", resourceCulture); } } diff --git a/src/Aspire.Dashboard/Resources/ControlsStrings.resx b/src/Aspire.Dashboard/Resources/ControlsStrings.resx index 8ebc76b3aab..09fd32ed1d0 100644 --- a/src/Aspire.Dashboard/Resources/ControlsStrings.resx +++ b/src/Aspire.Dashboard/Resources/ControlsStrings.resx @@ -208,8 +208,8 @@ Close - - Select an application + + Select a resource View diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.cs.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.cs.xlf index 4f59161a996..b2373df3a8a 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.cs.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.cs.xlf @@ -432,9 +432,9 @@ Obnovit příchozí data - - Select an application - Vybrat aplikaci + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.de.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.de.xlf index c5005eac194..fcdf62cf57b 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.de.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.de.xlf @@ -432,9 +432,9 @@ Fortsetzen eingehender Daten - - Select an application - Anwendung auswählen + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.es.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.es.xlf index 415b08814c7..0600f195703 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.es.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.es.xlf @@ -432,9 +432,9 @@ Reanudar los datos entrantes - - Select an application - Seleccionar una aplicación + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.fr.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.fr.xlf index b603d007498..237c29dc19b 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.fr.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.fr.xlf @@ -432,9 +432,9 @@ Reprendre les données entrantes - - Select an application - Sélectionner une application + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.it.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.it.xlf index 47757e07a42..7735d7ac2b5 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.it.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.it.xlf @@ -432,9 +432,9 @@ Riprendi i dati in ingresso - - Select an application - Seleziona un'applicazione + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ja.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ja.xlf index ede50f901db..87569b0bb4a 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ja.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ja.xlf @@ -432,9 +432,9 @@ 受信データを再開 - - Select an application - アプリケーションを選択する + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ko.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ko.xlf index 3d72bdb6b12..22ecc4eb2de 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ko.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ko.xlf @@ -432,9 +432,9 @@ 들어오는 데이터 다시 시작 - - Select an application - 애플리케이션 선택 + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pl.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pl.xlf index 2ab49ad9ca1..862d9de3886 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pl.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pl.xlf @@ -432,9 +432,9 @@ Wznów dane przychodzące - - Select an application - Wybierz aplikację + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pt-BR.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pt-BR.xlf index b5046760744..cdc8c4deb39 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pt-BR.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pt-BR.xlf @@ -432,9 +432,9 @@ Retomar dados recebidos - - Select an application - Selecionar um aplicativo + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ru.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ru.xlf index 7991694cb8e..2cd555050a5 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ru.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ru.xlf @@ -432,9 +432,9 @@ Возобновить входящие данные - - Select an application - Выберите приложение + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.tr.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.tr.xlf index f47e43f60d9..08cb3523613 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.tr.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.tr.xlf @@ -432,9 +432,9 @@ Gelen verileri sürdür - - Select an application - Uygulama seçin + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hans.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hans.xlf index de403459c38..eece4b707e3 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hans.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hans.xlf @@ -432,9 +432,9 @@ 恢复传入数据 - - Select an application - 选择应用程序 + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hant.xlf b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hant.xlf index 745087085dd..815ff6f688d 100644 --- a/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hant.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hant.xlf @@ -432,9 +432,9 @@ 繼續傳入資料 - - Select an application - 選取應用程式 + + Select a resource + Select a resource diff --git a/src/Aspire.Dashboard/Telemetry/TelemetryPropertyKeys.cs b/src/Aspire.Dashboard/Telemetry/TelemetryPropertyKeys.cs index 5a7bab96c9e..f80cf6fea2f 100644 --- a/src/Aspire.Dashboard/Telemetry/TelemetryPropertyKeys.cs +++ b/src/Aspire.Dashboard/Telemetry/TelemetryPropertyKeys.cs @@ -18,10 +18,10 @@ public static class TelemetryPropertyKeys // ConsoleLogs properties public const string ConsoleLogsShowTimestamp = AspireDashboardPropertyPrefix + "ConsoleLogs.ShowTimestamp"; - public const string ConsoleLogsApplicationName = AspireDashboardPropertyPrefix + "ConsoleLogs.ApplicationName"; + public const string ConsoleLogsResourceName = AspireDashboardPropertyPrefix + "ConsoleLogs.ResourceName"; // Metrics properties - public const string MetricsApplicationIsReplica = AspireDashboardPropertyPrefix + "Metrics.ApplicationIsReplica"; + public const string MetricsResourceIsReplica = AspireDashboardPropertyPrefix + "Metrics.ResourceIsReplica"; public const string MetricsInstrumentsCount = AspireDashboardPropertyPrefix + "Metrics.InstrumentsCount"; public const string MetricsSelectedDuration = AspireDashboardPropertyPrefix + "Metrics.SelectedDuration"; public const string MetricsSelectedView = AspireDashboardPropertyPrefix + "Metrics.SelectedView"; diff --git a/src/Aspire.Dashboard/wwwroot/css/app.css b/src/Aspire.Dashboard/wwwroot/css/app.css index 0bf95711942..b89e28493bd 100644 --- a/src/Aspire.Dashboard/wwwroot/css/app.css +++ b/src/Aspire.Dashboard/wwwroot/css/app.css @@ -670,7 +670,7 @@ fluent-switch.table-switch::part(label) { overflow-wrap: anywhere; } -.resource-select-application-label { +.resource-select-resource-label { color: var(--accent-foreground-rest); } diff --git a/tests/Aspire.Dashboard.Components.Tests/Controls/StructuredLogDetailsTests.cs b/tests/Aspire.Dashboard.Components.Tests/Controls/StructuredLogDetailsTests.cs index 310131c8ba5..d58445c2267 100644 --- a/tests/Aspire.Dashboard.Components.Tests/Controls/StructuredLogDetailsTests.cs +++ b/tests/Aspire.Dashboard.Components.Tests/Controls/StructuredLogDetailsTests.cs @@ -23,12 +23,12 @@ public void Render_ManyDuplicateAttributes_NoDuplicateKeys() StructuredLogsSetupHelpers.SetupStructuredLogsDetails(this); var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app = new OtlpApplication("app1", "instance1", uninstrumentedPeer: false, context); - var view = new OtlpApplicationView(app, new RepeatedField + var app = new OtlpResource("app1", "instance1", uninstrumentedPeer: false, context); + var view = new OtlpResourceView(app, new RepeatedField { new KeyValue { Key = "Message", Value = new AnyValue { StringValue = "value1" } }, new KeyValue { Key = "Message", Value = new AnyValue { StringValue = "value2" } }, - new KeyValue { Key = OtlpApplication.SERVICE_NAME, Value = new AnyValue { StringValue = "value1" } } + new KeyValue { Key = OtlpResource.SERVICE_NAME, Value = new AnyValue { StringValue = "value1" } } }); var model = new StructureLogsDetailsViewModel { @@ -40,7 +40,7 @@ public void Render_ManyDuplicateAttributes_NoDuplicateKeys() KeyValuePair.Create("event.name", "value1"), KeyValuePair.Create("event.name", "value2") ]), - logApp: view, + resourceView: view, scope: TelemetryTestHelpers.CreateOtlpScope( context, attributes: diff --git a/tests/Aspire.Dashboard.Components.Tests/Pages/ConsoleLogsTests.cs b/tests/Aspire.Dashboard.Components.Tests/Pages/ConsoleLogsTests.cs index 0943d213d91..da3be7bf567 100644 --- a/tests/Aspire.Dashboard.Components.Tests/Pages/ConsoleLogsTests.cs +++ b/tests/Aspire.Dashboard.Components.Tests/Pages/ConsoleLogsTests.cs @@ -45,7 +45,7 @@ public async Task NoResourceName_SingleResource_RedirectToResource() var subscribedResourceNamesChannel = Channel.CreateUnbounded(); var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); var dashboardClient = new TestDashboardClient( isEnabled: true, consoleLogsChannelProvider: name => @@ -95,8 +95,8 @@ public async Task ResourceName_SubscribeOnLoadAndChange_SubscribeConsoleLogsOnce var subscribedResourceNamesChannel = Channel.CreateUnbounded(); var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); - var testResource2 = ModelTestHelpers.CreateResource(appName: "test-resource2", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); + var testResource2 = ModelTestHelpers.CreateResource(resourceName: "test-resource2", state: KnownResourceState.Running); var dashboardClient = new TestDashboardClient( isEnabled: true, consoleLogsChannelProvider: name => @@ -177,8 +177,8 @@ public async Task ResourceName_SubscribeOnLoadAndChange_SubscribeConsoleLogsOnce public void ToggleHiddenResources_HiddenResourceVisibilityAndSelection_WorksCorrectly() { // Arrange - var regularResource = ModelTestHelpers.CreateResource(appName: "regular-resource", state: KnownResourceState.Running); - var hiddenResource = ModelTestHelpers.CreateResource(appName: "hidden-resource", state: KnownResourceState.Running, hidden: true); + var regularResource = ModelTestHelpers.CreateResource(resourceName: "regular-resource", state: KnownResourceState.Running); + var hiddenResource = ModelTestHelpers.CreateResource(resourceName: "hidden-resource", state: KnownResourceState.Running, hidden: true); var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); @@ -284,7 +284,7 @@ public void ToggleHiddenResources_HiddenResourceVisibilityAndSelection_WorksCorr public async Task ResourceName_ViaUrlAndResourceLoaded_LogViewerUpdated() { // Arrange - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); var subscribedResourceNameTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); @@ -332,7 +332,7 @@ public async Task ResourceName_ViaUrlAndResourceLoaded_LogViewerUpdated() public async Task ReadingLogs_ErrorDuringRead_SetStatusAndLog() { // Arrange - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); var subscribedResourceNameTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); @@ -381,7 +381,7 @@ public async Task ReadingLogs_ErrorDuringRead_SetStatusAndLog() public async Task ReadingLogs_ErrorDuringReadAfterDispose_StatusUnchanged() { // Arrange - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); var subscribedResourceNameTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); @@ -434,7 +434,7 @@ public void ClearLogEntries_AllResources_LogsFilteredOut() // Arrange var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); var dashboardClient = new TestDashboardClient( isEnabled: true, consoleLogsChannelProvider: name => consoleLogsChannel, @@ -491,7 +491,7 @@ public async Task ConsoleLogsManager_ClearLogs_LogsFilteredOutAsync() // Arrange var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); var dashboardClient = new TestDashboardClient( isEnabled: true, consoleLogsChannelProvider: name => consoleLogsChannel, @@ -546,7 +546,7 @@ public void MenuButtons_SelectedResourceChanged_ButtonsUpdated() { // Arrange var testResource = ModelTestHelpers.CreateResource( - appName: "test-resource", + resourceName: "test-resource", state: KnownResourceState.Running, commands: [new CommandViewModel("test-name", CommandViewModelState.Enabled, "test-displayname", "test-displaydescription", confirmationMessage: "", parameter: null, isHighlighted: true, iconName: string.Empty, iconVariant: IconVariant.Regular)]); var subscribedResourceNameTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); @@ -590,7 +590,7 @@ public void MenuButtons_SelectedResourceChanged_ButtonsUpdated() // Act 2 testResource = ModelTestHelpers.CreateResource( - appName: "test-resource", + resourceName: "test-resource", state: KnownResourceState.Running, commands: []); resourceChannel.Writer.TryWrite([ @@ -610,7 +610,7 @@ public async Task ExecuteCommand_DelayExecuting_IsExecutingReturnsTrueWhileRunni { // Arrange var testResource = ModelTestHelpers.CreateResource( - appName: "test-resource", + resourceName: "test-resource", state: KnownResourceState.Running, commands: [new CommandViewModel("test-name", CommandViewModelState.Enabled, "test-displayname", "test-displaydescription", confirmationMessage: "", parameter: null, isHighlighted: true, iconName: string.Empty, iconVariant: IconVariant.Regular)]); var subscribedResourceNameTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); @@ -672,7 +672,7 @@ public async Task ExecuteCommand_DelayExecuting_IsExecutingReturnsTrueWhileRunni public void PauseResumeButton_TogglePauseResume_LogsPausedAndResumed() { // Arrange - var testResource = ModelTestHelpers.CreateResource(appName: "test-resource", state: KnownResourceState.Running); + var testResource = ModelTestHelpers.CreateResource(resourceName: "test-resource", state: KnownResourceState.Running); var consoleLogsChannel = Channel.CreateUnbounded>(); var resourceChannel = Channel.CreateUnbounded>(); var dashboardClient = new TestDashboardClient( diff --git a/tests/Aspire.Dashboard.Components.Tests/Pages/MetricsTests.cs b/tests/Aspire.Dashboard.Components.Tests/Pages/MetricsTests.cs index 242002f2cc4..e7f609262b5 100644 --- a/tests/Aspire.Dashboard.Components.Tests/Pages/MetricsTests.cs +++ b/tests/Aspire.Dashboard.Components.Tests/Pages/MetricsTests.cs @@ -105,7 +105,7 @@ public void InitialLoad_HasSessionState_RedirectUsingState() { var state = new MetricsPageState { - ApplicationName = "TestApp2", + ResourceName = "TestApp2", MeterName = "test-meter", InstrumentName = "test-instrument", DurationMinutes = 720, @@ -214,7 +214,7 @@ public void MetricsTree_MetricsAdded_TreeUpdated() var cut = RenderComponent(builder => { builder.AddCascadingValue(new ViewportInformation(IsDesktop: true, IsUltraLowHeight: false, IsUltraLowWidth: false)); - builder.Add(m => m.ApplicationName, "TestApp"); + builder.Add(m => m.ResourceName, "TestApp"); }); // Assert 2 @@ -325,7 +325,7 @@ private void ChangeResourceAndAssertInstrument(string app1InstrumentName, string // Act 1 var cut = RenderComponent(builder => { - builder.Add(m => m.ApplicationName, "TestApp"); + builder.Add(m => m.ResourceName, "TestApp"); builder.AddCascadingValue(new ViewportInformation(IsDesktop: true, IsUltraLowHeight: false, IsUltraLowWidth: false)); }); @@ -336,7 +336,7 @@ private void ChangeResourceAndAssertInstrument(string app1InstrumentName, string cut.SetParametersAndRender(builder => { - builder.Add(m => m.ApplicationName, "TestApp2"); + builder.Add(m => m.ResourceName, "TestApp2"); }); }; @@ -351,7 +351,7 @@ private void ChangeResourceAndAssertInstrument(string app1InstrumentName, string var innerSelect = resourceSelect.Find("fluent-select"); innerSelect.Change("TestApp2"); - cut.WaitForAssertion(() => Assert.Equal("TestApp2", viewModel.SelectedApplication.Name)); + cut.WaitForAssertion(() => Assert.Equal("TestApp2", viewModel.SelectedResource.Name)); Assert.Equal(expectedInstrumentNameAfterChange, viewModel.SelectedInstrument?.Name); Assert.Equal(expectedMeterNameAfterChange, viewModel.SelectedMeter?.Name); diff --git a/tests/Aspire.Dashboard.Components.Tests/Pages/StructuredLogsTests.cs b/tests/Aspire.Dashboard.Components.Tests/Pages/StructuredLogsTests.cs index de72089a81b..cfeebcf03c2 100644 --- a/tests/Aspire.Dashboard.Components.Tests/Pages/StructuredLogsTests.cs +++ b/tests/Aspire.Dashboard.Components.Tests/Pages/StructuredLogsTests.cs @@ -69,16 +69,16 @@ public void Render_ResourceInstanceHasDashes_AppKeyResolvedCorrectly() // Act var cut = RenderComponent(builder => { - builder.Add(p => p.ApplicationName, "TestApp"); + builder.Add(p => p.ResourceName, "TestApp"); builder.Add(p => p.ViewportInformation, viewport); }); // Assert var viewModel = Services.GetRequiredService(); - Assert.NotNull(viewModel.ApplicationKey); - Assert.Equal("TestApp", viewModel.ApplicationKey.Value.Name); - Assert.Equal("abc-def", viewModel.ApplicationKey.Value.InstanceId); + Assert.NotNull(viewModel.ResourceKey); + Assert.Equal("TestApp", viewModel.ResourceKey.Value.Name); + Assert.Equal("abc-def", viewModel.ResourceKey.Value.InstanceId); } [Fact] diff --git a/tests/Aspire.Dashboard.Tests/ConsoleLogsTests/CreateResourceSelectModelsTests.cs b/tests/Aspire.Dashboard.Tests/ConsoleLogsTests/CreateResourceSelectModelsTests.cs index 75d82499b53..4acf8268e1b 100644 --- a/tests/Aspire.Dashboard.Tests/ConsoleLogsTests/CreateResourceSelectModelsTests.cs +++ b/tests/Aspire.Dashboard.Tests/ConsoleLogsTests/CreateResourceSelectModelsTests.cs @@ -16,12 +16,12 @@ public class CreateResourceSelectModelsTests public void GetViewModels_OneResource_OptionToSelectNotNull() { // Arrange - var applications = new List + var resources = new List { - ModelTestHelpers.CreateResource(appName: "App1", state: KnownResourceState.Running, displayName: "App1") + ModelTestHelpers.CreateResource(resourceName: "App1", state: KnownResourceState.Running, displayName: "App1") }; - var resourcesByName = new ConcurrentDictionary(applications.ToDictionary(app => app.Name)); + var resourcesByName = new ConcurrentDictionary(resources.ToDictionary(app => app.Name)); var unknownStateText = "unknown-state"; var selectAResourceText = "select-a-resource"; @@ -37,7 +37,7 @@ public void GetViewModels_OneResource_OptionToSelectNotNull() entry => { Assert.NotNull(entry.Id); - Assert.Equal(OtlpApplicationType.Singleton, entry.Id.Type); + Assert.Equal(OtlpResourceType.Singleton, entry.Id.Type); Assert.Equal("App1", entry.Id.InstanceId); Assert.Equal("App1", entry.Name); @@ -48,23 +48,23 @@ public void GetViewModels_OneResource_OptionToSelectNotNull() public void GetViewModels_ReturnsRightReplicas() { // Arrange - var applications = new List + var resources = new List { // replica set - ModelTestHelpers.CreateResource(appName: "App1-r1", state: KnownResourceState.Running, displayName: "App1"), - ModelTestHelpers.CreateResource(appName: "App1-r2", displayName: "App1"), + ModelTestHelpers.CreateResource(resourceName: "App1-r1", state: KnownResourceState.Running, displayName: "App1"), + ModelTestHelpers.CreateResource(resourceName: "App1-r2", displayName: "App1"), // singleton, starting state (should be listed in text) - ModelTestHelpers.CreateResource(appName: "App2", state: KnownResourceState.Starting), + ModelTestHelpers.CreateResource(resourceName: "App2", state: KnownResourceState.Starting), // singleton, finished state (should be listed in text) - ModelTestHelpers.CreateResource(appName: "App3", state: KnownResourceState.Finished), + ModelTestHelpers.CreateResource(resourceName: "App3", state: KnownResourceState.Finished), // singleton, should not have state in text - ModelTestHelpers.CreateResource(appName: "App4", state: KnownResourceState.Running) + ModelTestHelpers.CreateResource(resourceName: "App4", state: KnownResourceState.Running) }; - var resourcesByName = new ConcurrentDictionary(applications.ToDictionary(app => app.Name)); + var resourcesByName = new ConcurrentDictionary(resources.ToDictionary(app => app.Name)); var unknownStateText = "unknown-state"; var selectAResourceText = "select-a-resource"; @@ -85,7 +85,7 @@ public void GetViewModels_ReturnsRightReplicas() entry => { Assert.NotNull(entry.Id); - Assert.Equal(OtlpApplicationType.ResourceGrouping, entry.Id.Type); + Assert.Equal(OtlpResourceType.ResourceGrouping, entry.Id.Type); Assert.Null(entry.Id.InstanceId); Assert.Equal("App1", entry.Id.ReplicaSetName); @@ -94,7 +94,7 @@ public void GetViewModels_ReturnsRightReplicas() entry => { Assert.NotNull(entry.Id); - Assert.Equal(OtlpApplicationType.Instance, entry.Id.Type); + Assert.Equal(OtlpResourceType.Instance, entry.Id.Type); Assert.Equal("App1-r1", entry.Id.InstanceId); Assert.Equal("App1", entry.Id.ReplicaSetName); @@ -103,7 +103,7 @@ public void GetViewModels_ReturnsRightReplicas() entry => { Assert.NotNull(entry.Id); - Assert.Equal(OtlpApplicationType.Instance, entry.Id.Type); + Assert.Equal(OtlpResourceType.Instance, entry.Id.Type); Assert.Equal("App1-r2", entry.Id.InstanceId); Assert.Equal("App1", entry.Id.ReplicaSetName); @@ -112,7 +112,7 @@ public void GetViewModels_ReturnsRightReplicas() entry => { Assert.NotNull(entry.Id); - Assert.Equal(OtlpApplicationType.Singleton, entry.Id.Type); + Assert.Equal(OtlpResourceType.Singleton, entry.Id.Type); Assert.Equal("App2", entry.Id.InstanceId); Assert.Equal("App2 (Starting)", entry.Name); @@ -120,7 +120,7 @@ public void GetViewModels_ReturnsRightReplicas() entry => { Assert.NotNull(entry.Id); - Assert.Equal(OtlpApplicationType.Singleton, entry.Id.Type); + Assert.Equal(OtlpResourceType.Singleton, entry.Id.Type); Assert.Equal("App3", entry.Id.InstanceId); Assert.Equal("App3 (Finished)", entry.Name); @@ -128,7 +128,7 @@ public void GetViewModels_ReturnsRightReplicas() entry => { Assert.NotNull(entry.Id); - Assert.Equal(OtlpApplicationType.Singleton, entry.Id.Type); + Assert.Equal(OtlpResourceType.Singleton, entry.Id.Type); Assert.Equal("App4", entry.Id.InstanceId); Assert.Equal("App4", entry.Name); diff --git a/tests/Aspire.Dashboard.Tests/Integration/DashboardClientAuthTests.cs b/tests/Aspire.Dashboard.Tests/Integration/DashboardClientAuthTests.cs index 48a690ba245..482a294312a 100644 --- a/tests/Aspire.Dashboard.Tests/Integration/DashboardClientAuthTests.cs +++ b/tests/Aspire.Dashboard.Tests/Integration/DashboardClientAuthTests.cs @@ -41,7 +41,7 @@ public async Task ConnectsToResourceService_Unsecured(bool useHttps) await using var server = await CreateResourceServiceServerAsync(loggerFactory, useHttps).DefaultTimeout(); await using var client = await CreateDashboardClientAsync(loggerFactory, server.Url, authMode: ResourceClientAuthMode.Unsecured).DefaultTimeout(); - var call = await server.Calls.ApplicationInformationCallsChannel.Reader.ReadAsync().DefaultTimeout(); + var call = await server.Calls.ResourceInformationCallsChannel.Reader.ReadAsync().DefaultTimeout(); Assert.NotNull(call.Request); Assert.NotNull(call.RequestHeaders); @@ -57,7 +57,7 @@ public async Task ConnectsToResourceService_ApiKey(bool useHttps) await using var server = await CreateResourceServiceServerAsync(loggerFactory, useHttps).DefaultTimeout(); await using var client = await CreateDashboardClientAsync(loggerFactory, server.Url, authMode: ResourceClientAuthMode.ApiKey, configureOptions: options => options.ResourceServiceClient.ApiKey = "TestApiKey!").DefaultTimeout(); - var call = await server.Calls.ApplicationInformationCallsChannel.Reader.ReadAsync().DefaultTimeout(); + var call = await server.Calls.ResourceInformationCallsChannel.Reader.ReadAsync().DefaultTimeout(); Assert.NotNull(call.Request); Assert.NotNull(call.RequestHeaders); @@ -153,7 +153,7 @@ public async ValueTask DisposeAsync() private sealed class TestCalls { - public Channel> ApplicationInformationCallsChannel { get; } = Channel.CreateUnbounded>(); + public Channel> ResourceInformationCallsChannel { get; } = Channel.CreateUnbounded>(); } private sealed class MockDashboardService(TestCalls testCalls) : DashboardServiceBase @@ -162,7 +162,7 @@ public override Task GetApplicationInformation( ApplicationInformationRequest request, ServerCallContext context) { - testCalls.ApplicationInformationCallsChannel.Writer.TryWrite(new ReceivedCallInfo(request, context.RequestHeaders)); + testCalls.ResourceInformationCallsChannel.Writer.TryWrite(new ReceivedCallInfo(request, context.RequestHeaders)); return Task.FromResult(new ApplicationInformationResponse() { diff --git a/tests/Aspire.Dashboard.Tests/Integration/Playwright/Infrastructure/MockDashboardClient.cs b/tests/Aspire.Dashboard.Tests/Integration/Playwright/Infrastructure/MockDashboardClient.cs index 2c93291ced6..a94f7f446ec 100644 --- a/tests/Aspire.Dashboard.Tests/Integration/Playwright/Infrastructure/MockDashboardClient.cs +++ b/tests/Aspire.Dashboard.Tests/Integration/Playwright/Infrastructure/MockDashboardClient.cs @@ -11,7 +11,7 @@ namespace Aspire.Dashboard.Tests.Integration.Playwright.Infrastructure; public sealed class MockDashboardClient : IDashboardClient { public static readonly ResourceViewModel TestResource1 = ModelTestHelpers.CreateResource( - appName: "TestResource", + resourceName: "TestResource", resourceType: KnownResourceTypes.Project, properties: new[] { diff --git a/tests/Aspire.Dashboard.Tests/Integration/StartupTests.cs b/tests/Aspire.Dashboard.Tests/Integration/StartupTests.cs index 5f089eb7ce9..299f985a839 100644 --- a/tests/Aspire.Dashboard.Tests/Integration/StartupTests.cs +++ b/tests/Aspire.Dashboard.Tests/Integration/StartupTests.cs @@ -165,7 +165,7 @@ public async Task Configuration_FileConfigDirectoryDoesExist_Success(string dash WebApplicationBuilder? localBuilder = null; // Act - await using var dashboardWebApplication = IntegrationTestHelpers.CreateDashboardWebApplication(testOutputHelper, + await using var dashboardWebResource = IntegrationTestHelpers.CreateDashboardWebApplication(testOutputHelper, preConfigureBuilder: builder => { builder.Configuration.AddConfiguration(config); @@ -198,7 +198,7 @@ public async Task Configuration_FileConfigDirectoryReloadsChanges_Success() .AddInMemoryCollection(new Dictionary { [DashboardConfigNames.DashboardFileConfigDirectoryName.ConfigKey] = fileConfigDirectory.FullName }) .Build(); WebApplicationBuilder? localBuilder = null; - await using var dashboardWebApplication = IntegrationTestHelpers.CreateDashboardWebApplication(loggerFactory, + await using var dashboardWebResource = IntegrationTestHelpers.CreateDashboardWebApplication(loggerFactory, preConfigureBuilder: builder => { builder.Configuration.AddConfiguration(config); diff --git a/tests/Aspire.Dashboard.Tests/Model/ApplicationsSelectHelpersTests.cs b/tests/Aspire.Dashboard.Tests/Model/ApplicationsSelectHelpersTests.cs index 67d2e8b3d32..f58f4e25e2d 100644 --- a/tests/Aspire.Dashboard.Tests/Model/ApplicationsSelectHelpersTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/ApplicationsSelectHelpersTests.cs @@ -14,80 +14,80 @@ namespace Aspire.Dashboard.Tests.Model; -public sealed class ApplicationsSelectHelpersTests +public sealed class ResourcesSelectHelpersTests { [Fact] - public void GetApplication_SameNameAsReplica_GetInstance() + public void GetResource_SameNameAsReplica_GetInstance() { // Arrange - var appVMs = ApplicationsSelectHelpers.CreateApplications(new List + var appVMs = ResourcesSelectHelpers.CreateResources(new List { - CreateOtlpApplication(name: "multiple", instanceId: "instance"), - CreateOtlpApplication(name: "multiple", instanceId: "instanceabc"), - CreateOtlpApplication(name: "singleton", instanceId: "instanceabc") + CreateOtlpResource(name: "multiple", instanceId: "instance"), + CreateOtlpResource(name: "multiple", instanceId: "instanceabc"), + CreateOtlpResource(name: "singleton", instanceId: "instanceabc") }); Assert.Collection(appVMs, app => { Assert.Equal("multiple", app.Name); - Assert.Equal(OtlpApplicationType.ResourceGrouping, app.Id!.Type); + Assert.Equal(OtlpResourceType.ResourceGrouping, app.Id!.Type); Assert.Null(app.Id!.InstanceId); }, app => { Assert.Equal("multiple-instance", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("multiple-instance", app.Id!.InstanceId); }, app => { Assert.Equal("multiple-instanceabc", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("multiple-instanceabc", app.Id!.InstanceId); }, app => { Assert.Equal("singleton", app.Name); - Assert.Equal(OtlpApplicationType.Singleton, app.Id!.Type); + Assert.Equal(OtlpResourceType.Singleton, app.Id!.Type); Assert.Equal("singleton-instanceabc", app.Id!.InstanceId); }); // Act - var app = appVMs.GetApplication(NullLogger.Instance, "multiple-instanceabc", canSelectGrouping: false, null!); + var app = appVMs.GetResource(NullLogger.Instance, "multiple-instanceabc", canSelectGrouping: false, null!); // Assert Assert.Equal("multiple-instanceabc", app.Id!.InstanceId); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); } [Fact] - public void GetApplication_NameDifferentByCase_Merge() + public void GetResource_NameDifferentByCase_Merge() { // Arrange - var appVMs = ApplicationsSelectHelpers.CreateApplications(new List + var appVMs = ResourcesSelectHelpers.CreateResources(new List { - CreateOtlpApplication(name: "name", instanceId: "instance"), - CreateOtlpApplication(name: "NAME", instanceId: "instanceabc") + CreateOtlpResource(name: "name", instanceId: "instance"), + CreateOtlpResource(name: "NAME", instanceId: "instanceabc") }); Assert.Collection(appVMs, app => { Assert.Equal("name", app.Name); - Assert.Equal(OtlpApplicationType.ResourceGrouping, app.Id!.Type); + Assert.Equal(OtlpResourceType.ResourceGrouping, app.Id!.Type); Assert.Null(app.Id!.InstanceId); }, app => { Assert.Equal("NAME-instance", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("name-instance", app.Id!.InstanceId); }, app => { Assert.Equal("NAME-instanceabc", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("name-instanceabc", app.Id!.InstanceId); }); @@ -95,19 +95,19 @@ public void GetApplication_NameDifferentByCase_Merge() var factory = LoggerFactory.Create(b => b.AddProvider(new TestLoggerProvider(testSink))); // Act - var app = appVMs.GetApplication(factory.CreateLogger("Test"), "name-instance", canSelectGrouping: false, null!); + var app = appVMs.GetResource(factory.CreateLogger("Test"), "name-instance", canSelectGrouping: false, null!); // Assert Assert.Equal("name-instance", app.Id!.InstanceId); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Empty(testSink.Writes); } [Fact] - public void GetApplication_MultipleMatches_UseFirst() + public void GetResource_MultipleMatches_UseFirst() { // Arrange - var apps = new Dictionary(); + var apps = new Dictionary(); var appVMs = new List> { @@ -119,90 +119,90 @@ public void GetApplication_MultipleMatches_UseFirst() var factory = LoggerFactory.Create(b => b.AddProvider(new TestLoggerProvider(testSink))); // Act - var app = appVMs.GetApplication(factory.CreateLogger("Test"), "test", canSelectGrouping: false, null!); + var app = appVMs.GetResource(factory.CreateLogger("Test"), "test", canSelectGrouping: false, null!); // Assert Assert.Equal("test-abc", app.Id!.InstanceId); - Assert.Equal(OtlpApplicationType.Singleton, app.Id!.Type); + Assert.Equal(OtlpResourceType.Singleton, app.Id!.Type); Assert.Single(testSink.Writes); } [Fact] - public void GetApplication_SelectGroup_NotEnabled_ReturnNull() + public void GetResource_SelectGroup_NotEnabled_ReturnNull() { // Arrange - var appVMs = ApplicationsSelectHelpers.CreateApplications(new List + var appVMs = ResourcesSelectHelpers.CreateResources(new List { - CreateOtlpApplication(name: "app", instanceId: "123"), - CreateOtlpApplication(name: "app", instanceId: "456") + CreateOtlpResource(name: "app", instanceId: "123"), + CreateOtlpResource(name: "app", instanceId: "456") }); Assert.Collection(appVMs, app => { Assert.Equal("app", app.Name); - Assert.Equal(OtlpApplicationType.ResourceGrouping, app.Id!.Type); + Assert.Equal(OtlpResourceType.ResourceGrouping, app.Id!.Type); Assert.Null(app.Id!.InstanceId); }, app => { Assert.Equal("app-123", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("app-123", app.Id!.InstanceId); }, app => { Assert.Equal("app-456", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("app-456", app.Id!.InstanceId); }); // Act - var app = appVMs.GetApplication(NullLogger.Instance, "app", canSelectGrouping: false, null!); + var app = appVMs.GetResource(NullLogger.Instance, "app", canSelectGrouping: false, null!); // Assert Assert.Null(app); } [Fact] - public void GetApplication_SelectGroup_Enabled_ReturnGroup() + public void GetResource_SelectGroup_Enabled_ReturnGroup() { // Arrange - var appVMs = ApplicationsSelectHelpers.CreateApplications(new List + var appVMs = ResourcesSelectHelpers.CreateResources(new List { - CreateOtlpApplication(name: "app", instanceId: "123"), - CreateOtlpApplication(name: "app", instanceId: "456") + CreateOtlpResource(name: "app", instanceId: "123"), + CreateOtlpResource(name: "app", instanceId: "456") }); Assert.Collection(appVMs, app => { Assert.Equal("app", app.Name); - Assert.Equal(OtlpApplicationType.ResourceGrouping, app.Id!.Type); + Assert.Equal(OtlpResourceType.ResourceGrouping, app.Id!.Type); Assert.Null(app.Id!.InstanceId); }, app => { Assert.Equal("app-123", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("app-123", app.Id!.InstanceId); }, app => { Assert.Equal("app-456", app.Name); - Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type); + Assert.Equal(OtlpResourceType.Instance, app.Id!.Type); Assert.Equal("app-456", app.Id!.InstanceId); }); // Act - var app = appVMs.GetApplication(NullLogger.Instance, "app", canSelectGrouping: true, null!); + var app = appVMs.GetResource(NullLogger.Instance, "app", canSelectGrouping: true, null!); // Assert Assert.Equal("app", app.Name); - Assert.Equal(OtlpApplicationType.ResourceGrouping, app.Id!.Type); + Assert.Equal(OtlpResourceType.ResourceGrouping, app.Id!.Type); } - private static OtlpApplication CreateOtlpApplication(string name, string instanceId) + private static OtlpResource CreateOtlpResource(string name, string instanceId) { var resource = new Resource { @@ -212,8 +212,8 @@ private static OtlpApplication CreateOtlpApplication(string name, string instanc new KeyValue { Key = "service.instance.id", Value = new AnyValue { StringValue = instanceId } } } }; - var applicationKey = OtlpHelpers.GetApplicationKey(resource); + var key = OtlpHelpers.GetResourceKey(resource); - return new OtlpApplication(applicationKey.Name, applicationKey.InstanceId!, uninstrumentedPeer: false, TelemetryTestHelpers.CreateContext()); + return new OtlpResource(key.Name, key.InstanceId!, uninstrumentedPeer: false, TelemetryTestHelpers.CreateContext()); } } diff --git a/tests/Aspire.Dashboard.Tests/Model/ResourceMenuItemsTests.cs b/tests/Aspire.Dashboard.Tests/Model/ResourceMenuItemsTests.cs index 8638d8dc24d..e0224ddde86 100644 --- a/tests/Aspire.Dashboard.Tests/Model/ResourceMenuItemsTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/ResourceMenuItemsTests.cs @@ -52,7 +52,7 @@ public void AddMenuItems_NoTelemetry_NoTelemetryItems() public void AddMenuItems_UninstrumentedPeer_TraceItem() { // Arrange - var resource = ModelTestHelpers.CreateResource(appName: "test-abc"); + var resource = ModelTestHelpers.CreateResource(resourceName: "test-abc"); var outgoingPeerResolver = new TestOutgoingPeerResolver(onResolve: attributes => (resource.Name, resource)); var repository = TelemetryTestHelpers.CreateRepository(outgoingPeerResolvers: [outgoingPeerResolver]); var addContext = new AddContext(); @@ -105,7 +105,7 @@ public void AddMenuItems_UninstrumentedPeer_TraceItem() public void AddMenuItems_HasTelemetry_TelemetryItems() { // Arrange - var resource = ModelTestHelpers.CreateResource(appName: "test-abc"); + var resource = ModelTestHelpers.CreateResource(resourceName: "test-abc"); var repository = TelemetryTestHelpers.CreateRepository(); var addContext = new AddContext(); repository.AddTraces(addContext, new RepeatedField() diff --git a/tests/Aspire.Dashboard.Tests/Model/ResourceViewModelNameComparerTests.cs b/tests/Aspire.Dashboard.Tests/Model/ResourceViewModelNameComparerTests.cs index 4f4a88dae82..3f3cebe5097 100644 --- a/tests/Aspire.Dashboard.Tests/Model/ResourceViewModelNameComparerTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/ResourceViewModelNameComparerTests.cs @@ -15,10 +15,10 @@ public void Compare() // Arrange var resources = new[] { - ModelTestHelpers.CreateResource(appName: "database-dashboard-abc", displayName: "database-dashboard"), - ModelTestHelpers.CreateResource(appName: "database-dashboard-xyz", displayName: "database-dashboard"), - ModelTestHelpers.CreateResource(appName: "database-xyz", displayName: "database"), - ModelTestHelpers.CreateResource(appName: "database-abc", displayName: "database"), + ModelTestHelpers.CreateResource(resourceName: "database-dashboard-abc", displayName: "database-dashboard"), + ModelTestHelpers.CreateResource(resourceName: "database-dashboard-xyz", displayName: "database-dashboard"), + ModelTestHelpers.CreateResource(resourceName: "database-xyz", displayName: "database"), + ModelTestHelpers.CreateResource(resourceName: "database-abc", displayName: "database"), }; // Act diff --git a/tests/Aspire.Dashboard.Tests/Model/SpanWaterfallViewModelTests.cs b/tests/Aspire.Dashboard.Tests/Model/SpanWaterfallViewModelTests.cs index 49e8e351d71..d69e79dbcac 100644 --- a/tests/Aspire.Dashboard.Tests/Model/SpanWaterfallViewModelTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/SpanWaterfallViewModelTests.cs @@ -19,8 +19,8 @@ public void Create_HasChildren_ChildrenPopulated() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); - var app2 = new OtlpApplication("app2", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); + var app2 = new OtlpResource("app2", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); @@ -49,8 +49,8 @@ public void Create_RootSpanZeroDuration_ZeroPercentage() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); - var app1View = new OtlpApplicationView(app1, new RepeatedField()); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); + var app1View = new OtlpResourceView(app1, new RepeatedField()); var date = new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); @@ -79,8 +79,8 @@ public void Create_OutgoingPeers_BrowserLink() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); - var app2 = new OtlpApplication("app2", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); + var app2 = new OtlpResource("app2", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); @@ -106,7 +106,7 @@ public void Create_OutgoingPeers_BrowserLink() [Theory] [InlineData("1234", true)] // Matches span ID - [InlineData("app1", true)] // Matches application name + [InlineData("app1", true)] // Matches resource name [InlineData("Test", true)] // Matches display summary [InlineData("peer-service", true)] // Matches uninstrumented peer [InlineData("nonexistent", false)] // Doesn't match anything @@ -114,7 +114,7 @@ public void MatchesFilter_VariousCases_ReturnsExpected(string filter, bool expec { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); + var app = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); @@ -144,7 +144,7 @@ public void MatchesFilter_VariousCases_ReturnsExpected(string filter, bool expec new SpanWaterfallViewModel.TraceDetailState([], [])).First(); // Act - var result = vm.MatchesFilter(filter, a => a.Application.ApplicationName, out _); + var result = vm.MatchesFilter(filter, a => a.Resource.ResourceName, out _); // Assert Assert.Equal(expected, result); @@ -155,7 +155,7 @@ public void MatchesFilter_ParentSpanIncludedWhenChildMatched() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); var parentSpan = TelemetryTestHelpers.CreateOtlpSpan(app1, trace, scope, spanId: "parent", parentSpanId: null, startDate: new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc)); @@ -168,8 +168,8 @@ public void MatchesFilter_ParentSpanIncludedWhenChildMatched() var child = vms[1]; // Act and assert - Assert.True(parent.MatchesFilter("child", a => a.Application.ApplicationName, out _)); - Assert.True(child.MatchesFilter("child", a => a.Application.ApplicationName, out _)); + Assert.True(parent.MatchesFilter("child", a => a.Resource.ResourceName, out _)); + Assert.True(child.MatchesFilter("child", a => a.Resource.ResourceName, out _)); } [Fact] @@ -177,7 +177,7 @@ public void MatchesFilter_ChildSpanIncludedWhenParentMatched() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); var parentSpan = TelemetryTestHelpers.CreateOtlpSpan(app1, trace, scope, spanId: "parent", parentSpanId: null, startDate: new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc)); @@ -190,9 +190,9 @@ public void MatchesFilter_ChildSpanIncludedWhenParentMatched() var child = vms[1]; // Act and assert - Assert.True(parent.MatchesFilter("parent", a => a.Application.ApplicationName, out var descendents)); + Assert.True(parent.MatchesFilter("parent", a => a.Resource.ResourceName, out var descendents)); Assert.Equal("child", Assert.Single(descendents).Span.SpanId); - Assert.False(child.MatchesFilter("parent", a => a.Application.ApplicationName, out _)); + Assert.False(child.MatchesFilter("parent", a => a.Resource.ResourceName, out _)); } private sealed class EmptyDisposable : IDisposable diff --git a/tests/Aspire.Dashboard.Tests/Model/TraceHelpersTests.cs b/tests/Aspire.Dashboard.Tests/Model/TraceHelpersTests.cs index 2c147267aa5..de569f905a9 100644 --- a/tests/Aspire.Dashboard.Tests/Model/TraceHelpersTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/TraceHelpersTests.cs @@ -12,88 +12,88 @@ namespace Aspire.Dashboard.Tests.Model; public sealed class TraceHelpersTests { [Fact] - public void GetOrderedApplications_SingleSpan_GroupedResult() + public void GetOrderedResources_SingleSpan_GroupedResult() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app1, trace, scope, spanId: "1", parentSpanId: null, startDate: new DateTime(2001, 1, 1, 1, 1, 1, DateTimeKind.Utc))); // Act - var results = TraceHelpers.GetOrderedApplications(trace); + var results = TraceHelpers.GetOrderedResources(trace); // Assert Assert.Collection(results, g => { - Assert.Equal(app1, g.Application); + Assert.Equal(app1, g.Resource); }); } [Fact] - public void GetOrderedApplications_MultipleUnparentedSpans_GroupedResult() + public void GetOrderedResources_MultipleUnparentedSpans_GroupedResult() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); - var app2 = new OtlpApplication("app2", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); + var app2 = new OtlpResource("app2", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app2, trace, scope, spanId: "1-2", parentSpanId: "1", startDate: new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc))); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app1, trace, scope, spanId: "1-1", parentSpanId: "1", startDate: new DateTime(2001, 1, 1, 1, 1, 1, DateTimeKind.Utc))); // Act - var results = TraceHelpers.GetOrderedApplications(trace); + var results = TraceHelpers.GetOrderedResources(trace); // Assert Assert.Collection(results, g => { - Assert.Equal(app1, g.Application); + Assert.Equal(app1, g.Resource); }, g => { - Assert.Equal(app2, g.Application); + Assert.Equal(app2, g.Resource); }); } [Fact] - public void GetOrderedApplications_ChildSpanAfterParentSpan_GroupedResult() + public void GetOrderedResources_ChildSpanAfterParentSpan_GroupedResult() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); - var app2 = new OtlpApplication("app2", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); + var app2 = new OtlpResource("app2", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app1, trace, scope, spanId: "1", parentSpanId: null, startDate: new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc))); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app2, trace, scope, spanId: "1-1", parentSpanId: "1", startDate: new DateTime(2001, 1, 1, 1, 1, 1, DateTimeKind.Utc))); // Act - var results = TraceHelpers.GetOrderedApplications(trace); + var results = TraceHelpers.GetOrderedResources(trace); // Assert Assert.Collection(results, g => { - Assert.Equal(app1, g.Application); + Assert.Equal(app1, g.Resource); }, g => { - Assert.Equal(app2, g.Application); + Assert.Equal(app2, g.Resource); }); } [Fact] - public void GetOrderedApplications_ChildSpanDifferentStartTime_GroupedResult() + public void GetOrderedResources_ChildSpanDifferentStartTime_GroupedResult() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); - var app2 = new OtlpApplication("app2", "instance", uninstrumentedPeer: false, context); - var app3 = new OtlpApplication("app3", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); + var app2 = new OtlpResource("app2", "instance", uninstrumentedPeer: false, context); + var app3 = new OtlpResource("app3", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app1, trace, scope, spanId: "1", parentSpanId: null, startDate: new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc))); @@ -102,53 +102,53 @@ public void GetOrderedApplications_ChildSpanDifferentStartTime_GroupedResult() trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app3, trace, scope, spanId: "1-2", parentSpanId: "1", startDate: new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc))); // Act - var results = TraceHelpers.GetOrderedApplications(trace); + var results = TraceHelpers.GetOrderedResources(trace); // Assert Assert.Collection(results, g => { - Assert.Equal(app1, g.Application); + Assert.Equal(app1, g.Resource); }, g => { - Assert.Equal(app3, g.Application); + Assert.Equal(app3, g.Resource); }, g => { - Assert.Equal(app2, g.Application); + Assert.Equal(app2, g.Resource); }); } [Fact] - public void GetOrderedApplications_HasUninstrumentedPeer_AddedToResults() + public void GetOrderedResources_HasUninstrumentedPeer_AddedToResults() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); - var app2 = new OtlpApplication("app2", "instance", uninstrumentedPeer: false, context); - var app3 = new OtlpApplication("app3", "instance", uninstrumentedPeer: true, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); + var app2 = new OtlpResource("app2", "instance", uninstrumentedPeer: false, context); + var app3 = new OtlpResource("app3", "instance", uninstrumentedPeer: true, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app1, trace, scope, spanId: "1", parentSpanId: null, startDate: new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc))); trace.AddSpan(TelemetryTestHelpers.CreateOtlpSpan(app2, trace, scope, spanId: "1-1", parentSpanId: "1", startDate: new DateTime(2001, 1, 1, 1, 1, 3, DateTimeKind.Utc), uninstrumentedPeer: app3)); // Act - var results = TraceHelpers.GetOrderedApplications(trace); + var results = TraceHelpers.GetOrderedResources(trace); // Assert Assert.Collection(results, g => { - Assert.Equal(app1, g.Application); + Assert.Equal(app1, g.Resource); }, g => { - Assert.Equal(app2, g.Application); + Assert.Equal(app2, g.Resource); }, g => { - Assert.Equal(app3, g.Application); + Assert.Equal(app3, g.Resource); }); } } diff --git a/tests/Aspire.Dashboard.Tests/ResourceOutgoingPeerResolverTests.cs b/tests/Aspire.Dashboard.Tests/ResourceOutgoingPeerResolverTests.cs index 0888fc44948..a8c0558807e 100644 --- a/tests/Aspire.Dashboard.Tests/ResourceOutgoingPeerResolverTests.cs +++ b/tests/Aspire.Dashboard.Tests/ResourceOutgoingPeerResolverTests.cs @@ -17,7 +17,7 @@ public class ResourceOutgoingPeerResolverTests private static ResourceViewModel CreateResource(string name, string? serviceAddress = null, int? servicePort = null, string? displayName = null, KnownResourceState? state = null) { return ModelTestHelpers.CreateResource( - appName: name, + resourceName: name, displayName: displayName, state: state, urls: serviceAddress is null || servicePort is null ? [] : [new UrlViewModel(name, new($"http://{serviceAddress}:{servicePort}"), isInternal: false, isInactive: false, displayProperties: UrlDisplayPropertiesViewModel.Empty)]); @@ -334,7 +334,7 @@ private static ResourceViewModel CreateResourceWithConnectionString(string name, }; return ModelTestHelpers.CreateResource( - appName: name, + resourceName: name, resourceType: KnownResourceTypes.ConnectionString, properties: properties); } @@ -352,7 +352,7 @@ private static ResourceViewModel CreateResourceWithParameterValue(string name, s }; return ModelTestHelpers.CreateResource( - appName: name, + resourceName: name, resourceType: KnownResourceTypes.Parameter, properties: properties); } diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/LogTests.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/LogTests.cs index c453987b727..3a17951ff28 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/LogTests.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/LogTests.cs @@ -54,30 +54,30 @@ public void AddLogs() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, StartIndex = 0, Count = 10, Filters = [] }); Assert.Collection(logs.Items, - app => + resource => { - Assert.Equal("546573745370616e4964", app.SpanId); - Assert.Equal("5465737454726163654964", app.TraceId); - Assert.Equal("Test {Log}", app.OriginalFormat); - Assert.Equal("Test Value!", app.Message); - Assert.Equal("TestLogger", app.Scope.Name); - Assert.Collection(app.Attributes, + Assert.Equal("546573745370616e4964", resource.SpanId); + Assert.Equal("5465737454726163654964", resource.TraceId); + Assert.Equal("Test {Log}", resource.OriginalFormat); + Assert.Equal("Test Value!", resource.Message); + Assert.Equal("TestLogger", resource.Scope.Name); + Assert.Collection(resource.Attributes, p => { Assert.Equal("Log", p.Key); @@ -85,7 +85,7 @@ public void AddLogs() }); }); - var propertyKeys = repository.GetLogPropertyKeys(applications[0].ApplicationKey)!; + var propertyKeys = repository.GetLogPropertyKeys(resources[0].ResourceKey)!; Assert.Collection(propertyKeys, s => Assert.Equal("Log", s)); } @@ -119,15 +119,15 @@ public void AddLogs_NoBody_EmptyMessage() var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = null, + ResourceKey = null, StartIndex = 0, Count = 10, Filters = [] }); Assert.Collection(logs.Items, - app => + resource => { - Assert.Equal("", app.Message); + Assert.Equal("", resource.Message); }); } @@ -171,7 +171,7 @@ public void AddLogs_MultipleOutOfOrder() var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = null, + ResourceKey = null, StartIndex = 0, Count = 10, Filters = [] @@ -243,29 +243,29 @@ public void AddLogs_Error_UnviewedCount() // Assert Assert.Equal(0, addContext.FailureCount); - var unviewedCounts1 = repository.GetApplicationUnviewedErrorLogsCount(); + var unviewedCounts1 = repository.GetResourceUnviewedErrorLogsCount(); - Assert.True(unviewedCounts1.TryGetValue(new ApplicationKey("TestService", "1"), out var unviewedCount1)); + Assert.True(unviewedCounts1.TryGetValue(new ResourceKey("TestService", "1"), out var unviewedCount1)); Assert.Equal(2, unviewedCount1); - Assert.True(unviewedCounts1.TryGetValue(new ApplicationKey("TestService", "2"), out var unviewedCount2)); + Assert.True(unviewedCounts1.TryGetValue(new ResourceKey("TestService", "2"), out var unviewedCount2)); Assert.Equal(1, unviewedCount2); - repository.MarkViewedErrorLogs(new ApplicationKey("TestService", "1")); + repository.MarkViewedErrorLogs(new ResourceKey("TestService", "1")); - var unviewedCounts2 = repository.GetApplicationUnviewedErrorLogsCount(); + var unviewedCounts2 = repository.GetResourceUnviewedErrorLogsCount(); - Assert.False(unviewedCounts2.TryGetValue(new ApplicationKey("TestService", "1"), out _)); + Assert.False(unviewedCounts2.TryGetValue(new ResourceKey("TestService", "1"), out _)); - Assert.True(unviewedCounts2.TryGetValue(new ApplicationKey("TestService", "2"), out unviewedCount2)); + Assert.True(unviewedCounts2.TryGetValue(new ResourceKey("TestService", "2"), out unviewedCount2)); Assert.Equal(1, unviewedCount2); repository.MarkViewedErrorLogs(null); - var unviewedCounts3 = repository.GetApplicationUnviewedErrorLogsCount(); + var unviewedCounts3 = repository.GetResourceUnviewedErrorLogsCount(); - Assert.False(unviewedCounts3.TryGetValue(new ApplicationKey("TestService", "1"), out _)); - Assert.False(unviewedCounts3.TryGetValue(new ApplicationKey("TestService", "2"), out _)); + Assert.False(unviewedCounts3.TryGetValue(new ResourceKey("TestService", "1"), out _)); + Assert.False(unviewedCounts3.TryGetValue(new ResourceKey("TestService", "2"), out _)); } [Fact] @@ -273,7 +273,7 @@ public void AddLogs_Error_UnviewedCount_WithReadSubscriptionAll() { // Arrange var repository = CreateRepository(); - using var subscription = repository.OnNewLogs(applicationKey: null, SubscriptionType.Read, () => Task.CompletedTask); + using var subscription = repository.OnNewLogs(resourceKey: null, SubscriptionType.Read, () => Task.CompletedTask); // Act var addContext = new AddContext(); @@ -314,10 +314,10 @@ public void AddLogs_Error_UnviewedCount_WithReadSubscriptionAll() // Assert Assert.Equal(0, addContext.FailureCount); - var unviewedCounts = repository.GetApplicationUnviewedErrorLogsCount(); + var unviewedCounts = repository.GetResourceUnviewedErrorLogsCount(); - Assert.False(unviewedCounts.TryGetValue(new ApplicationKey("TestService", "1"), out _)); - Assert.False(unviewedCounts.TryGetValue(new ApplicationKey("TestService", "2"), out _)); + Assert.False(unviewedCounts.TryGetValue(new ResourceKey("TestService", "1"), out _)); + Assert.False(unviewedCounts.TryGetValue(new ResourceKey("TestService", "2"), out _)); } [Fact] @@ -325,7 +325,7 @@ public void AddLogs_Error_UnviewedCount_WithReadSubscriptionOneApp() { // Arrange var repository = CreateRepository(); - using var subscription = repository.OnNewLogs(applicationKey: new ApplicationKey("TestService", "1"), SubscriptionType.Read, () => Task.CompletedTask); + using var subscription = repository.OnNewLogs(resourceKey: new ResourceKey("TestService", "1"), SubscriptionType.Read, () => Task.CompletedTask); // Act var addContext = new AddContext(); @@ -366,10 +366,10 @@ public void AddLogs_Error_UnviewedCount_WithReadSubscriptionOneApp() // Assert Assert.Equal(0, addContext.FailureCount); - var unviewedCounts = repository.GetApplicationUnviewedErrorLogsCount(); + var unviewedCounts = repository.GetResourceUnviewedErrorLogsCount(); - Assert.False(unviewedCounts.TryGetValue(new ApplicationKey("TestService", "1"), out _)); - Assert.True(unviewedCounts.TryGetValue(new ApplicationKey("TestService", "2"), out var unviewedCount)); + Assert.False(unviewedCounts.TryGetValue(new ResourceKey("TestService", "1"), out _)); + Assert.True(unviewedCounts.TryGetValue(new ResourceKey("TestService", "2"), out var unviewedCount)); Assert.Equal(1, unviewedCount); } @@ -378,7 +378,7 @@ public void AddLogs_Error_UnviewedCount_WithNonReadSubscription() { // Arrange var repository = CreateRepository(); - using var subscription = repository.OnNewLogs(applicationKey: null, SubscriptionType.Other, () => Task.CompletedTask); + using var subscription = repository.OnNewLogs(resourceKey: null, SubscriptionType.Other, () => Task.CompletedTask); // Act var addContext = new AddContext(); @@ -404,14 +404,14 @@ public void AddLogs_Error_UnviewedCount_WithNonReadSubscription() // Assert Assert.Equal(0, addContext.FailureCount); - var unviewedCounts = repository.GetApplicationUnviewedErrorLogsCount(); + var unviewedCounts = repository.GetResourceUnviewedErrorLogsCount(); - Assert.True(unviewedCounts.TryGetValue(new ApplicationKey("TestService", "1"), out var unviewedCount)); + Assert.True(unviewedCounts.TryGetValue(new ResourceKey("TestService", "1"), out var unviewedCount)); Assert.Equal(1, unviewedCount); } [Fact] - public void GetLogs_UnknownApplication() + public void GetLogs_UnknownResource() { // Arrange var repository = CreateRepository(); @@ -419,7 +419,7 @@ public void GetLogs_UnknownApplication() // Act var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = new ApplicationKey("TestService", "UnknownApplication"), + ResourceKey = new ResourceKey("TestService", "UnknownResource"), StartIndex = 0, Count = 10, Filters = [] @@ -430,13 +430,13 @@ public void GetLogs_UnknownApplication() } [Fact] - public void GetLogPropertyKeys_UnknownApplication() + public void GetLogPropertyKeys_UnknownResource() { // Arrange var repository = CreateRepository(); // Act - var propertyKeys = repository.GetLogPropertyKeys(new ApplicationKey("TestService", "UnknownApplication")); + var propertyKeys = repository.GetLogPropertyKeys(new ResourceKey("TestService", "UnknownResource")); // Assert Assert.Empty(propertyKeys); @@ -448,10 +448,10 @@ public async Task Subscriptions_AddLog() // Arrange var repository = CreateRepository(); - var newApplicationsTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - repository.OnNewApplications(() => + var newResourcesTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + repository.OnNewResources(() => { - newApplicationsTcs.TrySetResult(); + newResourcesTcs.TrySetResult(); return Task.CompletedTask; }); @@ -475,19 +475,19 @@ public async Task Subscriptions_AddLog() // Assert 1 Assert.Equal(0, addContext1.FailureCount); - await newApplicationsTcs.Task.DefaultTimeout(); + await newResourcesTcs.Task.DefaultTimeout(); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); // Act 2 var newLogsTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - repository.OnNewLogs(applications[0].ApplicationKey, SubscriptionType.Read, () => + repository.OnNewLogs(resources[0].ResourceKey, SubscriptionType.Read, () => { newLogsTcs.TrySetResult(); return Task.CompletedTask; @@ -517,7 +517,7 @@ public async Task Subscriptions_AddLog() var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, StartIndex = 0, Count = 1, Filters = [] @@ -532,10 +532,10 @@ public void Unsubscribe() // Arrange var repository = CreateRepository(); - var onNewApplicationsCalled = false; - var subscription = repository.OnNewApplications(() => + var onNewResourcesCalled = false; + var subscription = repository.OnNewResources(() => { - onNewApplicationsCalled = true; + onNewResourcesCalled = true; return Task.CompletedTask; }); subscription.Dispose(); @@ -560,7 +560,7 @@ public void Unsubscribe() // Assert Assert.Equal(0, addContext.FailureCount); - Assert.False(onNewApplicationsCalled, "Callback shouldn't have been called because subscription was disposed."); + Assert.False(onNewResourcesCalled, "Callback shouldn't have been called because subscription was disposed."); } [Fact] @@ -573,7 +573,7 @@ public async Task Subscription_RaisedFromDifferentContext_InitialContextPreserve var repository = CreateRepository(); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var subscription = repository.OnNewApplications(() => + var subscription = repository.OnNewResources(() => { tcs.SetResult(asyncLocal.Value); return Task.CompletedTask; @@ -649,27 +649,27 @@ public void AddLogs_AttributeLimits_LimitsApplied() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, StartIndex = 0, Count = 10, Filters = [] }); Assert.Collection(logs.Items, - app => + resource => { - Assert.Equal("Test {Log}", app.OriginalFormat); - Assert.Equal("0123456789012345", app.Message); - Assert.Collection(app.Attributes, + Assert.Equal("Test {Log}", resource.OriginalFormat); + Assert.Equal("0123456789012345", resource.Message); + Assert.Collection(resource.Attributes, p => { Assert.Equal("Key0", p.Key); @@ -710,7 +710,7 @@ public async Task Subscription_MultipleUpdates_MinExecuteIntervalApplied() var callCount = 0; var resultChannel = Channel.CreateUnbounded(); - var subscription = repository.OnNewLogs(applicationKey: null, SubscriptionType.Read, async () => + var subscription = repository.OnNewLogs(resourceKey: null, SubscriptionType.Read, async () => { if (!stopwatch.IsRunning) { @@ -802,12 +802,12 @@ public void FilterLogs_With_Message_Returns_CorrectLog() } }); - var applicationKey = repository.GetApplications().First().ApplicationKey; + var resourceKey = repository.GetResources().First().ResourceKey; // Assert Assert.Empty(repository.GetLogs(new GetLogsContext { - ApplicationKey = applicationKey, + ResourceKey = resourceKey, StartIndex = 0, Count = 1, Filters = [new TelemetryFilter { Condition = FilterCondition.Contains, Field = nameof(OtlpLogEntry.Message), Value = "does_not_contain" }] @@ -815,7 +815,7 @@ public void FilterLogs_With_Message_Returns_CorrectLog() Assert.Single(repository.GetLogs(new GetLogsContext { - ApplicationKey = applicationKey, + ResourceKey = resourceKey, StartIndex = 0, Count = 1, Filters = [new TelemetryFilter { Condition = FilterCondition.Contains, Field = nameof(OtlpLogEntry.Message), Value = "message" }] @@ -861,35 +861,35 @@ public void AddLogs_MultipleResources_SameInstanceId_CreateMultipleResources() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("App1", app.ApplicationName); - Assert.Equal("computer-name", app.InstanceId); + Assert.Equal("App1", resource.ResourceName); + Assert.Equal("computer-name", resource.InstanceId); }, - app => + resource => { - Assert.Equal("App2", app.ApplicationName); - Assert.Equal("computer-name", app.InstanceId); + Assert.Equal("App2", resource.ResourceName); + Assert.Equal("computer-name", resource.InstanceId); }); var logs1 = repository.GetLogs(new GetLogsContext { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, StartIndex = 0, Count = 10, Filters = [] }); Assert.Collection(logs1.Items, - app => + resource => { - Assert.Equal("546573745370616e4964", app.SpanId); - Assert.Equal("5465737454726163654964", app.TraceId); - Assert.Equal("Test {Log}", app.OriginalFormat); - Assert.Equal("Test Value!", app.Message); - Assert.Equal("TestLogger", app.Scope.Name); - Assert.Collection(app.Attributes, + Assert.Equal("546573745370616e4964", resource.SpanId); + Assert.Equal("5465737454726163654964", resource.TraceId); + Assert.Equal("Test {Log}", resource.OriginalFormat); + Assert.Equal("Test Value!", resource.Message); + Assert.Equal("TestLogger", resource.Scope.Name); + Assert.Collection(resource.Attributes, p => { Assert.Equal("Log", p.Key); @@ -899,20 +899,20 @@ public void AddLogs_MultipleResources_SameInstanceId_CreateMultipleResources() var logs2 = repository.GetLogs(new GetLogsContext { - ApplicationKey = applications[1].ApplicationKey, + ResourceKey = resources[1].ResourceKey, StartIndex = 0, Count = 10, Filters = [] }); Assert.Collection(logs2.Items, - app => + resource => { - Assert.Equal("546573745370616e4964", app.SpanId); - Assert.Equal("5465737454726163654964", app.TraceId); - Assert.Equal("Test {Log}", app.OriginalFormat); - Assert.Equal("Test Value!", app.Message); - Assert.Equal("TestLogger", app.Scope.Name); - Assert.Collection(app.Attributes, + Assert.Equal("546573745370616e4964", resource.SpanId); + Assert.Equal("5465737454726163654964", resource.TraceId); + Assert.Equal("Test {Log}", resource.OriginalFormat); + Assert.Equal("Test Value!", resource.Message); + Assert.Equal("TestLogger", resource.Scope.Name); + Assert.Collection(resource.Attributes, p => { Assert.Equal("Log", p.Key); @@ -933,7 +933,7 @@ public void GetLogs_MultipleInstances() { new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeLogs = { new ScopeLogs @@ -945,7 +945,7 @@ public void GetLogs_MultipleInstances() }, new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeLogs = { new ScopeLogs @@ -957,7 +957,7 @@ public void GetLogs_MultipleInstances() }, new ResourceLogs { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeLogs = { new ScopeLogs @@ -972,31 +972,31 @@ public void GetLogs_MultipleInstances() // Assert Assert.Equal(0, addContext.FailureCount); - var appKey = new ApplicationKey("app1", InstanceId: null); + var resourceKey = new ResourceKey("resource1", InstanceId: null); var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = appKey, + ResourceKey = resourceKey, StartIndex = 0, Count = 10, Filters = [] }); Assert.Collection(logs.Items, - app => + resource => { - Assert.Equal("message-1", app.Message); - Assert.Equal("TestLogger", app.Scope.Name); - Assert.Collection(app.Attributes, + Assert.Equal("message-1", resource.Message); + Assert.Equal("TestLogger", resource.Scope.Name); + Assert.Collection(resource.Attributes, p => { Assert.Equal("key-1", p.Key); Assert.Equal("value-1", p.Value); }); }, - app => + resource => { - Assert.Equal("message-2", app.Message); - Assert.Equal("TestLogger", app.Scope.Name); - Assert.Collection(app.Attributes, + Assert.Equal("message-2", resource.Message); + Assert.Equal("TestLogger", resource.Scope.Name); + Assert.Collection(resource.Attributes, p => { Assert.Equal("key-2", p.Key); @@ -1004,7 +1004,7 @@ public void GetLogs_MultipleInstances() }); }); - var propertyKeys = repository.GetLogPropertyKeys(appKey)!; + var propertyKeys = repository.GetLogPropertyKeys(resourceKey)!; Assert.Collection(propertyKeys, s => Assert.Equal("key-1", s), s => Assert.Equal("key-2", s)); @@ -1021,7 +1021,7 @@ public void RemoveLogs_All() { new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeLogs = { new ScopeLogs @@ -1033,7 +1033,7 @@ public void RemoveLogs_All() }, new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeLogs = { new ScopeLogs @@ -1045,7 +1045,7 @@ public void RemoveLogs_All() }, new ResourceLogs { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeLogs = { new ScopeLogs @@ -1065,7 +1065,7 @@ public void RemoveLogs_All() var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = null, + ResourceKey = null, StartIndex = 0, Count = 10, Filters = [] @@ -1086,7 +1086,7 @@ public void RemoveLogs_SelectedResource() { new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeLogs = { new ScopeLogs @@ -1098,7 +1098,7 @@ public void RemoveLogs_SelectedResource() }, new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeLogs = { new ScopeLogs @@ -1110,7 +1110,7 @@ public void RemoveLogs_SelectedResource() }, new ResourceLogs { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeLogs = { new ScopeLogs @@ -1123,29 +1123,29 @@ public void RemoveLogs_SelectedResource() }); // Act - repository.ClearStructuredLogs(new ApplicationKey("app1", "123")); + repository.ClearStructuredLogs(new ResourceKey("resource1", "123")); // Assert Assert.Equal(0, addContext.FailureCount); var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = null, + ResourceKey = null, StartIndex = 0, Count = 10, Filters = [] }); Assert.Equal(2, logs.TotalItemCount); Assert.Collection(logs.Items, - app => + resource => { - Assert.Equal("message-2", app.Message); - Assert.Equal("TestLogger", app.Scope.Name); + Assert.Equal("message-2", resource.Message); + Assert.Equal("TestLogger", resource.Scope.Name); }, - app => + resource => { - Assert.Equal("message-3", app.Message); - Assert.Equal("TestLogger", app.Scope.Name); + Assert.Equal("message-3", resource.Message); + Assert.Equal("TestLogger", resource.Scope.Name); }); } @@ -1160,7 +1160,7 @@ public void RemoveLogs_MultipleSelectedResources() { new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeLogs = { new ScopeLogs @@ -1172,7 +1172,7 @@ public void RemoveLogs_MultipleSelectedResources() }, new ResourceLogs { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeLogs = { new ScopeLogs @@ -1184,7 +1184,7 @@ public void RemoveLogs_MultipleSelectedResources() }, new ResourceLogs { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeLogs = { new ScopeLogs @@ -1197,14 +1197,14 @@ public void RemoveLogs_MultipleSelectedResources() }); // Act - repository.ClearStructuredLogs(new ApplicationKey("app1", null)); + repository.ClearStructuredLogs(new ResourceKey("resource1", null)); // Assert Assert.Equal(0, addContext.FailureCount); var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = null, + ResourceKey = null, StartIndex = 0, Count = 10, Filters = [] @@ -1244,15 +1244,15 @@ public void AddLogs_ObservedUnixTimeNanos() var logs = repository.GetLogs(new GetLogsContext { - ApplicationKey = null, + ResourceKey = null, StartIndex = 0, Count = 10, Filters = [] }); Assert.Collection(logs.Items, - app => + resource => { - Assert.Equal(s_testTime.AddMinutes(1), app.TimeStamp); + Assert.Equal(s_testTime.AddMinutes(1), resource.TimeStamp); }); } } diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/MetricsTests.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/MetricsTests.cs index 99edbc85460..49a2697b8d4 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/MetricsTests.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/MetricsTests.cs @@ -60,15 +60,15 @@ public void AddMetrics() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); - var instruments = repository.GetInstrumentsSummaries(applications[0].ApplicationKey); + var instruments = repository.GetInstrumentsSummaries(resources[0].ResourceKey); Assert.Collection(instruments, instrument => { @@ -140,17 +140,17 @@ public void AddMetrics_MeterAttributeLimits_LimitsApplied() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, InstrumentName = "test", MeterName = "test-meter", StartTime = DateTime.MinValue, @@ -256,17 +256,17 @@ public void AddMetrics_MetricAttributeLimits_LimitsApplied() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, InstrumentName = "test", MeterName = "test-meter", StartTime = DateTime.MinValue, @@ -354,17 +354,17 @@ public void GetInstrument() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var instrumentData = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, InstrumentName = "test", MeterName = "test-meter", StartTime = s_testTime.AddMinutes(1), @@ -397,7 +397,7 @@ public void GetInstrument() Assert.Equal("key1", exemplar.Attributes[0].Key); Assert.Equal("value1", exemplar.Attributes[0].Value); - var instrument = applications.Single().GetInstrument("test-meter", "test", s_testTime.AddMinutes(1), s_testTime.AddMinutes(1.5)); + var instrument = resources.Single().GetInstrument("test-meter", "test", s_testTime.AddMinutes(1), s_testTime.AddMinutes(1.5)); Assert.NotNull(instrument); AssertDimensionValues(instrument.Dimensions, Array.Empty>(), valueCount: 1); @@ -461,17 +461,17 @@ public void AddMetrics_Capacity_ValuesRemoved() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, InstrumentName = "test", MeterName = "test-meter", StartTime = DateTime.MinValue, @@ -518,7 +518,7 @@ public void GetMetrics_MultipleInstances() { new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeMetrics = { new ScopeMetrics @@ -534,7 +534,7 @@ public void GetMetrics_MultipleInstances() }, new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeMetrics = { new ScopeMetrics @@ -550,7 +550,7 @@ public void GetMetrics_MultipleInstances() }, new ResourceMetrics { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeMetrics = { new ScopeMetrics @@ -569,8 +569,8 @@ public void GetMetrics_MultipleInstances() // Assert Assert.Equal(0, addContext.FailureCount); - var appKey = new ApplicationKey("app1", InstanceId: null); - var instruments = repository.GetInstrumentsSummaries(appKey); + var resourceKey = new ResourceKey("resource1", InstanceId: null); + var instruments = repository.GetInstrumentsSummaries(resourceKey); Assert.Collection(instruments, instrument => { @@ -589,7 +589,7 @@ public void GetMetrics_MultipleInstances() var instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = appKey, + ResourceKey = resourceKey, InstrumentName = "test1", MeterName = "test-meter", StartTime = s_testTime, @@ -636,7 +636,7 @@ public void RemoveMetrics_All() { new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeMetrics = { new ScopeMetrics @@ -652,7 +652,7 @@ public void RemoveMetrics_All() }, new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeMetrics = { new ScopeMetrics @@ -668,7 +668,7 @@ public void RemoveMetrics_All() }, new ResourceMetrics { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeMetrics = { new ScopeMetrics @@ -690,14 +690,14 @@ public void RemoveMetrics_All() // Assert Assert.Equal(0, addContext.FailureCount); - var app1Key = new ApplicationKey("app1", InstanceId: null); - var app1Instruments = repository.GetInstrumentsSummaries(app1Key); - Assert.Empty(app1Instruments); + var resource1Key = new ResourceKey("resource1", InstanceId: null); + var resource1Instruments = repository.GetInstrumentsSummaries(resource1Key); + Assert.Empty(resource1Instruments); - var app2Key = new ApplicationKey("app2", InstanceId: null); - var app2Instruments = repository.GetInstrumentsSummaries(app2Key); + var resource2Key = new ResourceKey("resource2", InstanceId: null); + var resource2Instruments = repository.GetInstrumentsSummaries(resource2Key); - Assert.Empty(app2Instruments); + Assert.Empty(resource2Instruments); } [Fact] @@ -711,7 +711,7 @@ public void RemoveMetrics_SelectedResource() { new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeMetrics = { new ScopeMetrics @@ -727,7 +727,7 @@ public void RemoveMetrics_SelectedResource() }, new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeMetrics = { new ScopeMetrics @@ -743,7 +743,7 @@ public void RemoveMetrics_SelectedResource() }, new ResourceMetrics { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeMetrics = { new ScopeMetrics @@ -760,34 +760,34 @@ public void RemoveMetrics_SelectedResource() }); // Act - repository.ClearMetrics(new ApplicationKey("app1", "456")); + repository.ClearMetrics(new ResourceKey("resource1", "456")); // Assert Assert.Equal(0, addContext.FailureCount); - var app1Key = new ApplicationKey("app1", InstanceId: null); - var app1Instruments = repository.GetInstrumentsSummaries(app1Key); + var resource1Key = new ResourceKey("resource1", InstanceId: null); + var resource1Instruments = repository.GetInstrumentsSummaries(resource1Key); - var app1Instrument = Assert.Single(app1Instruments); - Assert.Equal("test1", app1Instrument.Name); - Assert.Equal("Test metric description", app1Instrument.Description); - Assert.Equal("widget", app1Instrument.Unit); - Assert.Equal("test-meter", app1Instrument.Parent.Name); + var resource1Instrument = Assert.Single(resource1Instruments); + Assert.Equal("test1", resource1Instrument.Name); + Assert.Equal("Test metric description", resource1Instrument.Description); + Assert.Equal("widget", resource1Instrument.Unit); + Assert.Equal("test-meter", resource1Instrument.Parent.Name); - var app1Test1Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource1Test1Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app1Key, + ResourceKey = resource1Key, InstrumentName = "test1", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.NotNull(app1Test1Instrument); - Assert.Equal("test1", app1Test1Instrument.Summary.Name); + Assert.NotNull(resource1Test1Instrument); + Assert.Equal("test1", resource1Test1Instrument.Summary.Name); - var app1Test1Dimensions = Assert.Single(app1Test1Instrument.Dimensions); - Assert.Collection(app1Test1Dimensions.Values, + var resource1Test1Dimensions = Assert.Single(resource1Test1Instrument.Dimensions); + Assert.Collection(resource1Test1Dimensions.Values, v => { Assert.Equal(1, ((MetricValue)v).Value); @@ -797,21 +797,21 @@ public void RemoveMetrics_SelectedResource() Assert.Equal(2, ((MetricValue)v).Value); }); - var app1Test2Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource1Test2Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app1Key, + ResourceKey = resource1Key, InstrumentName = "test2", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.Null(app1Test2Instrument); + Assert.Null(resource1Test2Instrument); - var app2Key = new ApplicationKey("app2", InstanceId: null); - var app2Instruments = repository.GetInstrumentsSummaries(app2Key); + var resource2Key = new ResourceKey("resource2", InstanceId: null); + var resource2Instruments = repository.GetInstrumentsSummaries(resource2Key); - Assert.Collection(app2Instruments, + Assert.Collection(resource2Instruments, instrument => { Assert.Equal("test1", instrument.Name); @@ -827,35 +827,35 @@ public void RemoveMetrics_SelectedResource() Assert.Equal("test-meter", instrument.Parent.Name); }); - var app2Test1Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource2Test1Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app2Key, + ResourceKey = resource2Key, InstrumentName = "test1", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.NotNull(app2Test1Instrument); - Assert.Equal("test1", app2Test1Instrument.Summary.Name); + Assert.NotNull(resource2Test1Instrument); + Assert.Equal("test1", resource2Test1Instrument.Summary.Name); - var app2Test1Dimensions = Assert.Single(app2Test1Instrument.Dimensions); - Assert.Equal(5, ((MetricValue)app2Test1Dimensions.Values.Single()).Value); + var resource2Test1Dimensions = Assert.Single(resource2Test1Instrument.Dimensions); + Assert.Equal(5, ((MetricValue)resource2Test1Dimensions.Values.Single()).Value); - var app2Test3Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource2Test3Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app2Key, + ResourceKey = resource2Key, InstrumentName = "test3", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.NotNull(app2Test3Instrument); - Assert.Equal("test3", app2Test3Instrument.Summary.Name); + Assert.NotNull(resource2Test3Instrument); + Assert.Equal("test3", resource2Test3Instrument.Summary.Name); - var app2Test3Dimensions = Assert.Single(app2Test3Instrument.Dimensions); - Assert.Equal(6, ((MetricValue)app2Test3Dimensions.Values.Single()).Value); + var resource2Test3Dimensions = Assert.Single(resource2Test3Instrument.Dimensions); + Assert.Equal(6, ((MetricValue)resource2Test3Dimensions.Values.Single()).Value); } [Fact] @@ -869,7 +869,7 @@ public void RemoveMetrics_MultipleSelectedResources() { new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeMetrics = { new ScopeMetrics @@ -885,7 +885,7 @@ public void RemoveMetrics_MultipleSelectedResources() }, new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeMetrics = { new ScopeMetrics @@ -901,7 +901,7 @@ public void RemoveMetrics_MultipleSelectedResources() }, new ResourceMetrics { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeMetrics = { new ScopeMetrics @@ -918,40 +918,40 @@ public void RemoveMetrics_MultipleSelectedResources() }); // Act - repository.ClearMetrics(new ApplicationKey("app1", null)); + repository.ClearMetrics(new ResourceKey("resource1", null)); // Assert Assert.Equal(0, addContext.FailureCount); - var app1Key = new ApplicationKey("app1", InstanceId: null); - var app1Instruments = repository.GetInstrumentsSummaries(app1Key); - Assert.Empty(app1Instruments); + var resource1Key = new ResourceKey("resource1", InstanceId: null); + var resource1Instruments = repository.GetInstrumentsSummaries(resource1Key); + Assert.Empty(resource1Instruments); - var app1Test1Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource1Test1Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app1Key, + ResourceKey = resource1Key, InstrumentName = "test1", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.Null(app1Test1Instrument); + Assert.Null(resource1Test1Instrument); - var app1Test2Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource1Test2Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app1Key, + ResourceKey = resource1Key, InstrumentName = "test2", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.Null(app1Test2Instrument); + Assert.Null(resource1Test2Instrument); - var app2Key = new ApplicationKey("app2", InstanceId: null); - var app2Instruments = repository.GetInstrumentsSummaries(app2Key); - Assert.Collection(app2Instruments, + var resource2Key = new ResourceKey("resource2", InstanceId: null); + var resource2Instruments = repository.GetInstrumentsSummaries(resource2Key); + Assert.Collection(resource2Instruments, instrument => { Assert.Equal("test1", instrument.Name); @@ -967,35 +967,35 @@ public void RemoveMetrics_MultipleSelectedResources() Assert.Equal("test-meter", instrument.Parent.Name); }); - var app2Test1Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource2Test1Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app2Key, + ResourceKey = resource2Key, InstrumentName = "test1", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.NotNull(app2Test1Instrument); - Assert.Equal("test1", app2Test1Instrument.Summary.Name); + Assert.NotNull(resource2Test1Instrument); + Assert.Equal("test1", resource2Test1Instrument.Summary.Name); - var app2Test1Dimensions = Assert.Single(app2Test1Instrument.Dimensions); - Assert.Equal(5, ((MetricValue)app2Test1Dimensions.Values.Single()).Value); + var resource2Test1Dimensions = Assert.Single(resource2Test1Instrument.Dimensions); + Assert.Equal(5, ((MetricValue)resource2Test1Dimensions.Values.Single()).Value); - var app2Test3Instrument = repository.GetInstrument(new GetInstrumentRequest + var resource2Test3Instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = app2Key, + ResourceKey = resource2Key, InstrumentName = "test3", MeterName = "test-meter", StartTime = s_testTime, EndTime = s_testTime.AddMinutes(20) }); - Assert.NotNull(app2Test3Instrument); - Assert.Equal("test3", app2Test3Instrument.Summary.Name); + Assert.NotNull(resource2Test3Instrument); + Assert.Equal("test3", resource2Test3Instrument.Summary.Name); - var app2Test3Dimensions = Assert.Single(app2Test3Instrument.Dimensions); - Assert.Equal(6, ((MetricValue)app2Test3Dimensions.Values.Single()).Value); + var resource2Test3Dimensions = Assert.Single(resource2Test3Instrument.Dimensions); + Assert.Equal(6, ((MetricValue)resource2Test3Dimensions.Values.Single()).Value); } [Fact] @@ -1011,7 +1011,7 @@ public void AddMetrics_InvalidInstrument() { new ResourceMetrics { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeMetrics = { new ScopeMetrics @@ -1030,9 +1030,9 @@ public void AddMetrics_InvalidInstrument() // Assert Assert.Equal(1, addContext.FailureCount); - var app1Key = new ApplicationKey("app1", InstanceId: null); - var app1Instruments = repository.GetInstrumentsSummaries(app1Key); - Assert.Collection(app1Instruments, + var resource1Key = new ResourceKey("resource1", InstanceId: null); + var resource1Instruments = repository.GetInstrumentsSummaries(resource1Key); + Assert.Collection(resource1Instruments, instrument => { Assert.Equal("test1", instrument.Name); @@ -1108,11 +1108,11 @@ public void AddMetrics_InvalidHistogramDataPoints() // Assert Assert.Equal(2, addContext.FailureCount); - var applications = Assert.Single(repository.GetApplications()); + var resources = Assert.Single(repository.GetResources()); var instrument = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = applications.ApplicationKey, + ResourceKey = resources.ResourceKey, MeterName = "test-meter", InstrumentName = "test", StartTime = DateTime.MinValue, @@ -1169,7 +1169,7 @@ public void AddMetrics_OverflowDimension() var instrument1 = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = new ApplicationKey("TestService", "TestId"), + ResourceKey = new ResourceKey("TestService", "TestId"), InstrumentName = "test", MeterName = "test-meter", StartTime = DateTime.MinValue, @@ -1181,7 +1181,7 @@ public void AddMetrics_OverflowDimension() var instrument2 = repository.GetInstrument(new GetInstrumentRequest { - ApplicationKey = new ApplicationKey("TestService", "TestId"), + ResourceKey = new ResourceKey("TestService", "TestId"), InstrumentName = "test", MeterName = "test-meter2", StartTime = DateTime.MinValue, @@ -1222,15 +1222,15 @@ public void AddMetrics_NoScope() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); - var instruments = repository.GetInstrumentsSummaries(applications[0].ApplicationKey); + var instruments = repository.GetInstrumentsSummaries(resources[0].ResourceKey); Assert.Collection(instruments, instrument => { diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/OtlpSpanTests.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/OtlpSpanTests.cs index 993a7c4fc90..97df6b73a2e 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/OtlpSpanTests.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/OtlpSpanTests.cs @@ -18,7 +18,7 @@ public void AllProperties() { // Arrange var context = new OtlpContext { Logger = NullLogger.Instance, Options = new() }; - var app1 = new OtlpApplication("app1", "instance", uninstrumentedPeer: false, context); + var app1 = new OtlpResource("app1", "instance", uninstrumentedPeer: false, context); var trace = new OtlpTrace(new byte[] { 1, 2, 3 }, DateTime.MinValue); var scope = TelemetryTestHelpers.CreateOtlpScope(context); diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ApplicationKeyTests.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ResourceKeyTests.cs similarity index 89% rename from tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ApplicationKeyTests.cs rename to tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ResourceKeyTests.cs index 0fe96885b5a..0ddd5064c72 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ApplicationKeyTests.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ResourceKeyTests.cs @@ -6,7 +6,7 @@ namespace Aspire.Dashboard.Tests.TelemetryRepositoryTests; -public class ApplicationKeyTests +public class ResourceKeyTests { [Theory] [InlineData("name", "instanceid", "instanceid", null)] @@ -15,7 +15,7 @@ public class ApplicationKeyTests public void Create_Success(string name, string instanceId, string expectedName, string? expectedInstanceId) { // Arrange & Act - var key = ApplicationKey.Create(name, instanceId); + var key = ResourceKey.Create(name, instanceId); // Assert Assert.Equal(expectedName, key.Name); @@ -29,7 +29,7 @@ public void Create_Success(string name, string instanceId, string expectedName, public void EqualsCompositeName_Success(string name, string instanceId, string compositeName) { // Arrange - var key = new ApplicationKey(name, instanceId); + var key = new ResourceKey(name, instanceId); // Act var result = key.EqualsCompositeName(compositeName); @@ -48,7 +48,7 @@ public void EqualsCompositeName_Success(string name, string instanceId, string c public void EqualsCompositeName_Failure(string name, string instanceId, string? compositeName) { // Arrange - var key = new ApplicationKey(name, instanceId); + var key = new ResourceKey(name, instanceId); // Act var result = key.EqualsCompositeName(compositeName!); diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ApplicationTests.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ResourceTests.cs similarity index 63% rename from tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ApplicationTests.cs rename to tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ResourceTests.cs index a61f14b26a6..ec80ac7b521 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ApplicationTests.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/ResourceTests.cs @@ -10,10 +10,10 @@ namespace Aspire.Dashboard.Tests.TelemetryRepositoryTests; -public class ApplicationTests +public class ResourceTests { [Fact] - public void GetApplicationByCompositeName() + public void GetResourceByCompositeName() { // Arrange var repository = CreateRepository(); @@ -22,40 +22,40 @@ public void GetApplicationByCompositeName() AddResource(repository, "app1"); // Act 1 - var applications = repository.GetApplications(); + var resources = repository.GetResources(); // Assert 1 - Assert.Collection(applications, + Assert.Collection(resources, app => { - Assert.Equal("app1", app.ApplicationName); + Assert.Equal("app1", app.ResourceName); Assert.Equal("TestId", app.InstanceId); }, app => { - Assert.Equal("app2", app.ApplicationName); + Assert.Equal("app2", app.ResourceName); Assert.Equal("TestId", app.InstanceId); }); // Act 2 - var app1 = repository.GetApplicationByCompositeName("app1-TestId"); - var app2 = repository.GetApplicationByCompositeName("APP2-TESTID"); - var notFound = repository.GetApplicationByCompositeName("APP2_TESTID"); + var app1 = repository.GetResourceByCompositeName("app1-TestId"); + var app2 = repository.GetResourceByCompositeName("APP2-TESTID"); + var notFound = repository.GetResourceByCompositeName("APP2_TESTID"); // Assert 2 Assert.NotNull(app1); - Assert.Equal("app1", app1.ApplicationName); - Assert.Equal(applications[0], app1); + Assert.Equal("app1", app1.ResourceName); + Assert.Equal(resources[0], app1); Assert.NotNull(app2); - Assert.Equal("app2", app2.ApplicationName); - Assert.Equal(applications[1], app2); + Assert.Equal("app2", app2.ResourceName); + Assert.Equal(resources[1], app2); Assert.Null(notFound); } [Fact] - public void GetApplications_WithNameAndNoKey() + public void GetResources_WithNameAndNoKey() { // Arrange var repository = CreateRepository(); @@ -65,35 +65,35 @@ public void GetApplications_WithNameAndNoKey() AddResource(repository, "app1", instanceId: "456"); // Act 1 - var applications1 = repository.GetApplications(new ApplicationKey("app1", InstanceId: null)); + var resources1 = repository.GetResources(new ResourceKey("app1", InstanceId: null)); // Assert 1 - Assert.Collection(applications1, + Assert.Collection(resources1, app => { - Assert.Equal("app1", app.ApplicationName); + Assert.Equal("app1", app.ResourceName); Assert.Equal("123", app.InstanceId); }, app => { - Assert.Equal("app1", app.ApplicationName); + Assert.Equal("app1", app.ResourceName); Assert.Equal("456", app.InstanceId); }); // Act 2 - var applications2 = repository.GetApplications(new ApplicationKey("app2", InstanceId: null)); + var resources2 = repository.GetResources(new ResourceKey("app2", InstanceId: null)); // Assert 2 - Assert.Collection(applications2, + Assert.Collection(resources2, app => { - Assert.Equal("app2", app.ApplicationName); + Assert.Equal("app2", app.ResourceName); Assert.Equal("TestId", app.InstanceId); }); } [Fact] - public void GetApplications_Order() + public void GetResources_Order() { // Arrange var repository = CreateRepository(); @@ -103,23 +103,23 @@ public void GetApplications_Order() AddResource(repository, "app1", instanceId: "abc"); // Act - var applications = repository.GetApplications(); + var resources = repository.GetResources(); // Assert - Assert.Collection(applications, + Assert.Collection(resources, app => { - Assert.Equal("app1", app.ApplicationName); + Assert.Equal("app1", app.ResourceName); Assert.Equal("abc", app.InstanceId); }, app => { - Assert.Equal("app1", app.ApplicationName); + Assert.Equal("app1", app.ResourceName); Assert.Equal("def", app.InstanceId); }, app => { - Assert.Equal("app2", app.ApplicationName); + Assert.Equal("app2", app.ResourceName); Assert.Equal("TestId", app.InstanceId); }); } @@ -136,10 +136,10 @@ public void GetResourceName_GuidInstanceId_Shorten() AddResource(repository, "app1", guid2); // Act - var applications = repository.GetApplications(); + var resources = repository.GetResources(); - var instance1Name = OtlpApplication.GetResourceName(applications[0], applications); - var instance2Name = OtlpApplication.GetResourceName(applications[1], applications); + var instance1Name = OtlpResource.GetResourceName(resources[0], resources); + var instance2Name = OtlpResource.GetResourceName(resources[1], resources); // Assert Assert.Equal("app1-19572b19", instance1Name); diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TelemetryRepositoryTests.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TelemetryRepositoryTests.cs index f4438bc7817..08b3fda0fa7 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TelemetryRepositoryTests.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TelemetryRepositoryTests.cs @@ -22,7 +22,7 @@ public void AddData_WhilePaused_IsDiscarded() // Arrange var pauseManager = new PauseManager(); var repository = CreateRepository(pauseManager: pauseManager); - using var subscription = repository.OnNewLogs(applicationKey: null, SubscriptionType.Other, () => Task.CompletedTask); + using var subscription = repository.OnNewLogs(resourceKey: null, SubscriptionType.Other, () => Task.CompletedTask); // Act and assert pauseManager.SetStructuredLogsPaused(true); @@ -32,10 +32,10 @@ public void AddData_WhilePaused_IsDiscarded() AddMetric(); AddTrace(); - var applicationKey = new ApplicationKey("resource", "resource"); - Assert.Empty(repository.GetLogs(new GetLogsContext { ApplicationKey = applicationKey, Count = 100, Filters = [], StartIndex = 0 }).Items); - Assert.Null(repository.GetApplication(applicationKey)); - Assert.Empty(repository.GetTraces(new GetTracesRequest { ApplicationKey = applicationKey, Count = 100, Filters = [], StartIndex = 0, FilterText = string.Empty }).PagedResult.Items); + var resourceKey = new ResourceKey("resource", "resource"); + Assert.Empty(repository.GetLogs(new GetLogsContext { ResourceKey = resourceKey, Count = 100, Filters = [], StartIndex = 0 }).Items); + Assert.Null(repository.GetResource(resourceKey)); + Assert.Empty(repository.GetTraces(new GetTracesRequest { ResourceKey = resourceKey, Count = 100, Filters = [], StartIndex = 0, FilterText = string.Empty }).PagedResult.Items); pauseManager.SetStructuredLogsPaused(false); pauseManager.SetMetricsPaused(false); @@ -44,11 +44,11 @@ public void AddData_WhilePaused_IsDiscarded() AddLog(); AddMetric(); AddTrace(); - Assert.Single(repository.GetLogs(new GetLogsContext { ApplicationKey = applicationKey, Count = 100, Filters = [], StartIndex = 0 }).Items); - var application = repository.GetApplication(applicationKey); - Assert.NotNull(application); - Assert.NotEmpty(application.GetInstrumentsSummary()); - Assert.Single(repository.GetTraces(new GetTracesRequest { ApplicationKey = applicationKey, Count = 100, Filters = [], StartIndex = 0, FilterText = string.Empty }).PagedResult.Items); + Assert.Single(repository.GetLogs(new GetLogsContext { ResourceKey = resourceKey, Count = 100, Filters = [], StartIndex = 0 }).Items); + var resource = repository.GetResource(resourceKey); + Assert.NotNull(resource); + Assert.NotEmpty(resource.GetInstrumentsSummary()); + Assert.Single(repository.GetTraces(new GetTracesRequest { ResourceKey = resourceKey, Count = 100, Filters = [], StartIndex = 0, FilterText = string.Empty }).PagedResult.Items); void AddLog() { diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TestOutgoingPeerResolver.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TestOutgoingPeerResolver.cs index 7bbed5bc79f..d70d1e01d85 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TestOutgoingPeerResolver.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TestOutgoingPeerResolver.cs @@ -44,7 +44,7 @@ public bool TryResolvePeer(KeyValuePair[] attributes, out string } name = "TestPeer"; - matchedResourced = ModelTestHelpers.CreateResource(appName: "TestPeer"); + matchedResourced = ModelTestHelpers.CreateResource(resourceName: "TestPeer"); return true; } } diff --git a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TraceTests.cs b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TraceTests.cs index 78bb69c8111..9389042e53b 100644 --- a/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TraceTests.cs +++ b/tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TraceTests.cs @@ -67,18 +67,18 @@ public void AddTraces() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); - Assert.False(app.UninstrumentedPeer); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); + Assert.False(resource.UninstrumentedPeer); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -127,17 +127,17 @@ public void AddTraces_SelfParent_Reject() // Assert Assert.Equal(1, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -182,17 +182,17 @@ public void AddTraces_MultipleSpansLoop_Reject() // Assert Assert.Equal(1, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -237,17 +237,17 @@ public void AddTraces_DuplicateTraceIds_Reject() // Assert Assert.Equal(1, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -308,17 +308,17 @@ public void AddTraces_Scope_Multiple() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -385,17 +385,17 @@ public void AddTraces_Traces_MultipleOutOrOrder() }); Assert.Equal(0, addContext2.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var traces1 = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -437,7 +437,7 @@ public void AddTraces_Traces_MultipleOutOrOrder() var traces2 = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -492,7 +492,7 @@ public void AddTraces_Spans_MultipleOutOrOrder() var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -561,7 +561,7 @@ public void AddTraces_SpanEvents_ReturnData() var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -638,7 +638,7 @@ public void AddTraces_SpanLinks_ReturnData() var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -728,7 +728,7 @@ public void GetTraces_ReturnCopies() var traces1 = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -744,7 +744,7 @@ public void GetTraces_ReturnCopies() var traces2 = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -802,17 +802,17 @@ public void AddTraces_AttributeAndEventLimits_LimitsApplied() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -864,7 +864,7 @@ public void AddTraces_Links_BacklinksPopulated() AddTrace(repository, "1", s_testTime); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -926,17 +926,17 @@ public void AddTraces_ExceedLimit_FirstInFirstOut() } // Assert - var applications = repository.GetApplications(); - Assert.Collection(applications, - app => + var resources = repository.GetResources(); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1043,7 +1043,7 @@ public void AddTraces_MultipleRootSpans_RootSpanIsEarliestWithoutParent() var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1071,7 +1071,7 @@ public void GetTraces_MultipleInstances() { new ResourceSpans { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeSpans = { new ScopeSpans @@ -1083,7 +1083,7 @@ public void GetTraces_MultipleInstances() }, new ResourceSpans { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeSpans = { new ScopeSpans @@ -1095,7 +1095,7 @@ public void GetTraces_MultipleInstances() }, new ResourceSpans { - Resource = CreateResource(name: "app2"), + Resource = CreateResource(name: "resource2"), ScopeSpans = { new ScopeSpans @@ -1110,10 +1110,10 @@ public void GetTraces_MultipleInstances() // Assert Assert.Equal(0, addContext.FailureCount); - var appKey = new ApplicationKey("app1", InstanceId: null); + var resourceKey = new ResourceKey("resource1", InstanceId: null); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = appKey, + ResourceKey = resourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1129,7 +1129,7 @@ public void GetTraces_MultipleInstances() AssertId("2", trace.TraceId); }); - var propertyKeys = repository.GetTracePropertyKeys(appKey)!; + var propertyKeys = repository.GetTracePropertyKeys(resourceKey)!; Assert.Collection(propertyKeys, s => Assert.Equal("key-1", s), s => Assert.Equal("key-2", s)); @@ -1146,7 +1146,7 @@ public void GetTraces_AttributeFilters() { new ResourceSpans { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeSpans = { new ScopeSpans @@ -1158,7 +1158,7 @@ public void GetTraces_AttributeFilters() }, new ResourceSpans { - Resource = CreateResource(name: "app1", instanceId: "456"), + Resource = CreateResource(name: "resource1", instanceId: "456"), ScopeSpans = { new ScopeSpans @@ -1172,12 +1172,12 @@ public void GetTraces_AttributeFilters() Assert.Equal(0, addContext.FailureCount); - var appKey = new ApplicationKey("app1", InstanceId: null); + var resourceKey = new ResourceKey("resource1", InstanceId: null); // Act 1 var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = appKey, + ResourceKey = resourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1196,7 +1196,7 @@ public void GetTraces_AttributeFilters() // Act 2 traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = appKey, + ResourceKey = resourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1215,7 +1215,7 @@ public void GetTraces_AttributeFilters() // Act 3 traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = appKey, + ResourceKey = resourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1234,7 +1234,7 @@ public void GetTraces_AttributeFilters() [InlineData(KnownTraceFields.SpanIdField, "312d31")] [InlineData(KnownTraceFields.StatusField, "Unset")] [InlineData(KnownTraceFields.KindField, "Client")] - [InlineData(KnownResourceFields.ServiceNameField, "app1")] + [InlineData(KnownResourceFields.ServiceNameField, "resource1")] [InlineData(KnownResourceFields.ServiceNameField, "TestPeer")] [InlineData(KnownSourceFields.NameField, "TestScope")] public void GetTraces_KnownFilters(string name, string value) @@ -1248,7 +1248,7 @@ public void GetTraces_KnownFilters(string name, string value) { new ResourceSpans { - Resource = CreateResource(name: "app1", instanceId: "123"), + Resource = CreateResource(name: "resource1", instanceId: "123"), ScopeSpans = { new ScopeSpans @@ -1262,12 +1262,12 @@ public void GetTraces_KnownFilters(string name, string value) Assert.Equal(0, addContext.FailureCount); - var appKey = new ApplicationKey("app1", InstanceId: null); + var resourceKey = new ResourceKey("resource1", InstanceId: null); // Act 1 var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = appKey, + ResourceKey = resourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1283,7 +1283,7 @@ public void GetTraces_KnownFilters(string name, string value) // Act 2 traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = appKey, + ResourceKey = resourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1308,7 +1308,7 @@ public void AddTraces_OutOfOrder_FullName() var repository = CreateRepository(); var request = new GetTracesRequest { - ApplicationKey = new ApplicationKey("TestService", "TestId"), + ResourceKey = new ResourceKey("TestService", "TestId"), FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1477,13 +1477,13 @@ public void AddTraces_SameResourceDifferentProperties_MultipleResourceViews() // Assert Assert.Equal(0, addContext.FailureCount); - // Spans belong to the same application - var application = Assert.Single(repository.GetApplications()); - Assert.Equal("TestService", application.ApplicationName); - Assert.Equal("TestId", application.InstanceId); + // Spans belong to the same resource + var resource = Assert.Single(repository.GetResources()); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); // Spans have different views - var views = application.GetViews().OrderBy(v => v.Properties.Length).ToList(); + var views = resource.GetViews().OrderBy(v => v.Properties.Length).ToList(); Assert.Collection(views, v => { @@ -1511,7 +1511,7 @@ public void AddTraces_SameResourceDifferentProperties_MultipleResourceViews() var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = application.ApplicationKey, + ResourceKey = resource.ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1573,7 +1573,7 @@ public void RemoveTraces_All() { new ResourceSpans { - Resource = CreateResource("app1", "123"), + Resource = CreateResource("resource1", "123"), ScopeSpans = { new ScopeSpans @@ -1589,7 +1589,7 @@ public void RemoveTraces_All() }, new ResourceSpans { - Resource = CreateResource("app1", "456"), + Resource = CreateResource("resource1", "456"), ScopeSpans = { new ScopeSpans @@ -1605,7 +1605,7 @@ public void RemoveTraces_All() }, new ResourceSpans { - Resource = CreateResource("app2", "789"), + Resource = CreateResource("resource2", "789"), ScopeSpans = { new ScopeSpans @@ -1629,7 +1629,7 @@ public void RemoveTraces_All() var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1652,7 +1652,7 @@ public void RemoveTraces_SelectedResource() { new ResourceSpans { - Resource = CreateResource("app1", "123"), + Resource = CreateResource("resource1", "123"), ScopeSpans = { new ScopeSpans @@ -1668,7 +1668,7 @@ public void RemoveTraces_SelectedResource() }, new ResourceSpans { - Resource = CreateResource("app1", "456"), + Resource = CreateResource("resource1", "456"), ScopeSpans = { new ScopeSpans @@ -1684,7 +1684,7 @@ public void RemoveTraces_SelectedResource() }, new ResourceSpans { - Resource = CreateResource("app2", "789"), + Resource = CreateResource("resource2", "789"), ScopeSpans = { new ScopeSpans @@ -1701,14 +1701,14 @@ public void RemoveTraces_SelectedResource() }); // Act - repository.ClearTraces(new ApplicationKey("app1", "123")); + repository.ClearTraces(new ResourceKey("resource1", "123")); // Assert Assert.Equal(0, addContext.FailureCount); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1758,7 +1758,7 @@ public void RemoveTraces_MultipleSelectedResources() { new ResourceSpans { - Resource = CreateResource("app1", "123"), + Resource = CreateResource("resource1", "123"), ScopeSpans = { new ScopeSpans @@ -1774,7 +1774,7 @@ public void RemoveTraces_MultipleSelectedResources() }, new ResourceSpans { - Resource = CreateResource("app1", "456"), + Resource = CreateResource("resource1", "456"), ScopeSpans = { new ScopeSpans @@ -1790,7 +1790,7 @@ public void RemoveTraces_MultipleSelectedResources() }, new ResourceSpans { - Resource = CreateResource("app2", "789"), + Resource = CreateResource("resource2", "789"), ScopeSpans = { new ScopeSpans @@ -1807,14 +1807,14 @@ public void RemoveTraces_MultipleSelectedResources() }); // Act - repository.ClearTraces(new ApplicationKey("app1", null)); + repository.ClearTraces(new ResourceKey("resource1", null)); // Assert Assert.Equal(0, addContext.FailureCount); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1847,7 +1847,7 @@ public void RemoveTraces_SelectedResource_SpansFromDifferentTrace() { new ResourceSpans { - Resource = CreateResource("app1", "123"), + Resource = CreateResource("resource1", "123"), ScopeSpans = { new ScopeSpans @@ -1863,7 +1863,7 @@ public void RemoveTraces_SelectedResource_SpansFromDifferentTrace() }, new ResourceSpans { - Resource = CreateResource("app1", "456"), + Resource = CreateResource("resource1", "456"), ScopeSpans = { new ScopeSpans @@ -1878,7 +1878,7 @@ public void RemoveTraces_SelectedResource_SpansFromDifferentTrace() }, new ResourceSpans { - Resource = CreateResource("app2", "789"), + Resource = CreateResource("resource2", "789"), ScopeSpans = { new ScopeSpans @@ -1899,14 +1899,14 @@ public void RemoveTraces_SelectedResource_SpansFromDifferentTrace() }); // Act - repository.ClearTraces(new ApplicationKey("app1", null)); + repository.ClearTraces(new ResourceKey("resource1", null)); // Assert Assert.Equal(0, addContext.FailureCount); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = null, + ResourceKey = null, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1960,26 +1960,26 @@ public void AddTraces_HaveUninstrumentedPeers() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(includeUninstrumentedPeers: true); - Assert.Collection(applications, - app => + var resources = repository.GetResources(includeUninstrumentedPeers: true); + Assert.Collection(resources, + resource => { - Assert.Equal("TestPeer", app.ApplicationName); - Assert.Null(app.InstanceId); - Assert.True(app.UninstrumentedPeer); + Assert.Equal("TestPeer", resource.ResourceName); + Assert.Null(resource.InstanceId); + Assert.True(resource.UninstrumentedPeer); }, - app => + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); - Assert.False(app.UninstrumentedPeer); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); + Assert.False(resource.UninstrumentedPeer); }); - var uninstrumentedPeerApp = applications.Single(a => a.UninstrumentedPeer); + var uninstrumentedPeerApp = resources.Single(a => a.UninstrumentedPeer); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = uninstrumentedPeerApp.ApplicationKey, + ResourceKey = uninstrumentedPeerApp.ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -1997,7 +1997,7 @@ public void AddTraces_HaveUninstrumentedPeers() { AssertId("1-2", s.SpanId); Assert.NotNull(s.UninstrumentedPeer); - Assert.Equal("TestPeer", s.UninstrumentedPeer.ApplicationName); + Assert.Equal("TestPeer", s.UninstrumentedPeer.ResourceName); }); } @@ -2011,7 +2011,7 @@ public async Task AddTraces_OnPeerUpdated_HaveUninstrumentedPeers() if (matchPeer) { var name = "TestPeer"; - var matchedResourced = ModelTestHelpers.CreateResource(appName: "TestPeer"); + var matchedResourced = ModelTestHelpers.CreateResource(resourceName: "TestPeer"); return (name, matchedResourced); } @@ -2047,18 +2047,18 @@ public async Task AddTraces_OnPeerUpdated_HaveUninstrumentedPeers() // Assert Assert.Equal(0, addContext.FailureCount); - var applications = repository.GetApplications(includeUninstrumentedPeers: true); - Assert.Collection(applications, - app => + var resources = repository.GetResources(includeUninstrumentedPeers: true); + Assert.Collection(resources, + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); - Assert.False(app.UninstrumentedPeer); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); + Assert.False(resource.UninstrumentedPeer); }); var traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = applications[0].ApplicationKey, + ResourceKey = resources[0].ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -2081,26 +2081,26 @@ public async Task AddTraces_OnPeerUpdated_HaveUninstrumentedPeers() matchPeer = true; await outgoingPeerResolver.InvokePeerChanges(); - applications = repository.GetApplications(includeUninstrumentedPeers: true); - Assert.Collection(applications, - app => + resources = repository.GetResources(includeUninstrumentedPeers: true); + Assert.Collection(resources, + resource => { - Assert.Equal("TestPeer", app.ApplicationName); - Assert.Null(app.InstanceId); - Assert.True(app.UninstrumentedPeer); + Assert.Equal("TestPeer", resource.ResourceName); + Assert.Null(resource.InstanceId); + Assert.True(resource.UninstrumentedPeer); }, - app => + resource => { - Assert.Equal("TestService", app.ApplicationName); - Assert.Equal("TestId", app.InstanceId); - Assert.False(app.UninstrumentedPeer); + Assert.Equal("TestService", resource.ResourceName); + Assert.Equal("TestId", resource.InstanceId); + Assert.False(resource.UninstrumentedPeer); }); - var uninstrumentedPeerApp = applications.Single(a => a.UninstrumentedPeer); + var uninstrumentedPeerApp = resources.Single(a => a.UninstrumentedPeer); traces = repository.GetTraces(new GetTracesRequest { - ApplicationKey = uninstrumentedPeerApp.ApplicationKey, + ResourceKey = uninstrumentedPeerApp.ResourceKey, FilterText = string.Empty, StartIndex = 0, Count = 10, @@ -2118,7 +2118,7 @@ public async Task AddTraces_OnPeerUpdated_HaveUninstrumentedPeers() { AssertId("1-2", s.SpanId); Assert.NotNull(s.UninstrumentedPeer); - Assert.Equal("TestPeer", s.UninstrumentedPeer.ApplicationName); + Assert.Equal("TestPeer", s.UninstrumentedPeer.ResourceName); }); } @@ -2126,7 +2126,7 @@ public async Task AddTraces_OnPeerUpdated_HaveUninstrumentedPeers() public void AddTraces_UninstrumentedPeer_InstanceIdDashes_AppKeyResolvedCorrectly() { // Arrange - var resource = ModelTestHelpers.CreateResource(appName: "test-abc-def", displayName: "test"); + var resource = ModelTestHelpers.CreateResource(resourceName: "test-abc-def", displayName: "test"); var outgoingPeerResolver = new TestOutgoingPeerResolver(onResolve: attributes => (resource.Name, resource)); var repository = CreateRepository(outgoingPeerResolvers: [outgoingPeerResolver]); var addContext = new AddContext(); @@ -2150,19 +2150,19 @@ public void AddTraces_UninstrumentedPeer_InstanceIdDashes_AppKeyResolvedCorrectl } }); - var applications = repository.GetApplications(includeUninstrumentedPeers: true); - Assert.Collection(applications, - app => + var resources = repository.GetResources(includeUninstrumentedPeers: true); + Assert.Collection(resources, + resource => { - Assert.Equal("source", app.ApplicationName); - Assert.Equal("abc", app.InstanceId); - Assert.False(app.UninstrumentedPeer); + Assert.Equal("source", resource.ResourceName); + Assert.Equal("abc", resource.InstanceId); + Assert.False(resource.UninstrumentedPeer); }, - app => + resource => { - Assert.Equal("test", app.ApplicationName); - Assert.Equal("abc-def", app.InstanceId); - Assert.True(app.UninstrumentedPeer); + Assert.Equal("test", resource.ResourceName); + Assert.Equal("abc-def", resource.InstanceId); + Assert.True(resource.UninstrumentedPeer); }); } } diff --git a/tests/Shared/DashboardModel/ModelTestHelpers.cs b/tests/Shared/DashboardModel/ModelTestHelpers.cs index 8778989ee3e..982e6a1ea77 100644 --- a/tests/Shared/DashboardModel/ModelTestHelpers.cs +++ b/tests/Shared/DashboardModel/ModelTestHelpers.cs @@ -11,7 +11,7 @@ namespace Aspire.Tests.Shared.DashboardModel; public static class ModelTestHelpers { public static ResourceViewModel CreateResource( - string? appName = null, + string? resourceName = null, KnownResourceState? state = null, string? displayName = null, ImmutableArray? urls = null, @@ -29,9 +29,9 @@ public static ResourceViewModel CreateResource( { return new ResourceViewModel { - Name = appName ?? "Name!", + Name = resourceName ?? "Name!", ResourceType = resourceType ?? KnownResourceTypes.Container, - DisplayName = displayName ?? appName ?? "Display name!", + DisplayName = displayName ?? resourceName ?? "Display name!", Uid = Guid.NewGuid().ToString(), CreationTimeStamp = DateTime.UtcNow, StartTimeStamp = DateTime.UtcNow, diff --git a/tests/Shared/Telemetry/TelemetryTestHelpers.cs b/tests/Shared/Telemetry/TelemetryTestHelpers.cs index fe85b03c702..4ef74363049 100644 --- a/tests/Shared/Telemetry/TelemetryTestHelpers.cs +++ b/tests/Shared/Telemetry/TelemetryTestHelpers.cs @@ -302,11 +302,11 @@ public static OtlpContext CreateContext(TelemetryLimitOptions? options = null, I }; } - public static OtlpSpan CreateOtlpSpan(OtlpApplication app, OtlpTrace trace, OtlpScope scope, string spanId, string? parentSpanId, DateTime startDate, + public static OtlpSpan CreateOtlpSpan(OtlpResource resource, OtlpTrace trace, OtlpScope scope, string spanId, string? parentSpanId, DateTime startDate, KeyValuePair[]? attributes = null, OtlpSpanStatusCode? statusCode = null, string? statusMessage = null, OtlpSpanKind kind = OtlpSpanKind.Unspecified, - OtlpApplication? uninstrumentedPeer = null, DateTime? endDate = null) + OtlpResource? uninstrumentedPeer = null, DateTime? endDate = null) { - return new OtlpSpan(app.GetView([]), trace, scope) + return new OtlpSpan(resource.GetView([]), trace, scope) { Attributes = attributes ?? [], BackLinks = [],