From 7ffc9ba213a893cf93387276bf303f2c405be830 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:26:21 -0800 Subject: [PATCH] [release/8.0-preview3] Add CTRL-C and working directory messages. (#2003) * Add CTRL-C and working directory messages. * Added a lifecycle service. * Change log category. --------- Co-authored-by: Mitch Denny --- src/Aspire.Hosting/Dcp/ApplicationExecutor.cs | 4 +- src/Aspire.Hosting/DistributedApplication.cs | 17 ------ .../DistributedApplicationBuilder.cs | 1 + .../DistributedApplicationLifecycle.cs | 56 +++++++++++++++++++ 4 files changed, 58 insertions(+), 20 deletions(-) create mode 100644 src/Aspire.Hosting/DistributedApplicationLifecycle.cs diff --git a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs index 121fe1292a..e4ba53dc4d 100644 --- a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs +++ b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs @@ -50,7 +50,7 @@ public ServiceAppResource(IResource modelResource, Service service, EndpointAnno } internal sealed class ApplicationExecutor(ILogger logger, - ILoggerFactory loggerFactory, + ILogger distributedApplicationLogger, DistributedApplicationModel model, DistributedApplicationOptions distributedApplicationOptions, KubernetesService kubernetesService, @@ -261,8 +261,6 @@ private async Task CheckDashboardAvailabilityAsync(string delimitedUrlList, Canc if (StringUtils.TryGetUriFromDelimitedString(delimitedUrlList, ";", out var firstDashboardUrl)) { await WaitForHttpSuccessOrThrow(firstDashboardUrl, DashboardAvailabilityTimeoutDuration, cancellationToken).ConfigureAwait(false); - - var distributedApplicationLogger = loggerFactory.CreateLogger(); distributedApplicationLogger.LogInformation("Now listening on: {DashboardUrl}", firstDashboardUrl.ToString().TrimEnd('/')); } else diff --git a/src/Aspire.Hosting/DistributedApplication.cs b/src/Aspire.Hosting/DistributedApplication.cs index 211eb62fc4..e3e329ccfb 100644 --- a/src/Aspire.Hosting/DistributedApplication.cs +++ b/src/Aspire.Hosting/DistributedApplication.cs @@ -4,11 +4,9 @@ using System.Diagnostics; using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Lifecycle; -using Aspire.Hosting.Publishing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; namespace Aspire.Hosting; @@ -113,7 +111,6 @@ public ValueTask DisposeAsync() /// public async Task StartAsync(CancellationToken cancellationToken = default) { - WriteStartingLog(); await _host.StartAsync(cancellationToken).ConfigureAwait(false); await ExecuteBeforeStartHooksAsync(cancellationToken).ConfigureAwait(false); } @@ -127,24 +124,10 @@ public async Task StopAsync(CancellationToken cancellationToken = default) /// public async Task RunAsync(CancellationToken cancellationToken = default) { - WriteStartingLog(); await ExecuteBeforeStartHooksAsync(cancellationToken).ConfigureAwait(false); await _host.RunAsync(cancellationToken).ConfigureAwait(false); } - private void WriteStartingLog() - { - var options = _host.Services.GetRequiredService>(); - - if (options.Value?.Publisher == "manifest") - { - // If we are producing the manifest, don't write startup messages. - return; - } - - _logger.LogInformation("Distributed application starting."); - } - /// /// Runs the distributed application and only completes when the token is triggered or shutdown is triggered. /// diff --git a/src/Aspire.Hosting/DistributedApplicationBuilder.cs b/src/Aspire.Hosting/DistributedApplicationBuilder.cs index 6a73e1f26d..ade2d8a365 100644 --- a/src/Aspire.Hosting/DistributedApplicationBuilder.cs +++ b/src/Aspire.Hosting/DistributedApplicationBuilder.cs @@ -58,6 +58,7 @@ public DistributedApplicationBuilder(DistributedApplicationOptions options) // Core things _innerBuilder.Services.AddSingleton(sp => new DistributedApplicationModel(Resources)); + _innerBuilder.Services.AddHostedService(); _innerBuilder.Services.AddHostedService(); _innerBuilder.Services.AddSingleton(options); _innerBuilder.Services.AddSingleton(); diff --git a/src/Aspire.Hosting/DistributedApplicationLifecycle.cs b/src/Aspire.Hosting/DistributedApplicationLifecycle.cs new file mode 100644 index 0000000000..ab2490efbb --- /dev/null +++ b/src/Aspire.Hosting/DistributedApplicationLifecycle.cs @@ -0,0 +1,56 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Aspire.Hosting.Publishing; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace Aspire.Hosting; + +internal sealed class DistributedApplicationLifecycle(ILogger logger, IConfiguration configuration, IOptions publishingOptions) : IHostedLifecycleService +{ + public Task StartAsync(CancellationToken cancellationToken) + { + _ = logger; + _ = publishingOptions; + return Task.CompletedTask; + } + + public Task StartedAsync(CancellationToken cancellationToken) + { + if (publishingOptions.Value.Publisher != "manifest") + { + logger.LogInformation("Distributed application started. Press CTRL-C to stop."); + } + + return Task.CompletedTask; + } + + public Task StartingAsync(CancellationToken cancellationToken) + { + if (publishingOptions.Value.Publisher != "manifest") + { + logger.LogInformation("Distributed application starting."); + logger.LogInformation("Application host directory is: {AppHostDirectory}", configuration["AppHost:Directory"]); + } + + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + public Task StoppedAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + public Task StoppingAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +}