Skip to content

Commit fba2162

Browse files
authored
Switching the worker indexing to use hosting config feature flag (#9245)
1 parent 725064c commit fba2162

File tree

12 files changed

+147
-30
lines changed

12 files changed

+147
-30
lines changed

src/WebJobs.Script.WebHost/WebHostServiceCollectionExtensions.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,9 @@ public static void AddWebJobsScriptHost(this IServiceCollection services, IConfi
175175
// Language Worker Hosted Services need to be intialized before WebJobsScriptHostService
176176
ScriptHostBuilderExtensions.AddCommonServices(services);
177177

178-
services.AddSingleton<IFunctionMetadataProvider>(sp =>
179-
{
180-
return new FunctionMetadataProvider(
181-
sp.GetRequiredService<ILogger<FunctionMetadataProvider>>(),
182-
ActivatorUtilities.CreateInstance<WorkerFunctionMetadataProvider>(sp),
183-
ActivatorUtilities.CreateInstance<HostFunctionMetadataProvider>(sp));
184-
});
178+
services.AddSingleton<IWorkerFunctionMetadataProvider, WorkerFunctionMetadataProvider>();
179+
services.AddSingleton<IHostFunctionMetadataProvider, HostFunctionMetadataProvider>();
180+
services.AddSingleton<IFunctionMetadataProvider, FunctionMetadataProvider>();
185181

186182
// Core script host services
187183
services.AddSingleton<WebJobsScriptHostService>();

src/WebJobs.Script/Config/FunctionsHostingConfigOptions.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,28 @@ public bool WorkerWarmupEnabled
4343
}
4444
}
4545

46+
/// <summary>
47+
/// Gets a value indicating whether worker indexing feature is enabled in the hosting config.
48+
/// </summary>
49+
public bool WorkerIndexingEnabled
50+
{
51+
get
52+
{
53+
return GetFeature(RpcWorkerConstants.WorkerIndexingEnabled) == "1";
54+
}
55+
}
56+
57+
/// <summary>
58+
/// Gets a string delimited by '|' that contains the name of the apps with worker indexing disabled.
59+
/// </summary>
60+
public string WorkerIndexingDisabledApps
61+
{
62+
get
63+
{
64+
return GetFeature(RpcWorkerConstants.WorkerIndexingDisabledApps) ?? string.Empty;
65+
}
66+
}
67+
4668
/// <summary>
4769
/// Gets a value indicating whether Linux Log Backoff is disabled in the hosting config.
4870
/// </summary>

src/WebJobs.Script/Host/FunctionMetadataProvider.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Collections.Immutable;
77
using System.Threading.Tasks;
8+
using Microsoft.Azure.WebJobs.Script.Config;
89
using Microsoft.Azure.WebJobs.Script.Description;
910
using Microsoft.Azure.WebJobs.Script.Workers.Rpc;
1011
using Microsoft.Extensions.Logging;
@@ -16,22 +17,24 @@ internal class FunctionMetadataProvider : IFunctionMetadataProvider
1617
{
1718
private readonly IEnvironment _environment;
1819
private readonly ILogger<FunctionMetadataProvider> _logger;
20+
private readonly FunctionsHostingConfigOptions _functionsHostingConfigOptions;
1921
private IWorkerFunctionMetadataProvider _workerFunctionMetadataProvider;
2022
private IHostFunctionMetadataProvider _hostFunctionMetadataProvider;
2123

22-
public FunctionMetadataProvider(ILogger<FunctionMetadataProvider> logger, IWorkerFunctionMetadataProvider workerFunctionMetadataProvider, IHostFunctionMetadataProvider hostFunctionMetadataProvider)
24+
public FunctionMetadataProvider(ILogger<FunctionMetadataProvider> logger, IWorkerFunctionMetadataProvider workerFunctionMetadataProvider, IHostFunctionMetadataProvider hostFunctionMetadataProvider, IOptions<FunctionsHostingConfigOptions> functionsHostingConfigOptions)
2325
{
2426
_logger = logger;
2527
_workerFunctionMetadataProvider = workerFunctionMetadataProvider;
2628
_hostFunctionMetadataProvider = hostFunctionMetadataProvider;
29+
_functionsHostingConfigOptions = functionsHostingConfigOptions.Value;
2730
_environment = SystemEnvironment.Instance;
2831
}
2932

3033
public ImmutableDictionary<string, ImmutableArray<string>> FunctionErrors { get; private set; }
3134

3235
public async Task<ImmutableArray<FunctionMetadata>> GetFunctionMetadataAsync(IEnumerable<RpcWorkerConfig> workerConfigs, IEnvironment environment, bool forceRefresh = false)
3336
{
34-
bool workerIndexing = Utility.CanWorkerIndex(workerConfigs, _environment);
37+
bool workerIndexing = Utility.CanWorkerIndex(workerConfigs, _environment, _functionsHostingConfigOptions);
3538
if (!workerIndexing)
3639
{
3740
return await GetMetadataFromHostProvider(workerConfigs, environment, forceRefresh);

src/WebJobs.Script/Utility.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -924,28 +924,37 @@ public static void ValidateRetryOptions(RetryOptions
924924
}
925925
}
926926

927-
public static bool CanWorkerIndex(IEnumerable<RpcWorkerConfig> workerConfigs, IEnvironment environment)
927+
// EnableWorkerIndexing set through AzureWebjobsFeatuerFlag always take precdence
928+
// if AzureWebjobsFeatuerFlag is not set then WORKER_INDEXING_ENABLED hosting config controls stamplevel enablement
929+
// if WORKER_INDEXING_ENABLED is set and WORKER_INDEXING_DISABLED contains the customers app name worker indexing is then disabled for that customer only
930+
// Also Worker indexing is disabled for Logic apps
931+
public static bool CanWorkerIndex(IEnumerable<RpcWorkerConfig> workerConfigs, IEnvironment environment, FunctionsHostingConfigOptions functionsHostingConfigOptions)
928932
{
929-
if (!FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagEnableWorkerIndexing, environment))
933+
string appName = environment.GetAzureWebsiteUniqueSlotName();
934+
bool workerIndexingEnabled = FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagEnableWorkerIndexing, environment)
935+
|| (functionsHostingConfigOptions.WorkerIndexingEnabled
936+
&& !functionsHostingConfigOptions.WorkerIndexingDisabledApps.ToLowerInvariant().Split("|").Contains(appName)
937+
&& !environment.IsLogicApp());
938+
939+
if (!workerIndexingEnabled)
930940
{
931941
return false;
932942
}
933943

934-
if (workerConfigs != null && !environment.IsMultiLanguageRuntimeEnvironment())
944+
bool workerIndexingAvailable = false;
945+
if (workerConfigs != null)
935946
{
936947
var workerRuntime = environment.GetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime);
937948
var workerConfig = workerConfigs.FirstOrDefault(c => c.Description?.Language != null && c.Description.Language.Equals(workerRuntime, StringComparison.InvariantCultureIgnoreCase));
938949

939950
// if feature flag is enabled and workerConfig.WorkerIndexing == true, then return true
940-
if (workerConfig != null
951+
workerIndexingAvailable = workerConfig != null
941952
&& workerConfig.Description != null
942953
&& workerConfig.Description.WorkerIndexing != null
943-
&& workerConfig.Description.WorkerIndexing.Equals("true", StringComparison.OrdinalIgnoreCase))
944-
{
945-
return true;
946-
}
954+
&& workerConfig.Description.WorkerIndexing.Equals("true", StringComparison.OrdinalIgnoreCase);
947955
}
948-
return false;
956+
957+
return workerIndexingEnabled && workerIndexingAvailable;
949958
}
950959

951960
public static void LogAutorestGeneratedJsonIfExists(string rootScriptPath, ILogger logger)

src/WebJobs.Script/Workers/Rpc/RpcWorkerConstants.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,8 @@ public static class RpcWorkerConstants
8181
public const string DotNetCoreDebugEngine = ".NETCore";
8282
public const string DotNetFrameworkDebugEngine = ".NETFramework";
8383
public const string DotNetFramework = "Framework";
84+
85+
public const string WorkerIndexingEnabled = "WORKER_INDEXING_ENABLED";
86+
public const string WorkerIndexingDisabledApps = "WORKER_INDEXING_DISABLED_APPS";
8487
}
8588
}

test/WebJobs.Script.Tests.Integration/Management/FunctionsSyncManagerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public FunctionsSyncManagerTests()
140140
_hostNameProvider = new HostNameProvider(_mockEnvironment.Object);
141141

142142
var functionMetadataProvider = new HostFunctionMetadataProvider(optionsMonitor, NullLogger<HostFunctionMetadataProvider>.Instance, new TestMetricsLogger());
143-
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, functionMetadataProvider);
143+
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, functionMetadataProvider, new OptionsWrapper<FunctionsHostingConfigOptions>(new FunctionsHostingConfigOptions()));
144144
var functionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper<ScriptJobHostOptions>(jobHostOptions), defaultProvider, null, new OptionsWrapper<HttpWorkerOptions>(new HttpWorkerOptions()), loggerFactory, new TestOptionsMonitor<LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()));
145145

146146
_scriptHostManager = new TestScriptHostService(configuration);

test/WebJobs.Script.Tests.Integration/TestFunctionHost.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Microsoft.AspNetCore.Hosting;
1616
using Microsoft.AspNetCore.TestHost;
1717
using Microsoft.Azure.WebJobs.Host.Executors;
18+
using Microsoft.Azure.WebJobs.Script.Config;
1819
using Microsoft.Azure.WebJobs.Script.ExtensionBundle;
1920
using Microsoft.Azure.WebJobs.Script.Models;
2021
using Microsoft.Azure.WebJobs.Script.WebHost;
@@ -477,7 +478,7 @@ private FunctionMetadataManager GetMetadataManager(IOptionsMonitor<ScriptApplica
477478
var managerServiceProvider = manager as IServiceProvider;
478479

479480
var metadataProvider = new HostFunctionMetadataProvider(optionsMonitor, NullLogger<HostFunctionMetadataProvider>.Instance, new TestMetricsLogger());
480-
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, metadataProvider);
481+
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, metadataProvider, new OptionsWrapper<FunctionsHostingConfigOptions>(new FunctionsHostingConfigOptions()));
481482
var metadataManager = new FunctionMetadataManager(managerServiceProvider.GetService<IOptions<ScriptJobHostOptions>>(), defaultProvider,
482483
managerServiceProvider.GetService<IOptions<HttpWorkerOptions>>(), manager, factory, new TestOptionsMonitor<LanguageWorkerOptions>(workerOptions), environment);
483484

test/WebJobs.Script.Tests.Integration/WebHostEndToEnd/ProxyEndToEndTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ public TestFixture()
414414
};
415415

416416
var hostProvider = new HostFunctionMetadataProvider(optionsMonitor, NullLogger<HostFunctionMetadataProvider>.Instance, new TestMetricsLogger());
417-
var provider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, hostProvider);
417+
var provider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, hostProvider, new OptionsWrapper<FunctionsHostingConfigOptions>(new FunctionsHostingConfigOptions()));
418418

419419
TestHost = new TestFunctionHost(HostOptions.ScriptPath, HostOptions.LogPath,
420420
configureScriptHostServices: services =>

test/WebJobs.Script.Tests.Shared/TestHostBuilderExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.Azure.WebJobs;
77
using Microsoft.Azure.WebJobs.Host.Storage;
88
using Microsoft.Azure.WebJobs.Script;
9+
using Microsoft.Azure.WebJobs.Script.Config;
910
using Microsoft.Azure.WebJobs.Script.Description;
1011
using Microsoft.Azure.WebJobs.Script.Diagnostics;
1112
using Microsoft.Azure.WebJobs.Script.Grpc;
@@ -101,7 +102,8 @@ private static IServiceCollection AddFunctionMetadataManager(this IServiceCollec
101102
var optionsMonitor = new OptionsMonitor<ScriptApplicationHostOptions>(factory, changeTokens, factory);
102103

103104
var metadataProvider = new HostFunctionMetadataProvider(optionsMonitor, NullLogger<HostFunctionMetadataProvider>.Instance, metricsLogger);
104-
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, metadataProvider);
105+
var hostingOptionsMonitor = TestHelpers.CreateOptionsMonitor(new FunctionsHostingConfigOptions());
106+
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, metadataProvider, new OptionsWrapper<FunctionsHostingConfigOptions>(new FunctionsHostingConfigOptions()));
105107
var metadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper<ScriptJobHostOptions>(new ScriptJobHostOptions()), defaultProvider, new List<IFunctionProvider>(), new OptionsWrapper<HttpWorkerOptions>(new HttpWorkerOptions()), new NullLoggerFactory(), new TestOptionsMonitor<LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));
106108
services.AddSingleton<IFunctionMetadataManager>(metadataManager);
107109
services.AddSingleton<IFunctionMetadataProvider>(defaultProvider);

test/WebJobs.Script.Tests/FunctionMetadataProviderTests.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.IO.Abstractions.TestingHelpers;
99
using System.Linq;
1010
using System.Threading.Tasks;
11+
using Microsoft.Azure.WebJobs.Script.Config;
1112
using Microsoft.Azure.WebJobs.Script.Description;
1213
using Microsoft.Azure.WebJobs.Script.Diagnostics;
1314
using Microsoft.Azure.WebJobs.Script.Tests.Workers.Rpc;
@@ -56,7 +57,7 @@ public void GetFunctionMetadataAsync_WorkerIndexing_HostFallback()
5657
environment.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, "node");
5758
environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, "EnableWorkerIndexing");
5859

59-
var defaultProvider = new FunctionMetadataProvider(_logger, _workerFunctionMetadataProvider.Object, _hostFunctionMetadataProvider.Object);
60+
var defaultProvider = new FunctionMetadataProvider(_logger, _workerFunctionMetadataProvider.Object, _hostFunctionMetadataProvider.Object, new OptionsWrapper<FunctionsHostingConfigOptions>(new FunctionsHostingConfigOptions()));
6061

6162
FunctionMetadataResult result = new FunctionMetadataResult(true, functionMetadataCollection.ToImmutableArray());
6263
_workerFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, false)).Returns(Task.FromResult(result));
@@ -91,8 +92,8 @@ public void GetFunctionMetadataAsync_HostIndexing()
9192
var environment = SystemEnvironment.Instance;
9293
environment.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, "node");
9394
environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, string.Empty);
94-
95-
var defaultProvider = new FunctionMetadataProvider(_logger, _workerFunctionMetadataProvider.Object, _hostFunctionMetadataProvider.Object);
95+
var optionsMonitor = TestHelpers.CreateOptionsMonitor(new FunctionsHostingConfigOptions());
96+
var defaultProvider = new FunctionMetadataProvider(_logger, _workerFunctionMetadataProvider.Object, _hostFunctionMetadataProvider.Object, new OptionsWrapper<FunctionsHostingConfigOptions>(new FunctionsHostingConfigOptions()));
9697

9798
FunctionMetadataResult result = new FunctionMetadataResult(true, functionMetadataCollection.ToImmutableArray());
9899
_hostFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, environment, false)).Returns(Task.FromResult(functionMetadataCollection.ToImmutableArray()));

0 commit comments

Comments
 (0)