Skip to content

Commit 2291fb9

Browse files
authored
Don't throw from component telemetry context dispose if not initialized (#9306)
1 parent b6b3351 commit 2291fb9

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

src/Aspire.Dashboard/Components/Pages/ComponentTelemetryContext.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ public ComponentTelemetryContext(string componentType)
4141
// Internal for testing
4242
internal Dictionary<string, AspireTelemetryProperty> Properties { get; } = [];
4343

44-
private DashboardTelemetryService TelemetryService => _telemetryService ?? throw new ArgumentNullException(nameof(_telemetryService), "InitializeAsync has not been called");
45-
4644
public void Initialize(DashboardTelemetryService telemetryService, string? browserUserAgent)
4745
{
4846
_telemetryService = telemetryService;
@@ -92,7 +90,12 @@ public bool UpdateTelemetryProperties(ReadOnlySpan<ComponentTelemetryProperty> m
9290

9391
private void PostProperties()
9492
{
95-
TelemetryService.PostOperation(
93+
if (_telemetryService == null)
94+
{
95+
throw new InvalidOperationException("InitializeAsync has not been called.");
96+
}
97+
98+
_telemetryService.PostOperation(
9699
TelemetryEventKeys.ParametersSet,
97100
TelemetryResult.Success,
98101
properties: Properties,
@@ -103,7 +106,7 @@ public void Dispose()
103106
{
104107
if (!_disposed)
105108
{
106-
TelemetryService.PostOperation(
109+
_telemetryService?.PostOperation(
107110
TelemetryEventKeys.ComponentDispose,
108111
TelemetryResult.Success,
109112
properties: new Dictionary<string, AspireTelemetryProperty>

tests/Aspire.Dashboard.Tests/Telemetry/ComponentTelemetryContextTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ public class ComponentTelemetryContextTests
1313
[Fact]
1414
public async Task ComponentTelemetryContext_TelemetryEnabled_EndToEnd()
1515
{
16+
// Arrange
1617
var telemetryContext = new ComponentTelemetryContext(nameof(ComponentTelemetryContextTests));
1718
var telemetrySender = new TestDashboardTelemetrySender { IsTelemetryEnabled = true };
1819
var telemetryService = new DashboardTelemetryService(NullLogger<DashboardTelemetryService>.Instance, telemetrySender);
1920
var telemetryContextProvider = new ComponentTelemetryContextProvider(telemetryService);
2021
telemetryContextProvider.SetBrowserUserAgent("mozilla");
2122
await telemetryService.InitializeAsync();
2223

24+
// Act & assert initialize
2325
telemetryContextProvider.Initialize(telemetryContext);
2426
for (var i = 0; i < telemetryService.GetDefaultProperties().Count; i++)
2527
{
@@ -35,6 +37,7 @@ public async Task ComponentTelemetryContext_TelemetryEnabled_EndToEnd()
3537

3638
OperationContext? parametersUpdateOperation;
3739

40+
// Act & assert update properties
3841
telemetryContext.UpdateTelemetryProperties([new ComponentTelemetryProperty("Test", new AspireTelemetryProperty("Value"))]);
3942
Assert.Equal(3, telemetryContext.Properties.Count);
4043
Assert.True(telemetrySender.ContextChannel.Reader.TryRead(out parametersUpdateOperation));
@@ -50,6 +53,7 @@ public async Task ComponentTelemetryContext_TelemetryEnabled_EndToEnd()
5053
Assert.Equal(3, telemetryContext.Properties.Count);
5154
Assert.True(telemetrySender.ContextChannel.Reader.TryRead(out parametersUpdateOperation));
5255

56+
// Act & assert dispose
5357
telemetryContext.Dispose();
5458
Assert.True(telemetrySender.ContextChannel.Reader.TryRead(out var disposeOperation));
5559
Assert.Equal("/telemetry/operation - $aspire/dashboard/component/dispose", disposeOperation.Name);
@@ -58,21 +62,35 @@ public async Task ComponentTelemetryContext_TelemetryEnabled_EndToEnd()
5862
[Fact]
5963
public async Task ComponentTelemetryContext_TelemetryDisabled_EndToEnd()
6064
{
65+
// Arrange
6166
var telemetryContext = new ComponentTelemetryContext(nameof(ComponentTelemetryContextTests));
6267
var telemetrySender = new TestDashboardTelemetrySender { IsTelemetryEnabled = false };
6368
var telemetryService = new DashboardTelemetryService(NullLogger<DashboardTelemetryService>.Instance, telemetrySender);
6469
var telemetryContextProvider = new ComponentTelemetryContextProvider(telemetryService);
6570
telemetryContextProvider.SetBrowserUserAgent("mozilla");
6671
await telemetryService.InitializeAsync();
6772

73+
// Act & assert initialize
6874
telemetryContextProvider.Initialize(telemetryContext);
6975
Assert.False(telemetrySender.ContextChannel.Reader.TryRead(out _));
7076

77+
// Act & assert update properties
7178
telemetryContext.UpdateTelemetryProperties([new ComponentTelemetryProperty("Test", new AspireTelemetryProperty("Value"))]);
7279
Assert.Equal(3, telemetryContext.Properties.Count);
7380
Assert.False(telemetrySender.ContextChannel.Reader.TryRead(out _));
7481

82+
// Act & assert dispose
7583
telemetryContext.Dispose();
7684
Assert.False(telemetrySender.ContextChannel.Reader.TryRead(out _));
7785
}
86+
87+
[Fact]
88+
public void ComponentTelemetryContext_DisposeWithoutInitialize_NoThrow()
89+
{
90+
// Arrange
91+
var telemetryContext = new ComponentTelemetryContext(nameof(ComponentTelemetryContextTests));
92+
93+
// Act
94+
telemetryContext.Dispose();
95+
}
7896
}

0 commit comments

Comments
 (0)