Skip to content

Commit 3c3f8c2

Browse files
[release/9.4] Add dashboard telemetry to interaction service (#10315)
1 parent eff4ba7 commit 3c3f8c2

File tree

15 files changed

+84
-16
lines changed

15 files changed

+84
-16
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ public Task OnViewRelationshipAsync(ResourceDetailRelationshipViewModel relation
279279
}
280280

281281
// IComponentWithTelemetry impl
282-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Control, nameof(ResourceDetails));
282+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Control, TelemetryComponentIds.ResourceDetails);
283283

284284
public void UpdateTelemetryProperties()
285285
{

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Aspire.Dashboard.Model.Otlp;
77
using Aspire.Dashboard.Otlp.Model;
88
using Aspire.Dashboard.Otlp.Storage;
9+
using Aspire.Dashboard.Telemetry;
910
using Aspire.Dashboard.Utils;
1011
using Microsoft.AspNetCore.Components;
1112
using Microsoft.FluentUI.AspNetCore.Components;
@@ -145,7 +146,7 @@ public async Task OnViewDetailsAsync(SpanLinkViewModel linkVM)
145146
}
146147

147148
// IComponentWithTelemetry impl
148-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Control, nameof(SpanDetails));
149+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Control, TelemetryComponentIds.SpanDetails);
149150

150151
public void Dispose()
151152
{

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Aspire.Dashboard.Components.Pages;
55
using Aspire.Dashboard.Model;
66
using Aspire.Dashboard.Model.Otlp;
7+
using Aspire.Dashboard.Telemetry;
78
using Microsoft.AspNetCore.Components;
89
using Microsoft.JSInterop;
910

@@ -149,7 +150,7 @@ private static bool HasTelemetryBaggage(string value)
149150
}
150151

151152
// IComponentWithTelemetry impl
152-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Control, nameof(StructuredLogDetails));
153+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Control, TelemetryComponentIds.StructuredLogDetails);
153154

154155
public void Dispose()
155156
{

src/Aspire.Dashboard/Components/Interactions/InteractionsProvider.cs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
using System.Diagnostics;
66
using System.Net;
77
using Aspire.Dashboard.Components.Dialogs;
8+
using Aspire.Dashboard.Components.Pages;
89
using Aspire.Dashboard.Model;
10+
using Aspire.Dashboard.Telemetry;
911
using Aspire.Dashboard.Utils;
1012
using Aspire.DashboardService.Proto.V1;
1113
using Markdig;
@@ -22,8 +24,20 @@ public class InteractionsProvider : ComponentBase, IAsyncDisposable
2224
{
2325
private static readonly MarkdownPipeline s_markdownPipeline = MarkdownHelpers.CreateMarkdownPipelineBuilder().Build();
2426

25-
internal record InteractionMessageBarReference(int InteractionId, Message Message);
26-
internal record InteractionDialogReference(int InteractionId, IDialogReference Dialog);
27+
internal record InteractionMessageBarReference(int InteractionId, Message Message, ComponentTelemetryContext TelemetryContext) : IDisposable
28+
{
29+
public void Dispose()
30+
{
31+
TelemetryContext?.Dispose();
32+
}
33+
}
34+
internal record InteractionDialogReference(int InteractionId, IDialogReference Dialog, ComponentTelemetryContext TelemetryContext) : IDisposable
35+
{
36+
public void Dispose()
37+
{
38+
TelemetryContext?.Dispose();
39+
}
40+
}
2741

2842
private readonly CancellationTokenSource _cts = new();
2943
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
@@ -53,6 +67,9 @@ internal record InteractionDialogReference(int InteractionId, IDialogReference D
5367
[Inject]
5468
public required ILogger<InteractionsProvider> Logger { get; init; }
5569

70+
[Inject]
71+
public required ComponentTelemetryContextProvider TelemetryContextProvider { get; init; }
72+
5673
protected override void OnInitialized()
5774
{
5875
// Exit quickly if the dashboard client is not enabled. For example, the dashboard is running in the standalone container.
@@ -119,6 +136,7 @@ private async Task InteractionsDisplayAsync()
119136
_pendingInteractions.RemoveAt(0);
120137

121138
Func<IDialogService, Task<IDialogReference>> openDialog;
139+
string dialogComponentId;
122140

123141
if (item.MessageBox is { } messageBox)
124142
{
@@ -184,6 +202,7 @@ private async Task InteractionsDisplayAsync()
184202
break;
185203
}
186204

205+
dialogComponentId = TelemetryComponentIds.InteractionMessageBox;
187206
openDialog = dialogService => ShowMessageBoxAsync(dialogService, content, dialogParameters);
188207
}
189208
else if (item.InputsDialog is { } inputs)
@@ -222,6 +241,7 @@ private async Task InteractionsDisplayAsync()
222241
}
223242
});
224243

244+
dialogComponentId = TelemetryComponentIds.InteractionInputsDialog;
225245
openDialog = dialogService => dialogService.ShowDialogAsync<InteractionsInputDialog>(vm, dialogParameters);
226246
}
227247
else
@@ -236,7 +256,7 @@ await InvokeAsync(async () =>
236256
});
237257

238258
Debug.Assert(currentDialogReference != null, "Dialog should have been created in UI thread.");
239-
_interactionDialogReference = new InteractionDialogReference(item.InteractionId, currentDialogReference);
259+
_interactionDialogReference = new InteractionDialogReference(item.InteractionId, currentDialogReference, CreateTelemetryContext(dialogComponentId));
240260
}
241261
finally
242262
{
@@ -254,6 +274,7 @@ await InvokeAsync(async () =>
254274
{
255275
if (_interactionDialogReference?.Dialog == currentDialogReference)
256276
{
277+
_interactionDialogReference.Dispose();
257278
_interactionDialogReference = null;
258279
}
259280
}
@@ -270,6 +291,13 @@ await InvokeAsync(async () =>
270291
}
271292
}
272293

294+
private ComponentTelemetryContext CreateTelemetryContext(string componentId)
295+
{
296+
var telemetryContext = new ComponentTelemetryContext(ComponentType.Control, componentId);
297+
TelemetryContextProvider.Initialize(telemetryContext);
298+
return telemetryContext;
299+
}
300+
273301
private static string GetMessageHtml(WatchInteractionsResponseUpdate item)
274302
{
275303
if (!item.EnableMessageMarkdown)
@@ -401,6 +429,7 @@ await InvokeAsync(async () =>
401429
}
402430

403431
_openMessageBars.Remove(item.InteractionId);
432+
openMessageBar.Dispose();
404433

405434
await DashboardClient.SendInteractionRequestAsync(request, _cts.Token).ConfigureAwait(false);
406435
}
@@ -409,7 +438,7 @@ await InvokeAsync(async () =>
409438
});
410439

411440
Debug.Assert(message != null, "Message should have been created in UI thread.");
412-
_openMessageBars.Add(new InteractionMessageBarReference(item.InteractionId, message));
441+
_openMessageBars.Add(new InteractionMessageBarReference(item.InteractionId, message, CreateTelemetryContext(TelemetryComponentIds.InteractionMessageBar)));
413442
break;
414443
case WatchInteractionsResponseUpdate.KindOneofCase.Complete:
415444
// Complete interaction.
@@ -428,6 +457,7 @@ await InvokeAsync(async () =>
428457
}
429458
finally
430459
{
460+
_interactionDialogReference.Dispose();
431461
_interactionDialogReference = null;
432462
}
433463
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ public ConsoleLogsPageState ConvertViewModelToSerializable()
815815
}
816816

817817
// IComponentWithTelemetry impl
818-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, nameof(ConsoleLogs));
818+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, TelemetryComponentIds.ConsoleLogs);
819819

820820
public void UpdateTelemetryProperties()
821821
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ protected override void OnInitialized()
2828
public required ComponentTelemetryContextProvider TelemetryContextProvider { get; init; }
2929

3030
// IComponentWithTelemetry impl
31-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, nameof(Error));
31+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, TelemetryComponentIds.Error);
3232

3333
protected override void OnParametersSet()
3434
{

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using Aspire.Dashboard.Model;
5+
using Aspire.Dashboard.Telemetry;
56
using Aspire.Dashboard.Utils;
67
using Microsoft.AspNetCore.Components;
78
using Microsoft.AspNetCore.Components.Authorization;
@@ -117,5 +118,5 @@ public async ValueTask DisposeAsync()
117118
}
118119

119120
// IComponentWithTelemetry impl
120-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, nameof(Login));
121+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, TelemetryComponentIds.Login);
121122
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ public void Dispose()
340340
}
341341

342342
// IComponentWithTelemetry impl
343-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, nameof(Metrics));
343+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, TelemetryComponentIds.Metrics);
344344

345345
public void UpdateTelemetryProperties()
346346
{

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

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

4+
using Aspire.Dashboard.Telemetry;
45
using Microsoft.AspNetCore.Components;
56

67
namespace Aspire.Dashboard.Components.Pages;
@@ -11,7 +12,7 @@ public partial class NotFound : IComponentWithTelemetry, IDisposable
1112
public required ComponentTelemetryContextProvider TelemetryContextProvider { get; init; }
1213

1314
// IComponentWithTelemetry impl
14-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, nameof(NotFound));
15+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, TelemetryComponentIds.NotFound);
1516

1617
protected override void OnInitialized()
1718
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,7 @@ private async Task ContextMenuClosed(Microsoft.AspNetCore.Components.Web.MouseEv
888888
}
889889

890890
// IComponentWithTelemetry impl
891-
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, nameof(Resources));
891+
public ComponentTelemetryContext TelemetryContext { get; } = new(ComponentType.Page, TelemetryComponentIds.Resources);
892892

893893
public void UpdateTelemetryProperties()
894894
{

0 commit comments

Comments
 (0)