Skip to content

Commit d294da4

Browse files
committed
Merge branch 'main' of https://github.com/Azure/AppConfiguration-DotnetProvider into ajusupovic/tag-filtering
2 parents 4397a8e + bf8b06b commit d294da4

20 files changed

+300
-84
lines changed

src/Microsoft.Azure.AppConfiguration.AspNetCore/Microsoft.Azure.AppConfiguration.AspNetCore.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<!-- Nuget Package Version Settings -->
2222

2323
<PropertyGroup>
24-
<OfficialVersion>8.2.0-preview</OfficialVersion>
24+
<OfficialVersion>8.1.2</OfficialVersion>
2525
</PropertyGroup>
2626

2727
<PropertyGroup Condition="'$(CDP_PATCH_NUMBER)'!='' AND '$(CDP_BUILD_TYPE)'=='Official'">

src/Microsoft.Azure.AppConfiguration.Functions.Worker/Microsoft.Azure.AppConfiguration.Functions.Worker.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<!-- Nuget Package Version Settings -->
2525

2626
<PropertyGroup>
27-
<OfficialVersion>8.2.0-preview</OfficialVersion>
27+
<OfficialVersion>8.1.2</OfficialVersion>
2828
</PropertyGroup>
2929

3030
<PropertyGroup Condition="'$(CDP_PATCH_NUMBER)'!='' AND '$(CDP_BUILD_TYPE)'=='Official'">

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//
44
using Microsoft.Extensions.Configuration.AzureAppConfiguration;
55
using Microsoft.Extensions.DependencyInjection;
6+
using Microsoft.Extensions.DependencyInjection.Extensions;
67
using System;
78
using System.Collections.Generic;
89
using System.Security;
@@ -99,11 +100,11 @@ public static IServiceCollection AddAzureAppConfiguration(this IServiceCollectio
99100
if (!_isProviderDisabled)
100101
{
101102
services.AddLogging();
102-
services.AddSingleton<IConfigurationRefresherProvider, AzureAppConfigurationRefresherProvider>();
103+
services.TryAddSingleton<IConfigurationRefresherProvider, AzureAppConfigurationRefresherProvider>();
103104
}
104105
else
105106
{
106-
services.AddSingleton<IConfigurationRefresherProvider, EmptyConfigurationRefresherProvider>();
107+
services.TryAddSingleton<IConfigurationRefresherProvider, EmptyConfigurationRefresherProvider>();
107108
}
108109

109110
return services;

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the MIT license.
33
//
44
using Azure.Core;
5-
using Azure.Core.Pipeline;
65
using Azure.Data.AppConfiguration;
76
using Microsoft.Extensions.Azure;
87
using Microsoft.Extensions.Configuration.AzureAppConfiguration.AzureKeyVault;
@@ -12,7 +11,6 @@
1211
using System;
1312
using System.Collections.Generic;
1413
using System.Linq;
15-
using System.Net.Http;
1614
using System.Threading.Tasks;
1715

1816
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
@@ -25,7 +23,6 @@ public class AzureAppConfigurationOptions
2523
{
2624
private const int MaxRetries = 2;
2725
private static readonly TimeSpan MaxRetryDelay = TimeSpan.FromMinutes(1);
28-
private static readonly TimeSpan NetworkTimeout = TimeSpan.FromSeconds(10);
2926
private static readonly KeyValueSelector DefaultQuery = new KeyValueSelector { KeyFilter = KeyFilter.Any, LabelFilter = LabelFilter.Null };
3027

3128
private List<KeyValueWatcher> _individualKvWatchers = new List<KeyValueWatcher>();
@@ -142,7 +139,7 @@ internal IEnumerable<IKeyValueAdapter> Adapters
142139
internal bool IsKeyVaultRefreshConfigured { get; private set; } = false;
143140

144141
/// <summary>
145-
/// Indicates all types of feature filters used by the application.
142+
/// Indicates all feature flag features used by the application.
146143
/// </summary>
147144
internal FeatureFlagTracing FeatureFlagTracing { get; set; } = new FeatureFlagTracing();
148145

@@ -550,10 +547,6 @@ private static ConfigurationClientOptions GetDefaultClientOptions()
550547
clientOptions.Retry.MaxDelay = MaxRetryDelay;
551548
clientOptions.Retry.Mode = RetryMode.Exponential;
552549
clientOptions.AddPolicy(new UserAgentHeaderPolicy(), HttpPipelinePosition.PerCall);
553-
clientOptions.Transport = new HttpClientTransport(new HttpClient()
554-
{
555-
Timeout = NetworkTimeout
556-
});
557550

558551
return clientOptions;
559552
}

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
2323
{
2424
internal class AzureAppConfigurationProvider : ConfigurationProvider, IConfigurationRefresher, IDisposable
2525
{
26+
private readonly ActivitySource _activitySource = new ActivitySource(ActivityNames.AzureAppConfigurationActivitySource);
2627
private bool _optional;
2728
private bool _isInitialLoadComplete = false;
2829
private bool _isAssemblyInspected;
@@ -158,7 +159,7 @@ public AzureAppConfigurationProvider(IConfigurationClientManager configClientMan
158159
public override void Load()
159160
{
160161
var watch = Stopwatch.StartNew();
161-
162+
using Activity activity = _activitySource.StartActivity(ActivityNames.Load);
162163
try
163164
{
164165
using var startupCancellationTokenSource = new CancellationTokenSource(_options.Startup.Timeout);
@@ -258,6 +259,7 @@ public async Task RefreshAsync(CancellationToken cancellationToken)
258259
return;
259260
}
260261

262+
using Activity activity = _activitySource.StartActivity(ActivityNames.Refresh);
261263
// Check if initial configuration load had failed
262264
if (_mappedData == null)
263265
{
@@ -598,9 +600,21 @@ private async Task<Dictionary<string, string>> PrepareData(Dictionary<string, Co
598600
// Reset old feature flag tracing in order to track the information present in the current response from server.
599601
_options.FeatureFlagTracing.ResetFeatureFlagTracing();
600602

603+
// Reset old request tracing values for content type
604+
if (_requestTracingEnabled && _requestTracingOptions != null)
605+
{
606+
_requestTracingOptions.ResetAiConfigurationTracing();
607+
}
608+
601609
foreach (KeyValuePair<string, ConfigurationSetting> kvp in data)
602610
{
603611
IEnumerable<KeyValuePair<string, string>> keyValuePairs = null;
612+
613+
if (_requestTracingEnabled && _requestTracingOptions != null)
614+
{
615+
_requestTracingOptions.UpdateAiConfigurationTracing(kvp.Value.ContentType);
616+
}
617+
604618
keyValuePairs = await ProcessAdapters(kvp.Value, cancellationToken).ConfigureAwait(false);
605619

606620
foreach (KeyValuePair<string, string> kv in keyValuePairs)
@@ -637,7 +651,7 @@ private async Task LoadAsync(bool ignoreFailures, CancellationToken cancellation
637651
{
638652
IEnumerable<ConfigurationClient> clients = _configClientManager.GetClients();
639653

640-
if (_requestTracingOptions != null)
654+
if (_requestTracingEnabled && _requestTracingOptions != null)
641655
{
642656
_requestTracingOptions.ReplicaCount = clients.Count() - 1;
643657
}
@@ -1218,13 +1232,6 @@ await ExecuteWithFailOverPolicyAsync<object>(clients, async (client) =>
12181232

12191233
private bool IsFailOverable(AggregateException ex)
12201234
{
1221-
TaskCanceledException tce = ex.InnerExceptions?.LastOrDefault(e => e is TaskCanceledException) as TaskCanceledException;
1222-
1223-
if (tce != null && tce.InnerException is TimeoutException)
1224-
{
1225-
return true;
1226-
}
1227-
12281235
RequestFailedException rfe = ex.InnerExceptions?.LastOrDefault(e => e is RequestFailedException) as RequestFailedException;
12291236

12301237
return rfe != null ? IsFailOverable(rfe) : false;
@@ -1410,6 +1417,7 @@ private async Task ProcessKeyValueChangesAsync(
14101417
public void Dispose()
14111418
{
14121419
(_configClientManager as ConfigurationClientManager)?.Dispose();
1420+
_activitySource.Dispose();
14131421
}
14141422
}
14151423
}

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

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,38 @@ internal class AzureAppConfigurationRefresherProvider : IConfigurationRefresherP
1313
{
1414
private static readonly PropertyInfo _propertyInfo = typeof(ChainedConfigurationProvider).GetProperty("Configuration", BindingFlags.Public | BindingFlags.Instance);
1515

16-
public IEnumerable<IConfigurationRefresher> Refreshers { get; }
16+
private readonly IConfiguration _configuration;
17+
private readonly ILoggerFactory _loggerFactory;
18+
private IEnumerable<IConfigurationRefresher> _refreshers;
19+
private bool _rediscoveredRefreshers = false;
1720

18-
public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILoggerFactory _loggerFactory)
21+
public IEnumerable<IConfigurationRefresher> Refreshers
1922
{
20-
var configurationRoot = configuration as IConfigurationRoot;
23+
get
24+
{
25+
// Ensure latest refreshers are discovered if the configuration has changed since the constructor was called
26+
if (!_rediscoveredRefreshers)
27+
{
28+
_refreshers = DiscoverRefreshers();
29+
30+
_rediscoveredRefreshers = true;
31+
}
32+
33+
return _refreshers;
34+
}
35+
}
36+
37+
public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILoggerFactory loggerFactory)
38+
{
39+
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
40+
_loggerFactory = loggerFactory;
41+
42+
_refreshers = DiscoverRefreshers();
43+
}
44+
45+
private IEnumerable<IConfigurationRefresher> DiscoverRefreshers()
46+
{
47+
var configurationRoot = _configuration as IConfigurationRoot;
2148
var refreshers = new List<IConfigurationRefresher>();
2249

2350
FindRefreshers(configurationRoot, _loggerFactory, refreshers);
@@ -27,7 +54,7 @@ public AzureAppConfigurationRefresherProvider(IConfiguration configuration, ILog
2754
throw new InvalidOperationException("Unable to access the Azure App Configuration provider. Please ensure that it has been configured correctly.");
2855
}
2956

30-
Refreshers = refreshers;
57+
return refreshers;
3158
}
3259

3360
private void FindRefreshers(IConfigurationRoot configurationRoot, ILoggerFactory loggerFactory, List<IConfigurationRefresher> refreshers)

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureKeyVaultReference/AzureKeyVaultKeyValueAdapter.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
using Azure;
55
using Azure.Data.AppConfiguration;
66
using Azure.Security.KeyVault.Secrets;
7+
using Microsoft.Extensions.Configuration.AzureAppConfiguration.Extensions;
8+
using Microsoft.Extensions.Configuration.AzureAppConfiguration.FeatureManagement;
79
using System;
810
using System.Collections.Generic;
911
using System.Linq;
12+
using System.Net.Mime;
1013
using System.Text.Json;
1114
using System.Threading;
1215
using System.Threading.Tasks;
@@ -72,8 +75,15 @@ KeyVaultReferenceException CreateKeyVaultReferenceException(string message, Conf
7275

7376
public bool CanProcess(ConfigurationSetting setting)
7477
{
75-
string contentType = setting?.ContentType?.Split(';')[0].Trim();
76-
return string.Equals(contentType, KeyVaultConstants.ContentType);
78+
if (setting == null ||
79+
string.IsNullOrWhiteSpace(setting.Value) ||
80+
string.IsNullOrWhiteSpace(setting.ContentType))
81+
{
82+
return false;
83+
}
84+
85+
return setting.ContentType.TryParseContentType(out ContentType contentType)
86+
&& contentType.IsKeyVaultReference();
7787
}
7888

7989
public void OnChangeDetected(ConfigurationSetting setting = null)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
using Azure.Data.AppConfiguration;
2-
using Azure;
1+
using Azure;
2+
using Azure.Data.AppConfiguration;
33
using System.Collections.Generic;
44

55
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
//
4+
5+
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
6+
{
7+
internal static class ActivityNames
8+
{
9+
public const string AzureAppConfigurationActivitySource = "Microsoft.Extensions.Configuration.AzureAppConfiguration";
10+
public const string Load = "Load";
11+
public const string Refresh = "Refresh";
12+
}
13+
}

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Constants/RequestTracingConstants.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ internal class RequestTracingConstants
3131
public const string ReplicaCountKey = "ReplicaCount";
3232
public const string FeaturesKey = "Features";
3333
public const string LoadBalancingEnabledTag = "LB";
34+
public const string AIConfigurationTag = "AI";
35+
public const string AIChatCompletionConfigurationTag = "AICC";
36+
3437
public const string SignalRUsedTag = "SignalR";
3538
public const string FailoverRequestTag = "Failover";
3639
public const string PushRefreshTag = "PushRefresh";
@@ -54,5 +57,8 @@ internal class RequestTracingConstants
5457
public const string SignalRAssemblyName = "Microsoft.AspNetCore.SignalR";
5558

5659
public const string Delimiter = "+";
60+
61+
public const string AIMimeProfile = "https://azconfig.io/mime-profiles/ai";
62+
public const string AIChatCompletionMimeProfile = "https://azconfig.io/mime-profiles/ai/chat-completion";
5763
}
5864
}

0 commit comments

Comments
 (0)