Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -970,7 +970,8 @@ private void SetRequestTracingOptions()
IsKeyVaultConfigured = _options.IsKeyVaultConfigured,
IsKeyVaultRefreshConfigured = _options.IsKeyVaultRefreshConfigured,
ReplicaCount = _options.Endpoints?.Count() - 1 ?? _options.ConnectionStrings?.Count() - 1 ?? 0,
FeatureFlagTracing = _options.FeatureFlagTracing
FeatureFlagTracing = _options.FeatureFlagTracing,
IsLoadBalancingEnabled = _options.LoadBalancingEnabled
};
}

Expand Down Expand Up @@ -1005,6 +1006,11 @@ private async Task<T> ExecuteWithFailOverPolicyAsync<T>(
Func<ConfigurationClient, Task<T>> funcToExecute,
CancellationToken cancellationToken = default)
{
if (_requestTracingEnabled && _requestTracingOptions != null)
{
_requestTracingOptions.IsFailoverRequest = false;
}

if (_options.LoadBalancingEnabled && _lastSuccessfulEndpoint != null && clients.Count() > 1)
{
int nextClientIndex = 0;
Expand Down Expand Up @@ -1107,6 +1113,11 @@ private async Task<T> ExecuteWithFailOverPolicyAsync<T>(
}

previousEndpoint = currentEndpoint;

if (_requestTracingEnabled && _requestTracingOptions != null)
{
_requestTracingOptions.IsFailoverRequest = true;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,28 @@ internal class RequestTracingConstants

public const string RequestTypeKey = "RequestType";
public const string HostTypeKey = "Host";
public const string FilterTypeKey = "Filter";
public const string EnvironmentKey = "Env";
public const string FeatureManagementVersionKey = "FMVer";
public const string FeatureManagementAspNetCoreVersionKey = "FMANCVer";
public const string DevEnvironmentValue = "Dev";
public const string KeyVaultConfiguredTag = "UsesKeyVault";
public const string KeyVaultRefreshConfiguredTag = "RefreshesKeyVault";
public const string ReplicaCountKey = "ReplicaCount";
public const string FeaturesKey = "Features";
public const string LoadBalancingEnabledTag = "LB";
public const string SignalRUsedTag = "SignalR";
public const string FailoverRequestTag = "Failover";

public const string FeatureFlagFilterTypeKey = "Filter";
public const string CustomFilter = "CSTM";
public const string PercentageFilter = "PRCNT";
public const string TimeWindowFilter = "TIME";
public const string TargetingFilter = "TRGT";
public const string FeatureFlagFeaturesKey = "FFFeatures";
public const string FeatureFlagUsesTelemetryTag = "Telemetry";
public const string FeatureFlagUsesSeedTag = "Seed";
public const string FeatureFlagMaxVariantsKey = "MaxVariants";
public const string FeatureFlagUsesVariantConfigurationReferenceTag = "ConfigRef";
public const string FeatureFlagFeaturesKey = "FFFeatures";
public const string SignalRUsedTag = "UsesSignalR";

public const string DiagnosticHeaderActivityName = "Azure.CustomDiagnosticHeaders";
public const string CorrelationContextHeader = "Correlation-Context";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,6 @@ namespace Microsoft.Extensions.Configuration.AzureAppConfiguration.FeatureManage
/// </summary>
internal class FeatureFlagTracing
{
private const string CustomFilter = "CSTM";
private const string PercentageFilter = "PRCNT";
private const string TimeWindowFilter = "TIME";
private const string TargetingFilter = "TRGT";

// Built-in Feature Filter Names
private readonly List<string> PercentageFilterNames = new List<string> { "Percentage", "Microsoft.Percentage", "PercentageFilter", "Microsoft.PercentageFilter" };
private readonly List<string> TimeWindowFilterNames = new List<string> { "TimeWindow", "Microsoft.TimeWindow", "TimeWindowFilter", "Microsoft.TimeWindowFilter" };
Expand Down Expand Up @@ -98,7 +93,7 @@ public string CreateFiltersString()

if (UsesCustomFilter)
{
sb.Append(CustomFilter);
sb.Append(RequestTracingConstants.CustomFilter);
}

if (UsesPercentageFilter)
Expand All @@ -108,7 +103,7 @@ public string CreateFiltersString()
sb.Append(RequestTracingConstants.Delimiter);
}

sb.Append(PercentageFilter);
sb.Append(RequestTracingConstants.PercentageFilter);
}

if (UsesTimeWindowFilter)
Expand All @@ -118,7 +113,7 @@ public string CreateFiltersString()
sb.Append(RequestTracingConstants.Delimiter);
}

sb.Append(TimeWindowFilter);
sb.Append(RequestTracingConstants.TimeWindowFilter);
}

if (UsesTargetingFilter)
Expand All @@ -128,14 +123,23 @@ public string CreateFiltersString()
sb.Append(RequestTracingConstants.Delimiter);
}

sb.Append(TargetingFilter);
sb.Append(RequestTracingConstants.TargetingFilter);
}

return sb.ToString();
}

/// <summary>
/// Returns a formatted string containing code names, indicating which tracing features are used by feature flags.
/// </summary>
/// <returns>Formatted string like: "Seed+ConfigRef+Telemetry". If no tracing features are used, empty string will be returned.</returns>
public string CreateFeaturesString()
{
if (!UsesAnyTracingFeature())
{
return string.Empty;
}

var sb = new StringBuilder();

if (UsesSeed)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT license.
//
using Microsoft.Extensions.Configuration.AzureAppConfiguration.FeatureManagement;
using System.Text;

namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
{
Expand Down Expand Up @@ -51,5 +52,55 @@ internal class RequestTracingOptions
/// Flag to indicate whether Microsoft.AspNetCore.SignalR assembly is present in the application.
/// </summary>
public bool IsSignalRUsed { get; set; } = false;

/// <summary>
/// Flag to indicate whether load balancing is enabled.
/// </summary>
public bool IsLoadBalancingEnabled { get; set; } = false;

/// <summary>
/// Flag to indicate whether the request is triggered by a failover.
/// </summary>
public bool IsFailoverRequest { get; set; } = false;

/// <summary>
/// Checks whether any tracing feature is used.
/// </summary>
/// <returns>True if any tracing feature is used, otherwise false.</returns>
public bool UsesAnyTracingFeature()
{
return IsLoadBalancingEnabled || IsSignalRUsed;
}

/// <summary>
/// Returns a formatted string containing code names, indicating which tracing features are used by the application.
/// </summary>
/// <returns>Formatted string like: "LB+SignalR". If no tracing features are used, empty string will be returned.</returns>
public string CreateFeaturesString()
{
if (!UsesAnyTracingFeature())
{
return string.Empty;
}

var sb = new StringBuilder();

if (IsLoadBalancingEnabled)
{
sb.Append(RequestTracingConstants.LoadBalancingEnabledTag);
}

if (IsSignalRUsed)
{
if (sb.Length > 0)
{
sb.Append(RequestTracingConstants.Delimiter);
}

sb.Append(RequestTracingConstants.SignalRUsedTag);
}

return sb.ToString();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ private static string CreateCorrelationContextHeader(RequestType requestType, Re

if (requestTracingOptions.FeatureFlagTracing.UsesAnyFeatureFilter())
{
correlationContextKeyValues.Add(new KeyValuePair<string, string>(RequestTracingConstants.FilterTypeKey, requestTracingOptions.FeatureFlagTracing.CreateFiltersString()));
correlationContextKeyValues.Add(new KeyValuePair<string, string>(RequestTracingConstants.FeatureFlagFilterTypeKey, requestTracingOptions.FeatureFlagTracing.CreateFiltersString()));
}

if (requestTracingOptions.FeatureFlagTracing.MaxVariants > 0)
Expand All @@ -181,6 +181,11 @@ private static string CreateCorrelationContextHeader(RequestType requestType, Re
correlationContextKeyValues.Add(new KeyValuePair<string, string>(RequestTracingConstants.FeatureManagementAspNetCoreVersionKey, requestTracingOptions.FeatureManagementAspNetCoreVersion));
}

if (requestTracingOptions.UsesAnyTracingFeature())
{
correlationContextKeyValues.Add(new KeyValuePair<string, string>(RequestTracingConstants.FeaturesKey, requestTracingOptions.CreateFeaturesString()));
}

if (requestTracingOptions.IsKeyVaultConfigured)
{
correlationContextTags.Add(RequestTracingConstants.KeyVaultConfiguredTag);
Expand All @@ -191,9 +196,9 @@ private static string CreateCorrelationContextHeader(RequestType requestType, Re
correlationContextTags.Add(RequestTracingConstants.KeyVaultRefreshConfiguredTag);
}

if (requestTracingOptions.IsSignalRUsed)
if (requestTracingOptions.IsFailoverRequest)
{
correlationContextTags.Add(RequestTracingConstants.SignalRUsedTag);
correlationContextTags.Add(RequestTracingConstants.FailoverRequestTag);
}

var sb = new StringBuilder();
Expand Down