Skip to content

GetEnvironmentVariableValuesAsync doesn't pass IServiceProvider through to EnvironmentCallbackContext #9787

Open
@afscrome

Description

@afscrome

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

GetEnvironmentVariableValuesAsync doesn't pass the service provider down through to EnvironmentCallbackContext. This causes any environment variable callbacks that access the service locator (e.g. .WithOtlpExporter()) to fail.

Image

Expected Behavior

GetEnvironmentVariableValuesAsync should flow the service provider.

Steps To Reproduce

var builder = DistributedApplication.CreateBuilder(args);

var container = builder.AddContainer("redis", "redis")
    .WithOtlpExporter();

builder.Eventing.Subscribe<AfterEndpointsAllocatedEvent>(async (evt, ctx) =>
{
    Debug.Assert(evt.Services is not null);
    var envVars = await container.Resource.GetEnvironmentVariableValuesAsync();
});

Exceptions (if any)

      System.InvalidOperationException: IServiceProvider is not available because the container has not yet been built.
         at Aspire.Hosting.DistributedApplicationExecutionContext.get_ServiceProvider() in /_/src/Aspire.Hosting/DistributedApplicationExecutionContext.cs:line 72
         at Aspire.Hosting.OtlpConfigurationExtensions.<>c__DisplayClass1_0.<<AddOtlpEnvironment>b__0>d.MoveNext() in /_/src/Aspire.Hosting/OtlpConfigurationExtensions.cs:line 64
      --- End of stack trace from previous location ---
         at Aspire.Hosting.ApplicationModel.ResourceExtensions.ProcessEnvironmentVariableValuesAsync(IResource resource, DistributedApplicationExecutionContext executionContext, Action`4 processValue, ILogger logger, String containerHostName, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs:line 352
         at Aspire.Hosting.ApplicationModel.ResourceExtensions.GetEnvironmentVariableValuesAsync(IResourceWithEnvironment resource, DistributedApplicationOperation applicationOperation) in /_/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs:line 192
         at Program.<>c__DisplayClass0_0.<<<Main>$>b__0>d.MoveNext() in S:\aspire91\aspire91.AppHost\Program.cs:line 17
      --- End of stack trace from previous location ---
         at Aspire.Hosting.Eventing.DistributedApplicationEventing.<>c__DisplayClass4_0`1.<<Subscribe>b__0>d.MoveNext() in /_/src/Aspire.Hosting/Eventing/DistributedApplicationEventing.cs:line 82
      --- End of stack trace from previous location ---
         at Aspire.Hosting.Eventing.DistributedApplicationEventing.PublishAsync[T](T event, EventDispatchBehavior dispatchBehavior, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Eventing/DistributedApplicationEventing.cs:line 69
         at Aspire.Hosting.Orchestrator.ApplicationOrchestrator.OnEndpointsAllocated(OnEndpointsAllocatedContext context) in /_/src/Aspire.Hosting/Orchestrator/ApplicationOrchestrator.cs:line 98
         at Aspire.Hosting.Dcp.DcpExecutorEvents.PublishAsync[T](T context) in /_/src/Aspire.Hosting/Dcp/DcpExecutorEvents.cs:line 33
         at Aspire.Hosting.Dcp.DcpExecutor.CreateContainersAndExecutablesAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Dcp/DcpExecutor.cs:line 710
         at Aspire.Hosting.Dcp.DcpExecutor.RunApplicationAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Dcp/DcpExecutor.cs:line 131
         at Aspire.Hosting.Orchestrator.ApplicationOrchestrator.RunApplicationAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Orchestrator/ApplicationOrchestrator.cs:line 316
         at Aspire.Hosting.Orchestrator.OrchestratorHostService.StartAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Orchestrator/OrchestratorHostService.cs:line 41
         at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>b__14_1(IHostedService service, CancellationToken token)
         at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation)
Unhandled exception. System.AggregateException: One or more errors occurred. (IServiceProvider is not available because the container has not yet been built.)
 ---> System.InvalidOperationException: IServiceProvider is not available because the container has not yet been built.
   at Aspire.Hosting.DistributedApplicationExecutionContext.get_ServiceProvider() in /_/src/Aspire.Hosting/DistributedApplicationExecutionContext.cs:line 72
   at Aspire.Hosting.OtlpConfigurationExtensions.<>c__DisplayClass1_0.<<AddOtlpEnvironment>b__0>d.MoveNext() in /_/src/Aspire.Hosting/OtlpConfigurationExtensions.cs:line 64
--- End of stack trace from previous location ---
   at Aspire.Hosting.ApplicationModel.ResourceExtensions.ProcessEnvironmentVariableValuesAsync(IResource resource, DistributedApplicationExecutionContext executionContext, Action`4 processValue, ILogger logger, String containerHostName, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs:line 352
   at Aspire.Hosting.ApplicationModel.ResourceExtensions.GetEnvironmentVariableValuesAsync(IResourceWithEnvironment resource, DistributedApplicationOperation applicationOperation) in /_/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs:line 192
   at Program.<>c__DisplayClass0_0.<<<Main>$>b__0>d.MoveNext() in S:\aspire91\aspire91.AppHost\Program.cs:line 17
--- End of stack trace from previous location ---
   at Aspire.Hosting.Eventing.DistributedApplicationEventing.<>c__DisplayClass4_0`1.<<Subscribe>b__0>d.MoveNext() in /_/src/Aspire.Hosting/Eventing/DistributedApplicationEventing.cs:line 82
--- End of stack trace from previous location ---
   at Aspire.Hosting.Eventing.DistributedApplicationEventing.PublishAsync[T](T event, EventDispatchBehavior dispatchBehavior, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Eventing/DistributedApplicationEventing.cs:line 69
   at Aspire.Hosting.Orchestrator.ApplicationOrchestrator.OnEndpointsAllocated(OnEndpointsAllocatedContext context) in /_/src/Aspire.Hosting/Orchestrator/ApplicationOrchestrator.cs:line 98
   at Aspire.Hosting.Dcp.DcpExecutorEvents.PublishAsync[T](T context) in /_/src/Aspire.Hosting/Dcp/DcpExecutorEvents.cs:line 33
   at Aspire.Hosting.Dcp.DcpExecutor.CreateContainersAndExecutablesAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Dcp/DcpExecutor.cs:line 710
   at Aspire.Hosting.Dcp.DcpExecutor.RunApplicationAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Dcp/DcpExecutor.cs:line 131
   at Aspire.Hosting.Orchestrator.ApplicationOrchestrator.RunApplicationAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Orchestrator/ApplicationOrchestrator.cs:line 316
   at Aspire.Hosting.Orchestrator.OrchestratorHostService.StartAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Orchestrator/OrchestratorHostService.cs:line 41
   at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>b__14_1(IHostedService service, CancellationToken token)
   at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Aspire.Hosting.DistributedApplication.RunAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/DistributedApplication.cs:line 415
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at Aspire.Hosting.DistributedApplication.Run() in /_/src/Aspire.Hosting/DistributedApplication.cs:line 443
   at Program.<Main>$(String[] args) in S:\aspire91\aspire91.AppHost\Program.cs:line 74

.NET Version info

No response

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-app-modelIssues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions