Skip to content

Commit 34576ef

Browse files
Merge pull request #700 from Azure/zhiyuanliang/dummy-health-check
Add AlwaysHealthy health check when provider is disabled
1 parent 3d3c4d7 commit 34576ef

File tree

10 files changed

+72
-42
lines changed

10 files changed

+72
-42
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
//
4+
using Microsoft.Extensions.Diagnostics.HealthChecks;
5+
using System.Threading.Tasks;
6+
using System.Threading;
7+
8+
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
9+
{
10+
internal sealed class AlwaysHealthyHealthCheck : IHealthCheck
11+
{
12+
private static readonly Task<HealthCheckResult> _healthyResult = Task.FromResult(HealthCheckResult.Healthy());
13+
14+
public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
15+
{
16+
return _healthyResult;
17+
}
18+
}
19+
}

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationExtensions.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Microsoft.Extensions.DependencyInjection.Extensions;
88
using System;
99
using System.Collections.Generic;
10-
using System.Security;
1110

1211
namespace Microsoft.Extensions.Configuration
1312
{
@@ -16,19 +15,7 @@ namespace Microsoft.Extensions.Configuration
1615
/// </summary>
1716
public static class AzureAppConfigurationExtensions
1817
{
19-
private const string DisableProviderEnvironmentVariable = "AZURE_APP_CONFIGURATION_PROVIDER_DISABLED";
20-
private static readonly bool _isProviderDisabled = IsProviderDisabled();
21-
22-
private static bool IsProviderDisabled()
23-
{
24-
try
25-
{
26-
return bool.TryParse(Environment.GetEnvironmentVariable(DisableProviderEnvironmentVariable), out bool disabled) ? disabled : false;
27-
}
28-
catch (SecurityException) { }
29-
30-
return false;
31-
}
18+
private static readonly bool _isProviderDisabled = EnvironmentVariableHelper.GetBoolOrDefault(EnvironmentVariableNames.AppConfigurationProviderDisabled);
3219

3320
/// <summary>
3421
/// Adds key-value data from an Azure App Configuration store to a configuration builder using its connection string.

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationHealthCheck.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
1313
{
14-
internal class AzureAppConfigurationHealthCheck : IHealthCheck
14+
internal sealed class AzureAppConfigurationHealthCheck : IHealthCheck
1515
{
1616
private static readonly PropertyInfo _propertyInfo = typeof(ChainedConfigurationProvider).GetProperty("Configuration", BindingFlags.Public | BindingFlags.Instance);
1717
private readonly IEnumerable<IHealthCheck> _healthChecks;

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationHealthChecksBuilderExtensions.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ namespace Microsoft.Extensions.DependencyInjection
1414
/// </summary>
1515
public static class AzureAppConfigurationHealthChecksBuilderExtensions
1616
{
17+
private static readonly bool _isProviderDisabled = EnvironmentVariableHelper.GetBoolOrDefault(EnvironmentVariableNames.AppConfigurationProviderDisabled);
18+
1719
/// <summary>
1820
/// Add a health check for Azure App Configuration to given <paramref name="builder"/>.
1921
/// </summary>
@@ -32,10 +34,20 @@ public static IHealthChecksBuilder AddAzureAppConfiguration(
3234
IEnumerable<string> tags = default,
3335
TimeSpan? timeout = default)
3436
{
37+
IHealthCheck CreateHealthCheck(IServiceProvider sp)
38+
{
39+
if (_isProviderDisabled)
40+
{
41+
return new AlwaysHealthyHealthCheck();
42+
}
43+
44+
return new AzureAppConfigurationHealthCheck(
45+
factory?.Invoke(sp) ?? sp.GetRequiredService<IConfiguration>());
46+
}
47+
3548
return builder.Add(new HealthCheckRegistration(
3649
name ?? HealthCheckConstants.HealthCheckRegistrationName,
37-
sp => new AzureAppConfigurationHealthCheck(
38-
factory?.Invoke(sp) ?? sp.GetRequiredService<IConfiguration>()),
50+
CreateHealthCheck,
3951
failureStatus,
4052
tags,
4153
timeout));

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationProvider.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
using System.Net;
1717
using System.Net.Http;
1818
using System.Net.Sockets;
19-
using System.Security;
2019
using System.Text;
2120
using System.Threading;
2221
using System.Threading.Tasks;
@@ -143,15 +142,7 @@ public AzureAppConfigurationProvider(IConfigurationClientManager configClientMan
143142
MinRefreshInterval = RefreshConstants.DefaultRefreshInterval;
144143
}
145144

146-
// Enable request tracing if not opt-out
147-
string requestTracingDisabled = null;
148-
try
149-
{
150-
requestTracingDisabled = Environment.GetEnvironmentVariable(EnvironmentVariables.DisableRequestTracing);
151-
}
152-
catch (SecurityException) { }
153-
154-
_requestTracingEnabled = bool.TryParse(requestTracingDisabled, out bool tracingDisabled) ? !tracingDisabled : true;
145+
_requestTracingEnabled = !EnvironmentVariableHelper.GetBoolOrDefault(EnvironmentVariableNames.RequestTracingDisabled);
155146

156147
if (_requestTracingEnabled)
157148
{
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
//
4+
5+
using System;
6+
using System.Security;
7+
8+
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
9+
{
10+
internal static class EnvironmentVariableHelper
11+
{
12+
public static bool GetBoolOrDefault(string variableName)
13+
{
14+
try
15+
{
16+
return bool.TryParse(Environment.GetEnvironmentVariable(variableName), out bool disabled) ? disabled : false;
17+
}
18+
catch (SecurityException) { }
19+
20+
return false;
21+
}
22+
}
23+
}

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/EnvironmentVariables.cs renamed to src/Microsoft.Extensions.Configuration.AzureAppConfiguration/EnvironmentVariableNames.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,26 @@ namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
66
/// <summary>
77
/// Environment variables used to configure Azure App Configuration provider behavior.
88
/// </summary>
9-
internal static class EnvironmentVariables
9+
internal static class EnvironmentVariableNames
1010
{
1111
/// <summary>
1212
/// Environment variable to disable Feature Management schema compatibility.
1313
/// The value of this variable is a boolean string, e.g. "true" or "false".
1414
/// When set to "true", schema compatibility checks for feature flags are disabled,
1515
/// and all feature flags will be interpreted using the Microsoft Feature Flags schema.
1616
/// </summary>
17-
public const string DisableFmSchemaCompatibility = "AZURE_APP_CONFIGURATION_FM_SCHEMA_COMPATIBILITY_DISABLED";
17+
public const string FmSchemacompatibilityDisabled = "AZURE_APP_CONFIGURATION_FM_SCHEMA_COMPATIBILITY_DISABLED";
1818

1919
/// <summary>
2020
/// Environment variable to disable request tracing.
2121
/// The value of this variable is a boolean string, e.g. "true" or "false".
2222
/// </summary>
23-
public const string DisableRequestTracing = "AZURE_APP_CONFIGURATION_TRACING_DISABLED";
23+
public const string RequestTracingDisabled = "AZURE_APP_CONFIGURATION_TRACING_DISABLED";
24+
25+
/// <summary>
26+
/// Environment variable to disable Azure App Configuration provider.
27+
/// The value of this variable is a boolean string, e.g. "true" or "false".
28+
/// </summary>
29+
public const string AppConfigurationProviderDisabled = "AZURE_APP_CONFIGURATION_PROVIDER_DISABLED";
2430
}
2531
}

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,7 @@ public FeatureManagementKeyValueAdapter(FeatureFlagTracing featureFlagTracing)
2727
{
2828
_featureFlagTracing = featureFlagTracing ?? throw new ArgumentNullException(nameof(featureFlagTracing));
2929

30-
string fmSchemaCompatibilityDisabled = null;
31-
32-
try
33-
{
34-
fmSchemaCompatibilityDisabled = Environment.GetEnvironmentVariable(EnvironmentVariables.DisableFmSchemaCompatibility);
35-
}
36-
catch (SecurityException) { }
37-
38-
_fmSchemaCompatibilityDisabled = bool.TryParse(fmSchemaCompatibilityDisabled, out bool disabled) ? disabled : false;
30+
_fmSchemaCompatibilityDisabled = EnvironmentVariableHelper.GetBoolOrDefault(EnvironmentVariableNames.FmSchemacompatibilityDisabled);
3931
}
4032

4133
public Task<IEnumerable<KeyValuePair<string, string>>> ProcessKeyValue(ConfigurationSetting setting, Uri endpoint, Logger logger, CancellationToken cancellationToken)

tests/Tests.AzureAppConfiguration/Unit/FeatureManagementTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2309,7 +2309,7 @@ public void EnvironmentVariableForcesMicrosoftSchemaForAllFlags()
23092309
try
23102310
{
23112311
// Act - Set environment variable to force Microsoft schema
2312-
Environment.SetEnvironmentVariable(EnvironmentVariables.DisableFmSchemaCompatibility, "true");
2312+
Environment.SetEnvironmentVariable(EnvironmentVariableNames.FmSchemacompatibilityDisabled, "true");
23132313

23142314
var config = new ConfigurationBuilder()
23152315
.AddAzureAppConfiguration(options =>

tests/Tests.AzureAppConfiguration/Unit/Tests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public void TestTurnOffRequestTracing()
273273
var options = new AzureAppConfigurationOptions();
274274
options.ClientOptions.Transport = mockTransport;
275275

276-
Environment.SetEnvironmentVariable(EnvironmentVariables.DisableRequestTracing, "True");
276+
Environment.SetEnvironmentVariable(EnvironmentVariableNames.RequestTracingDisabled, "True");
277277

278278
var clientManager = TestHelpers.CreateMockedConfigurationClientManager(options);
279279
var config = new ConfigurationBuilder()
@@ -296,7 +296,7 @@ public void TestTurnOffRequestTracing()
296296
options.ClientOptions.Transport = mockTransport;
297297

298298
// Delete the request tracing environment variable
299-
Environment.SetEnvironmentVariable(EnvironmentVariables.DisableRequestTracing, null);
299+
Environment.SetEnvironmentVariable(EnvironmentVariableNames.RequestTracingDisabled, null);
300300
Environment.SetEnvironmentVariable(RequestTracingConstants.AzureFunctionEnvironmentVariable, "v1.0");
301301

302302
var clientManager1 = TestHelpers.CreateMockedConfigurationClientManager(options);

0 commit comments

Comments
 (0)