diff --git a/src/Components/Aspire.Azure.Messaging.EventHubs/EventHubProducerClientComponent.cs b/src/Components/Aspire.Azure.Messaging.EventHubs/EventHubProducerClientComponent.cs index 8850656d572..ddb3bab2a19 100644 --- a/src/Components/Aspire.Azure.Messaging.EventHubs/EventHubProducerClientComponent.cs +++ b/src/Components/Aspire.Azure.Messaging.EventHubs/EventHubProducerClientComponent.cs @@ -4,10 +4,8 @@ using Aspire.Azure.Messaging.EventHubs; using Azure.Core.Extensions; using Azure.Messaging.EventHubs.Producer; -using HealthChecks.Azure.Messaging.EventHubs; using Microsoft.Extensions.Azure; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Diagnostics.HealthChecks; namespace Microsoft.Extensions.Hosting; @@ -51,9 +49,4 @@ protected override IAzureClientBuilder : AzureComponent - where TClientOptions: class + where TClientOptions : class where TClient : class where TSettings : AzureMessagingEventHubsSettings, new() { + private EventHubProducerClient? _healthCheckClient; + // each EventHub client class is in a different namespace, so the base AzureComponent.ActivitySourceNames logic doesn't work protected override string[] ActivitySourceNames => ["Azure.Messaging.EventHubs.*"]; @@ -26,15 +28,26 @@ protected override IHealthCheck CreateHealthCheck(TClient client, TSettings sett // HealthChecks.Azure.Messaging.EventHubs currently only supports EventHubProducerClient. // https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/issues/2258 tracks supporting other client types. - var producerClientOptions = new EventHubProducerClientOptions + // Reuse the client if it's an EventHubProducerClient + if (client is EventHubProducerClient producerClient) + { + _healthCheckClient = producerClient; + } + + // Create a custom EventHubProducerClient otherwise + if (_healthCheckClient == null) { - Identifier = $"AspireEventHubHealthCheck-{settings.EventHubName}", - }; - var producerClient = !string.IsNullOrEmpty(settings.ConnectionString) ? - new EventHubProducerClient(settings.ConnectionString, producerClientOptions) : - new EventHubProducerClient(settings.FullyQualifiedNamespace, settings.EventHubName, settings.Credential ?? new DefaultAzureCredential(), producerClientOptions); + var producerClientOptions = new EventHubProducerClientOptions + { + Identifier = $"AspireEventHubHealthCheck-{settings.EventHubName}", + }; + + _healthCheckClient = !string.IsNullOrEmpty(settings.ConnectionString) ? + new EventHubProducerClient(settings.ConnectionString, producerClientOptions) : + new EventHubProducerClient(settings.FullyQualifiedNamespace, settings.EventHubName, settings.Credential ?? new DefaultAzureCredential(), producerClientOptions); + } - return new AzureEventHubHealthCheck(producerClient); + return new AzureEventHubHealthCheck(_healthCheckClient); } protected override bool GetHealthCheckEnabled(TSettings settings) diff --git a/src/Components/Aspire.Azure.Messaging.EventHubs/PartitionReceiverClientComponent.cs b/src/Components/Aspire.Azure.Messaging.EventHubs/PartitionReceiverClientComponent.cs index a0b33433c16..4cbd7ae4241 100644 --- a/src/Components/Aspire.Azure.Messaging.EventHubs/PartitionReceiverClientComponent.cs +++ b/src/Components/Aspire.Azure.Messaging.EventHubs/PartitionReceiverClientComponent.cs @@ -69,7 +69,7 @@ protected override IAzureClientBuilder>().Value; + + var registration = healthCheckServiceOptions.Registrations.First(); + + var healthCheck1 = registration.Factory(host.Services) as AzureEventHubHealthCheck; + var healthCheck2 = registration.Factory(host.Services) as AzureEventHubHealthCheck; + + Assert.NotNull(healthCheck1); + Assert.NotNull(healthCheck2); + + var clientAccessor = typeof(AzureEventHubHealthCheck).GetField("_client", BindingFlags.NonPublic | BindingFlags.Instance); + + Assert.NotNull(clientAccessor); + + var client1 = clientAccessor?.GetValue(healthCheck1); + var client2 = clientAccessor?.GetValue(healthCheck2); + + Assert.Same(client1, client2); + } }