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
- Increase the runtime snapshot resolution timeout (the runtimeSnapshotResolutionTimeout option) if the dashboard is just slow to start.
- Verify the dashboard resource exists in the app model and starts successfully; check dashboard logs for startup errors.
- Confirm no port conflicts or firewall rules prevent the dashboard from binding its OTLP listener.
- 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
- Check dashboard logs for startup failures before waiting on OTLP endpoints
- Avoid disabling the dashboard in environments where OTLP endpoint resolution is needed
- Set a generous runtime snapshot resolution timeout on slow/CI machines
- Watch for port conflicts that keep the dashboard from binding its OTLP listener
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.
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- The MAUI OTLP endpoint could not be determined within
- The MAUI OTLP protocol could not be determined because the…
- Build for resource ' ' timed out after .
- Dashboard did not become ready within the expected time.
- The configured OTLP endpoint URL
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)