diff --git a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs index 195ff568cf9..5767e289e53 100644 --- a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs @@ -42,6 +42,9 @@ public partial class TraceDetail : ComponentBase, IDisposable [SupplyParameterFromQuery] public string? SpanId { get; set; } + [Inject] + public required ILogger Logger { get; init; } + [Inject] public required TelemetryRepository TelemetryRepository { get; init; } @@ -167,15 +170,18 @@ private void UpdateDetailViewData() { _applications = TelemetryRepository.GetApplications(); + Logger.LogInformation("Getting trace '{TraceId}'.", TraceId); _trace = (TraceId != null) ? TelemetryRepository.GetTrace(TraceId) : null; if (_trace == null) { + Logger.LogInformation("Couldn't find trace '{TraceId}'.", TraceId); _spanWaterfallViewModels = null; _maxDepth = 0; return; } + Logger.LogInformation("Trace '{TraceId}' has {SpanCount} spans.", _trace.TraceId, _trace.Spans.Count); _spanWaterfallViewModels = SpanWaterfallViewModel.Create(_trace, new SpanWaterfallViewModel.TraceDetailState(OutgoingPeerResolvers, _collapsedSpanIds)); _maxDepth = _spanWaterfallViewModels.Max(s => s.Depth); } diff --git a/tests/Aspire.Dashboard.Components.Tests/Pages/TraceDetailsTests.cs b/tests/Aspire.Dashboard.Components.Tests/Pages/TraceDetailsTests.cs index 4904fae0400..ef64931ab88 100644 --- a/tests/Aspire.Dashboard.Components.Tests/Pages/TraceDetailsTests.cs +++ b/tests/Aspire.Dashboard.Components.Tests/Pages/TraceDetailsTests.cs @@ -11,7 +11,6 @@ using Aspire.Dashboard.Model.Otlp; using Aspire.Dashboard.Otlp.Model; using Aspire.Dashboard.Otlp.Storage; -using Aspire.TestUtilities; using Bunit; using Google.Protobuf.Collections; using Microsoft.AspNetCore.InternalTesting; @@ -31,6 +30,13 @@ public partial class TraceDetailsTests : DashboardTestContext { private static readonly DateTime s_testTime = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + private readonly ITestOutputHelper _testOutputHelper; + + public TraceDetailsTests(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + } + [Fact] public void Render_HasTrace_SubscriptionRemovedOnDispose() { @@ -83,11 +89,13 @@ public void Render_HasTrace_SubscriptionRemovedOnDispose() } [Fact] - [QuarantinedTest("https://github.com/dotnet/aspire/issues/8546")] public async Task Render_ChangeTrace_RowsRendered() { // Arrange - SetupTraceDetailsServices(); + var loggerFactory = IntegrationTestHelpers.CreateLoggerFactory(_testOutputHelper); + var logger = loggerFactory.CreateLogger(nameof(Render_ChangeTrace_RowsRendered)); + + SetupTraceDetailsServices(loggerFactory: loggerFactory); var viewport = new ViewportInformation(IsDesktop: true, IsUltraLowHeight: false, IsUltraLowWidth: false); @@ -125,10 +133,13 @@ public async Task Render_ChangeTrace_RowsRendered() }); // Assert - var grid = cut.FindComponent>(); - var rows = grid.FindAll(".fluent-data-grid-row", enableAutoRefresh: true); - - await AsyncTestHelpers.AssertIsTrueRetryAsync(() => rows.Count == 3, "Expected rows to be rendered."); + logger.LogInformation($"Assert row count for '{traceId}'"); + await AsyncTestHelpers.AssertIsTrueRetryAsync(() => + { + var grid = cut.FindComponent>(); + var rows = grid.FindAll(".fluent-data-grid-row"); + return rows.Count == 3; + }, "Expected rows to be rendered.", logger); traceId = Convert.ToHexString(Encoding.UTF8.GetBytes("2")); cut.SetParametersAndRender(builder => @@ -136,10 +147,16 @@ public async Task Render_ChangeTrace_RowsRendered() builder.Add(p => p.TraceId, traceId); }); - await AsyncTestHelpers.AssertIsTrueRetryAsync(() => rows.Count == 2, "Expected rows to be rendered."); + logger.LogInformation($"Assert row count for '{traceId}'"); + await AsyncTestHelpers.AssertIsTrueRetryAsync(() => + { + var grid = cut.FindComponent>(); + var rows = grid.FindAll(".fluent-data-grid-row"); + return rows.Count == 2; + }, "Expected rows to be rendered.", logger); } - private void SetupTraceDetailsServices() + private void SetupTraceDetailsServices(ILoggerFactory? loggerFactory = null) { var version = typeof(FluentMain).Assembly.GetName().Version!; @@ -170,6 +187,8 @@ private void SetupTraceDetailsServices() JSInterop.SetupVoid("initializeContinuousScroll"); + loggerFactory ??= NullLoggerFactory.Instance; + Services.AddLocalization(); Services.AddSingleton(); Services.AddSingleton(); @@ -177,7 +196,7 @@ private void SetupTraceDetailsServices() Services.AddSingleton(); Services.AddSingleton>(Options.Create(new DashboardOptions())); Services.AddSingleton(); - Services.AddSingleton>(NullLogger.Instance); + Services.AddSingleton(loggerFactory); Services.AddSingleton(); Services.AddSingleton(); Services.AddSingleton();