Skip to content

Commit 1b9a1ac

Browse files
authored
[pack] adding more values to the log initialization output (#9836)
1 parent ca77718 commit 1b9a1ac

File tree

3 files changed

+67
-25
lines changed

3 files changed

+67
-25
lines changed

src/WebJobs.Script.WebHost/Diagnostics/Extensions/ScriptHostServiceLoggerExtension.cs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

44
using System;
5-
using Microsoft.ApplicationInsights.AspNetCore;
6-
using Microsoft.Azure.Documents;
5+
using System.Collections.Generic;
6+
using System.Text.Json;
77
using Microsoft.Extensions.Logging;
88

99
namespace Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.Extensions
@@ -330,17 +330,33 @@ public static void ScriptHostServiceRestartCanceledByRuntime(this ILogger logger
330330
_scriptHostServiceRestartCanceledByRuntime(logger, null);
331331
}
332332

333-
public static void LogHostInitializationSettings(this ILogger logger, string functionWorkerRuntime, string functionExtensionVersion, string siteExtensionDirectory, bool inStandbyMode)
333+
public static void LogHostInitializationSettings(this ILogger logger, string originalFunctionWorkerRuntime, string functionWorkerRuntime,
334+
string originalFunctionWorkerRuntimeVersion, string functionsWorkerRuntimeVersion, string functionExtensionVersion, string hostDirectory,
335+
bool inStandbyMode, bool hasBeenSpecialized, bool usePlaceholderDotNetIsolated, string websiteSku, string featureFlags,
336+
IDictionary<string, string> hostingConfig)
334337
{
335-
var hostInitializationSettings = $@"{{
336-
""HostInitializationSettings"": {{
337-
""functionsWorkerRuntime"": ""{functionWorkerRuntime}"",
338-
""functionsExtensionVersion"": ""{functionExtensionVersion}"",
339-
""siteExtensionDirectory"": ""{siteExtensionDirectory}"",
340-
""inStandbyMode"": {inStandbyMode}
341-
}}
342-
}}";
343-
_logHostInitializationSettings(logger, hostInitializationSettings, null);
338+
// This is a dump of values for telemetry right now, but eventually we will refactor this
339+
// into a proper Options object
340+
var initializationSettings = new
341+
{
342+
OriginalFunctionWorkerRuntime = originalFunctionWorkerRuntime,
343+
FunctionsWorkerRuntime = functionWorkerRuntime,
344+
OriginalFunctionWorkerRuntimeVersion = originalFunctionWorkerRuntimeVersion,
345+
FunctionsWorkerRuntimeVersion = functionsWorkerRuntimeVersion,
346+
FunctionsExtensionVesion = functionExtensionVersion,
347+
HostDirectory = hostDirectory,
348+
InStandbyMode = inStandbyMode,
349+
HasBeenSpecialized = hasBeenSpecialized,
350+
UsePlaceholderDotNetIsolated = usePlaceholderDotNetIsolated,
351+
WebSiteSku = websiteSku,
352+
FeatureFlags = featureFlags,
353+
HostingConfig = hostingConfig
354+
};
355+
356+
var options = new JsonSerializerOptions { WriteIndented = true };
357+
string settingsJson = JsonSerializer.Serialize(initializationSettings, options);
358+
359+
_logHostInitializationSettings(logger, settingsJson, null);
344360
}
345361
}
346362
}

src/WebJobs.Script.WebHost/WebJobsScriptHostService.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
using Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId;
1515
using Microsoft.Azure.WebJobs.Host;
1616
using Microsoft.Azure.WebJobs.Logging;
17+
using Microsoft.Azure.WebJobs.Script.Config;
1718
using Microsoft.Azure.WebJobs.Script.Configuration;
1819
using Microsoft.Azure.WebJobs.Script.Diagnostics;
1920
using Microsoft.Azure.WebJobs.Script.Eventing;
2021
using Microsoft.Azure.WebJobs.Script.Scale;
2122
using Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.Extensions;
2223
using Microsoft.Azure.WebJobs.Script.Workers;
24+
using Microsoft.Azure.WebJobs.Script.Workers.Rpc;
2325
using Microsoft.Extensions.Configuration;
2426
using Microsoft.Extensions.DependencyInjection;
2527
using Microsoft.Extensions.Hosting;
@@ -47,6 +49,10 @@ public class WebJobsScriptHostService : IHostedService, IScriptHostManager, ISer
4749
private readonly SemaphoreSlim _hostStartSemaphore = new SemaphoreSlim(1, 1);
4850
private readonly TaskCompletionSource<bool> _hostStartedSource = new TaskCompletionSource<bool>();
4951
private readonly Task _hostStarted;
52+
private readonly IOptions<FunctionsHostingConfigOptions> _hostingConfigOptions;
53+
private readonly bool _originalStandbyModeValue;
54+
private readonly string _originalFunctionsWorkerRuntime;
55+
private readonly string _originalFunctionsWorkerRuntimeVersion;
5056
private IScriptEventManager _eventManager;
5157

5258
private IHost _host;
@@ -64,7 +70,8 @@ public class WebJobsScriptHostService : IHostedService, IScriptHostManager, ISer
6470
public WebJobsScriptHostService(IOptionsMonitor<ScriptApplicationHostOptions> applicationHostOptions, IScriptHostBuilder scriptHostBuilder, ILoggerFactory loggerFactory,
6571
IScriptWebHostEnvironment scriptWebHostEnvironment, IEnvironment environment,
6672
HostPerformanceManager hostPerformanceManager, IOptions<HostHealthMonitorOptions> healthMonitorOptions,
67-
IMetricsLogger metricsLogger, IApplicationLifetime applicationLifetime, IConfiguration config, IScriptEventManager eventManager)
73+
IMetricsLogger metricsLogger, IApplicationLifetime applicationLifetime, IConfiguration config, IScriptEventManager eventManager,
74+
IOptions<FunctionsHostingConfigOptions> hostingConfigOptions)
6875
{
6976
ArgumentNullException.ThrowIfNull(loggerFactory);
7077

@@ -94,6 +101,13 @@ public WebJobsScriptHostService(IOptionsMonitor<ScriptApplicationHostOptions> ap
94101
_healthCheckWindow = new SlidingWindow<bool>(_healthMonitorOptions.Value.HealthCheckWindow);
95102
_hostHealthCheckTimer = new Timer(OnHostHealthCheckTimer, null, TimeSpan.Zero, _healthMonitorOptions.Value.HealthCheckInterval);
96103
}
104+
105+
_hostingConfigOptions = hostingConfigOptions;
106+
107+
// we'll use this to emit telemetry on if and how this process has been specialized
108+
_originalStandbyModeValue = _scriptWebHostEnvironment.InStandbyMode;
109+
_originalFunctionsWorkerRuntime = _environment.GetFunctionsWorkerRuntime();
110+
_originalFunctionsWorkerRuntimeVersion = _environment.GetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeVersionSettingName);
97111
}
98112

99113
public event EventHandler HostInitializing;
@@ -702,11 +716,18 @@ private void LogInitialization(IHost host, bool isOffline, int attemptCount, int
702716

703717
// Log settings
704718
var functionWorkerRuntime = _environment.GetEnvironmentVariable(FunctionWorkerRuntime);
719+
var functionWorkerRuntimeVersion = _environment.GetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeVersionSettingName);
705720
var functionExtensionVersion = _environment.GetEnvironmentVariable(FunctionsExtensionVersion);
706721
var currentDirectory = Directory.GetCurrentDirectory();
707722
var inStandbyMode = _scriptWebHostEnvironment.InStandbyMode;
708-
709-
logger.LogHostInitializationSettings(functionWorkerRuntime, functionExtensionVersion, currentDirectory, inStandbyMode);
723+
var hasBeenSpecialized = _originalStandbyModeValue && !inStandbyMode;
724+
var usePlaceholderDotNetIsolated = _environment.UsePlaceholderDotNetIsolated();
725+
var websiteSku = _environment.GetEnvironmentVariable(AzureWebsiteSku);
726+
var featureFlags = _environment.GetEnvironmentVariable(AzureWebJobsFeatureFlags);
727+
var hostingConfigDict = _hostingConfigOptions.Value.Features;
728+
729+
logger.LogHostInitializationSettings(_originalFunctionsWorkerRuntime, functionWorkerRuntime, _originalFunctionsWorkerRuntimeVersion, functionWorkerRuntimeVersion,
730+
functionExtensionVersion, currentDirectory, inStandbyMode, hasBeenSpecialized, usePlaceholderDotNetIsolated, websiteSku, featureFlags, hostingConfigDict);
710731
}
711732

712733
private void OnHostHealthCheckTimer(object state)

test/WebJobs.Script.Tests/WebJobsScriptHostServiceTests.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ namespace Microsoft.Azure.WebJobs.Script.Tests
2929
{
3030
public class WebJobsScriptHostServiceTests
3131
{
32+
private readonly OptionsWrapper<FunctionsHostingConfigOptions> _functionsHostingConfigOptions = new(new FunctionsHostingConfigOptions());
3233
private WebJobsScriptHostService _hostService;
3334
private ScriptApplicationHostOptionsMonitor _monitor;
3435
private TestLoggerProvider _webHostLoggerProvider = new TestLoggerProvider();
@@ -107,7 +108,7 @@ public async Task StartAsync_Succeeds()
107108
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
108109
_hostPerformanceManager, _healthMonitorOptions,
109110
metricsLogger, new Mock<IApplicationLifetime>().Object,
110-
_mockConfig, mockEventManager.Object);
111+
_mockConfig, mockEventManager.Object, _functionsHostingConfigOptions);
111112

112113
await _hostService.StartAsync(CancellationToken.None);
113114

@@ -138,7 +139,7 @@ public async Task HostInitialization_OnInitializationException_MaintainsErrorInf
138139
_monitor, hostBuilder.Object, NullLoggerFactory.Instance,
139140
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
140141
_hostPerformanceManager, _healthMonitorOptions, metricsLogger,
141-
new Mock<IApplicationLifetime>().Object, _mockConfig, new TestScriptEventManager());
142+
new Mock<IApplicationLifetime>().Object, _mockConfig, new TestScriptEventManager(), _functionsHostingConfigOptions);
142143

143144
await _hostService.StartAsync(CancellationToken.None);
144145
Assert.True(AreRequiredMetricsGenerated(metricsLogger));
@@ -168,7 +169,7 @@ public async Task HostRestart_Specialization_Succeeds()
168169
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
169170
_hostPerformanceManager, _healthMonitorOptions,
170171
metricsLogger, new Mock<IApplicationLifetime>().Object,
171-
_mockConfig, new TestScriptEventManager());
172+
_mockConfig, new TestScriptEventManager(), _functionsHostingConfigOptions);
172173

173174
await _hostService.StartAsync(CancellationToken.None);
174175
Assert.True(AreRequiredMetricsGenerated(metricsLogger));
@@ -223,7 +224,7 @@ public async Task HostRestart_DuringInitializationWithError_Recovers()
223224
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
224225
_hostPerformanceManager, _healthMonitorOptions,
225226
metricsLogger, new Mock<IApplicationLifetime>().Object,
226-
_mockConfig, new TestScriptEventManager());
227+
_mockConfig, new TestScriptEventManager(), _functionsHostingConfigOptions);
227228

228229
TestLoggerProvider hostALogger = hostA.Object.GetTestLoggerProvider();
229230
TestLoggerProvider hostBLogger = hostB.Object.GetTestLoggerProvider();
@@ -299,7 +300,7 @@ public async Task HostRestart_DuringInitialization_Cancels()
299300
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
300301
_hostPerformanceManager, _healthMonitorOptions,
301302
metricsLogger, new Mock<IApplicationLifetime>().Object,
302-
_mockConfig, new TestScriptEventManager());
303+
_mockConfig, new TestScriptEventManager(), _functionsHostingConfigOptions);
303304

304305
TestLoggerProvider hostALogger = hostA.Object.GetTestLoggerProvider();
305306

@@ -368,7 +369,8 @@ public async Task DisposedHost_ServicesNotExposed()
368369
_monitor, hostBuilder.Object, NullLoggerFactory.Instance,
369370
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
370371
_hostPerformanceManager, _healthMonitorOptions, metricsLogger,
371-
new Mock<IApplicationLifetime>().Object, _mockConfig, new TestScriptEventManager());
372+
new Mock<IApplicationLifetime>().Object, _mockConfig, new TestScriptEventManager(),
373+
_functionsHostingConfigOptions);
372374

373375
Task startTask = _hostService.StartAsync(CancellationToken.None);
374376

@@ -419,7 +421,7 @@ public async Task DisposesScriptHost()
419421
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
420422
_hostPerformanceManager, _healthMonitorOptions,
421423
metricsLogger, new Mock<IApplicationLifetime>().Object,
422-
_mockConfig, new TestScriptEventManager());
424+
_mockConfig, new TestScriptEventManager(), _functionsHostingConfigOptions);
423425

424426
var hostLogger = host.Object.GetTestLoggerProvider();
425427

@@ -456,7 +458,8 @@ public async Task HostRestart_BeforeStart_WaitsForStartToContinue()
456458
_monitor, hostBuilder.Object, _loggerFactory,
457459
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
458460
_hostPerformanceManager, _healthMonitorOptions, metricsLogger,
459-
new Mock<IApplicationLifetime>().Object, _mockConfig, new TestScriptEventManager());
461+
new Mock<IApplicationLifetime>().Object, _mockConfig,
462+
new TestScriptEventManager(), _functionsHostingConfigOptions);
460463

461464
// Simulate a call to specialize coming from the PlaceholderSpecializationMiddleware. This
462465
// can happen before we ever start the service, which could create invalid state.
@@ -511,7 +514,8 @@ public void ShouldEnforceSequentialRestart_WithCorrectConfig(string value, bool
511514
_monitor, hostBuilder.Object, NullLoggerFactory.Instance,
512515
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
513516
_hostPerformanceManager, _healthMonitorOptions, metricsLogger,
514-
new Mock<IApplicationLifetime>().Object, config, new TestScriptEventManager());
517+
new Mock<IApplicationLifetime>().Object, config, new TestScriptEventManager(),
518+
_functionsHostingConfigOptions);
515519

516520
Assert.Equal(expectedResult, _hostService.ShouldEnforceSequentialRestart());
517521
}
@@ -548,7 +552,8 @@ public async Task DependencyTrackingTelemetryModule_Race()
548552
_monitor, scriptHostBuilder.Object, NullLoggerFactory.Instance,
549553
_mockScriptWebHostEnvironment.Object, _mockEnvironment.Object,
550554
_hostPerformanceManager, _healthMonitorOptions, new TestMetricsLogger(),
551-
new Mock<IApplicationLifetime>().Object, _mockConfig, new TestScriptEventManager()))
555+
new Mock<IApplicationLifetime>().Object, _mockConfig, new TestScriptEventManager(),
556+
_functionsHostingConfigOptions))
552557
{
553558
await _hostService.StartAsync(CancellationToken.None);
554559

0 commit comments

Comments
 (0)