Skip to content

Commit 682d3fb

Browse files
committed
Log the versions of extensions being used. Resolves #4615.
1 parent c0aead9 commit 682d3fb

File tree

4 files changed

+40
-20
lines changed

4 files changed

+40
-20
lines changed

src/WebJobs.Script/DependencyInjection/ScriptStartupTypeLocator.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,7 @@ public class ScriptStartupTypeLocator : IWebJobsStartupTypeLocator
3232

3333
private static string[] _builtinExtensionAssemblies = GetBuiltinExtensionAssemblies();
3434

35-
public ScriptStartupTypeLocator(string rootScriptPath, IExtensionBundleManager extensionBundleManager)
36-
: this(rootScriptPath, NullLogger.Instance, extensionBundleManager)
37-
{
38-
}
39-
40-
public ScriptStartupTypeLocator(string rootScriptPath, ILogger logger, IExtensionBundleManager extensionBundleManager)
35+
public ScriptStartupTypeLocator(string rootScriptPath, ILogger<ScriptStartupTypeLocator> logger, IExtensionBundleManager extensionBundleManager)
4136
{
4237
_rootScriptPath = rootScriptPath ?? throw new ArgumentNullException(nameof(rootScriptPath));
4338
_extensionBundleManager = extensionBundleManager ?? throw new ArgumentNullException(nameof(extensionBundleManager));
@@ -124,6 +119,7 @@ public async Task<IEnumerable<Type>> GetExtensionsStartupTypesAsync()
124119
},
125120
(assembly, typeName, ignoreCase) =>
126121
{
122+
_logger.ScriptStartUpLoadedExtension(startupExtensionName, assembly.GetName().Version.ToString());
127123
return assembly?.GetType(typeName, false, ignoreCase);
128124
}, false, true);
129125

src/WebJobs.Script/Diagnostics/Extensions/LoggerExtension.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ internal static class LoggerExtension
160160
new EventId(324, nameof(AutoRecoveringFileSystemWatcherUnableToRecover)),
161161
"Unable to recover (path: '{path}')");
162162

163+
private static readonly Action<ILogger, string, string, Exception> _scriptStartUpLoadedExtension =
164+
LoggerMessage.Define<string, string>(
165+
LogLevel.Information,
166+
new EventId(325, nameof(ScriptStartUpLoadedExtension)),
167+
"Loaded extension '{startupExtensionName}' ({startupExtensionVersion})");
168+
163169
public static void ExtensionsManagerRestoring(this ILogger logger)
164170
{
165171
_extensionsManagerRestoring(logger, null);
@@ -185,6 +191,11 @@ public static void ScriptStartUpLoadingStartUpExtension(this ILogger logger, str
185191
_scriptStartUpLoadingStartUpExtension(logger, startupExtensionName, null);
186192
}
187193

194+
public static void ScriptStartUpLoadedExtension(this ILogger logger, string startupExtensionName, string startupExtensionVersion)
195+
{
196+
_scriptStartUpLoadedExtension(logger, startupExtensionName, startupExtensionVersion, null);
197+
}
198+
188199
public static void ScriptStartUpBelongExtension(this ILogger logger, string typeName)
189200
{
190201
_scriptStartUpBelongExtension(logger, typeName, null);

src/WebJobs.Script/ScriptHostBuilderExtensions.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public static IHostBuilder AddScriptHostCore(this IHostBuilder builder, ScriptAp
110110
{
111111
// Only set our external startup if we're not suppressing host initialization
112112
// as we don't want to load user assemblies otherwise.
113-
webJobsBuilder.UseScriptExternalStartup(applicationHostOptions.ScriptPath, bundleManager);
113+
webJobsBuilder.UseScriptExternalStartup(applicationHostOptions.ScriptPath, loggerFactory, bundleManager);
114114
}
115115
webJobsBuilder.Services.AddSingleton<IExtensionBundleManager>(_ => bundleManager);
116116

@@ -200,9 +200,10 @@ public static void AddCommonServices(IServiceCollection services)
200200
AddProcessRegistry(services);
201201
}
202202

203-
public static IWebJobsBuilder UseScriptExternalStartup(this IWebJobsBuilder builder, string rootScriptPath, IExtensionBundleManager extensionBundleManager)
203+
public static IWebJobsBuilder UseScriptExternalStartup(this IWebJobsBuilder builder, string rootScriptPath, ILoggerFactory loggerFactory, IExtensionBundleManager extensionBundleManager)
204204
{
205-
return builder.UseExternalStartup(new ScriptStartupTypeLocator(rootScriptPath, extensionBundleManager));
205+
var logger = loggerFactory.CreateLogger<ScriptStartupTypeLocator>() ?? throw new ArgumentNullException(nameof(loggerFactory));
206+
return builder.UseExternalStartup(new ScriptStartupTypeLocator(rootScriptPath, logger, extensionBundleManager));
206207
}
207208

208209
public static IHostBuilder SetAzureFunctionsEnvironment(this IHostBuilder builder)

test/WebJobs.Script.Tests/ScriptStartupTypeDiscovererTests.cs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

4-
using System;
5-
using System.Collections.Generic;
64
using System.IO;
75
using System.Linq;
8-
using System.Text;
96
using System.Threading.Tasks;
107
using Microsoft.Azure.WebJobs.Extensions;
118
using Microsoft.Azure.WebJobs.Extensions.Http;
129
using Microsoft.Azure.WebJobs.Extensions.Storage;
1310
using Microsoft.Azure.WebJobs.Script.DependencyInjection;
1411
using Microsoft.Azure.WebJobs.Script.ExtensionBundle;
1512
using Microsoft.Azure.WebJobs.Script.Models;
13+
using Microsoft.Extensions.Logging;
14+
using Microsoft.WebJobs.Script.Tests;
1615
using Moq;
1716
using Newtonsoft.Json.Linq;
1817
using WebJobs.Script.Tests;
@@ -56,12 +55,15 @@ void CopyToBin(string path)
5655

5756
File.WriteAllText(Path.Combine(binPath, "extensions.json"), extensions.ToString());
5857

59-
var testLogger = new TestLogger("test");
58+
TestLoggerProvider testLoggerProvider = new TestLoggerProvider();
59+
LoggerFactory factory = new LoggerFactory();
60+
factory.AddProvider(testLoggerProvider);
61+
var testLogger = factory.CreateLogger<ScriptStartupTypeLocator>();
6062
var discoverer = new ScriptStartupTypeLocator(directory.Path, testLogger, mockExtensionBundleManager.Object);
6163

6264
// Act
6365
var types = await discoverer.GetExtensionsStartupTypesAsync();
64-
var traces = testLogger.GetLogMessages();
66+
var traces = testLoggerProvider.GetAllLogMessages();
6567

6668
// Assert
6769
Assert.Single(types);
@@ -80,12 +82,15 @@ public async Task GetExtensionsStartupTypes_ExtensionBundleReturnsNullPath_Retur
8082

8183
using (var directory = new TempDirectory())
8284
{
83-
var testLogger = new TestLogger("test");
85+
TestLoggerProvider testLoggerProvider = new TestLoggerProvider();
86+
LoggerFactory factory = new LoggerFactory();
87+
factory.AddProvider(testLoggerProvider);
88+
var testLogger = factory.CreateLogger<ScriptStartupTypeLocator>();
8489
var discoverer = new ScriptStartupTypeLocator(string.Empty, testLogger, mockExtensionBundleManager.Object);
8590

8691
// Act
8792
var types = await discoverer.GetExtensionsStartupTypesAsync();
88-
var traces = testLogger.GetLogMessages();
93+
var traces = testLoggerProvider.GetAllLogMessages();
8994

9095
// Assert
9196
Assert.Null(types);
@@ -128,12 +133,15 @@ void CopyToBin(string path)
128133

129134
File.WriteAllText(Path.Combine(binPath, "extensions.json"), extensions.ToString());
130135

131-
var testLogger = new TestLogger("test");
136+
TestLoggerProvider testLoggerProvider = new TestLoggerProvider();
137+
LoggerFactory factory = new LoggerFactory();
138+
factory.AddProvider(testLoggerProvider);
139+
var testLogger = factory.CreateLogger<ScriptStartupTypeLocator>();
132140
var discoverer = new ScriptStartupTypeLocator(directory.Path, testLogger, mockExtensionBundleManager.Object);
133141

134142
// Act
135143
var types = await discoverer.GetExtensionsStartupTypesAsync();
136-
var traces = testLogger.GetLogMessages();
144+
var traces = testLoggerProvider.GetAllLogMessages();
137145

138146
// Assert
139147
Assert.Single(types);
@@ -149,12 +157,16 @@ public async Task GetExtensionsStartupTypes_UnableToDownloadExtensionBundle_Retu
149157
var mockExtensionBundleManager = new Mock<IExtensionBundleManager>();
150158
mockExtensionBundleManager.Setup(e => e.IsExtensionBundleConfigured()).Returns(true);
151159
mockExtensionBundleManager.Setup(e => e.GetExtensionBundlePath()).ReturnsAsync(string.Empty);
152-
var testLogger = new TestLogger("test");
160+
161+
TestLoggerProvider testLoggerProvider = new TestLoggerProvider();
162+
LoggerFactory factory = new LoggerFactory();
163+
factory.AddProvider(testLoggerProvider);
164+
var testLogger = factory.CreateLogger<ScriptStartupTypeLocator>();
153165
var discoverer = new ScriptStartupTypeLocator(string.Empty, testLogger, mockExtensionBundleManager.Object);
154166

155167
// Act
156168
var types = await discoverer.GetExtensionsStartupTypesAsync();
157-
var traces = testLogger.GetLogMessages();
169+
var traces = testLoggerProvider.GetAllLogMessages();
158170

159171
// Assert
160172
Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, $"Unable to find or download extension bundle")));

0 commit comments

Comments
 (0)