Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#pragma warning disable ASPIREUSERSECRETS001

using Aspire;
using Aspire.Hosting;
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Dcp;
using Aspire.Hosting.Resources;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

internal static class BuiltInDistributedApplicationEventSubscriptionHandlers
{
Expand Down Expand Up @@ -78,4 +82,29 @@ public static Task UpdateContainerRegistryAsync(BeforeStartEvent @event, Distrib

return Task.CompletedTask;
}

public static Task WarnPersistentContainersWithoutUserSecrets(BeforeStartEvent beforeStartEvent, CancellationToken _)
{
var userSecretsManager = beforeStartEvent.Services.GetRequiredService<IUserSecretsManager>();

if (userSecretsManager.IsAvailable)
{
return Task.CompletedTask;
}

var logger = beforeStartEvent.Services.GetRequiredService<ILoggerFactory>().CreateLogger("Aspire.Hosting");

foreach (var resource in beforeStartEvent.Model.Resources)
{
if (resource.GetContainerLifetimeType() == ContainerLifetime.Persistent)
{
if (logger.IsEnabled(LogLevel.Warning))
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DamianEdwards FYI, there is an anlyzer in 10.0.103 (an update) that would warn when it's recommended. In this case it would trigger because it's a Warning and would not (in theory) happen in a hot path. It would for anything lower though. And the "expensive" thing in this code is the fact that it's calling params string[] so it's creating an array. Not obvious, right? c.f. dotnet/sdk#53030

Copy link
Member

@DamianEdwards DamianEdwards Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not quite following. Is the recommended pattern as simple as

always guard LogXXX calls with an appropriate call to IsEnabled(LogLevel.XXX)

That's my mental model today.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What you did is totally fine, just saying that even the analyzer doesn't flag some uses because they really don't matter in non-hot paths.... e.g. when using LogWarning like here.

It's safe to just apply it everywhere and not have to think about it.

{
logger.LogWarning(MessageStrings.PersistentContainerWithoutUserSecrets, resource.Name);
}
}
}

return Task.CompletedTask;
}
}
1 change: 1 addition & 0 deletions src/Aspire.Hosting/DistributedApplicationBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,7 @@ public DistributedApplicationBuilder(DistributedApplicationOptions options)
_innerBuilder.Services.AddSingleton<IKubernetesService, KubernetesService>();

Eventing.Subscribe<BeforeStartEvent>(BuiltInDistributedApplicationEventSubscriptionHandlers.InitializeDcpAnnotations);
Eventing.Subscribe<BeforeStartEvent>(BuiltInDistributedApplicationEventSubscriptionHandlers.WarnPersistentContainersWithoutUserSecrets);
}

// Publishing support
Expand Down
9 changes: 9 additions & 0 deletions src/Aspire.Hosting/Resources/MessageStrings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/Aspire.Hosting/Resources/MessageStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,9 @@
<data name="RequiredCommandValidationFailedWithLink" xml:space="preserve">
<value>Command '{0}' validation failed: {1}. For installation instructions, see: {2}</value>
</data>
<data name="PersistentContainerWithoutUserSecrets" xml:space="preserve">
<value>Resource '{0}' has a persistent lifetime but the AppHost project does not have user secrets configured. Generated parameter values (such as passwords) may change on each restart, causing persistent containers to be recreated. Run 'dotnet user-secrets init' in the AppHost directory to configure user secrets.</value>
</data>
<data name="ResourceMayFailToStart" xml:space="preserve">
<value>Resource '{0}' may fail to start: {1}</value>
</data>
Expand Down
5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.ru.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.tr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.zh-Hans.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Aspire.Hosting/Resources/xlf/MessageStrings.zh-Hant.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading