microsoft/aspire · error · DistributedApplicationException

The Aspire dashboard resource

Error message

The Aspire dashboard resource '{resourceName}' did not publish a concrete OTLP listener within {runtimeSnapshotResolutionTimeout:c}.

What it means

The Aspire dashboard resource was expected to expose a concrete OTLP (OpenTelemetry Protocol) endpoint, but it never published one in its runtime resource snapshot within the configured timeout. The host waits for a dashboard resource event carrying a usable OTLP listener address and throws a DistributedApplicationException when that wait is cancelled by the timeout (not by caller cancellation).

Solutions

  1. Increase the runtime snapshot resolution timeout (the runtimeSnapshotResolutionTimeout option) if the dashboard is just slow to start.
  2. Verify the dashboard resource exists in the app model and starts successfully; check dashboard logs for startup errors.
  3. Confirm no port conflicts or firewall rules prevent the dashboard from binding its OTLP listener.
  4. Ensure the environment is not disabling the dashboard (e.g., ASPIRE_ALLOW_UNSECURED_TRANSPORT / dashboard disable settings) when OTLP resolution is required.

Example fix

// before
var builder = DistributedApplication.CreateBuilder(args);
// dashboard slow to start in CI, default timeout too short
// after
var builder = DistributedApplication.CreateBuilder(args);
builder.AddMauiOtlpEndpointResolution(o => o.RuntimeSnapshotResolutionTimeout = TimeSpan.FromMinutes(2));
Defensive patterns

Strategy: try-catch

Validate before calling

// Before relying on OTLP resolution, confirm the dashboard resource is present
var dashboard = appBuilder.Resources.FirstOrDefault(r => r.Name == "dashboard");
if (dashboard is null) throw new InvalidOperationException("No dashboard resource; OTLP endpoint cannot be resolved.");

Type guard

bool HasConcreteOtlpEndpoint(ResourceSnapshot snapshot) =>
    snapshot.Properties?.Any(p => p.Name == "otlpendpoint" && !string.IsNullOrEmpty(p.Value?.ToString())) == true;

Try / catch

try
{
    var endpoint = await endpointRef.GetValueAsync(ct);
}
catch (DistributedApplicationException ex) when (ex.Message.Contains("did not publish a concrete OTLP listener"))
{
    // fall back to ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL or surface a diagnostics message
}

Prevention

When it happens

Trigger: Calling a MAUI OTLP endpoint/protocol resolution API (e.g., MauiOtlpExtensions) while the dashboard resource fails to start, starts slowly, or publishes only a placeholder (non-concrete) OTLP endpoint within runtimeSnapshotResolutionTimeout.

Common situations: Dashboard container image pull delays, dashboard failing to boot due to port conflicts, misconfigured ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL, running on an environment where the dashboard resource is disabled or replaced, or the snapshot event stream never yields a concrete endpoint before the timeout elapses.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


AI-assisted analysis of microsoft/aspire@25830f84bd (2026-09-16). Data as JSON: /api/errors/fe35336af1d5f05d. Report an issue: GitHub.

Appendix: source

Thrown at src/Aspire.Hosting.Maui/MauiOtlpExtensions.cs:435

        {
            return null;
        }

        using var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
        timeoutCts.CancelAfter(runtimeSnapshotResolutionTimeout);

        ResourceEvent resourceEvent;
        try
        {
            resourceEvent = await notificationService.WaitForResourceAsync(
                resourceName,
                resourceEvent => TryResolveDashboardOtlpEndpointFromSnapshot(endpointReference, resourceEvent) is not null ||
                    IsUnavailableState(resourceEvent.Snapshot.State?.Text),
                timeoutCts.Token).ConfigureAwait(false);
        }
        catch (OperationCanceledException ex) when (!cancellationToken.IsCancellationRequested)
        {
            throw new DistributedApplicationException(
                $"The Aspire dashboard resource '{resourceName}' did not publish a concrete OTLP listener within {runtimeSnapshotResolutionTimeout:c}.",
                ex);
        }

        return TryResolveDashboardOtlpEndpointFromSnapshot(endpointReference, resourceEvent);
    }

    private static OtlpEndpointTarget? TryResolveDashboardOtlpEndpointFromSnapshot(
        EndpointReference endpointReference,
        ResourceEvent resourceEvent)
    {
        if (IsUnavailableState(resourceEvent.Snapshot.State?.Text) ||
            !endpointReference.Exists ||
            endpointReference.EndpointAnnotation.AllocatedEndpoint is null)
        {
            return null;
        }

View on GitHub (pinned to 25830f84bd)