Skip to content

Commit d551536

Browse files
Add failover & load balancing telemetry (#586)
* add failover telemetry * add load balancing enabled tracing * use Features=xxx+xxx pattern * revert change * add comment * update context string & move helper method to TracingUtil * add comments * update * revert change * add checks * remove unused package * fix typo --------- Co-authored-by: Amer Jusupovic <[email protected]>
1 parent c4d103f commit d551536

File tree

5 files changed

+95
-16
lines changed

5 files changed

+95
-16
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -970,7 +970,8 @@ private void SetRequestTracingOptions()
970970
IsKeyVaultConfigured = _options.IsKeyVaultConfigured,
971971
IsKeyVaultRefreshConfigured = _options.IsKeyVaultRefreshConfigured,
972972
ReplicaCount = _options.Endpoints?.Count() - 1 ?? _options.ConnectionStrings?.Count() - 1 ?? 0,
973-
FeatureFlagTracing = _options.FeatureFlagTracing
973+
FeatureFlagTracing = _options.FeatureFlagTracing,
974+
IsLoadBalancingEnabled = _options.LoadBalancingEnabled
974975
};
975976
}
976977

@@ -1005,6 +1006,11 @@ private async Task<T> ExecuteWithFailOverPolicyAsync<T>(
10051006
Func<ConfigurationClient, Task<T>> funcToExecute,
10061007
CancellationToken cancellationToken = default)
10071008
{
1009+
if (_requestTracingEnabled && _requestTracingOptions != null)
1010+
{
1011+
_requestTracingOptions.IsFailoverRequest = false;
1012+
}
1013+
10081014
if (_options.LoadBalancingEnabled && _lastSuccessfulEndpoint != null && clients.Count() > 1)
10091015
{
10101016
int nextClientIndex = 0;
@@ -1107,6 +1113,11 @@ private async Task<T> ExecuteWithFailOverPolicyAsync<T>(
11071113
}
11081114

11091115
previousEndpoint = currentEndpoint;
1116+
1117+
if (_requestTracingEnabled && _requestTracingOptions != null)
1118+
{
1119+
_requestTracingOptions.IsFailoverRequest = true;
1120+
}
11101121
}
11111122
}
11121123

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,28 @@ internal class RequestTracingConstants
2222

2323
public const string RequestTypeKey = "RequestType";
2424
public const string HostTypeKey = "Host";
25-
public const string FilterTypeKey = "Filter";
2625
public const string EnvironmentKey = "Env";
2726
public const string FeatureManagementVersionKey = "FMVer";
2827
public const string FeatureManagementAspNetCoreVersionKey = "FMANCVer";
2928
public const string DevEnvironmentValue = "Dev";
3029
public const string KeyVaultConfiguredTag = "UsesKeyVault";
3130
public const string KeyVaultRefreshConfiguredTag = "RefreshesKeyVault";
3231
public const string ReplicaCountKey = "ReplicaCount";
32+
public const string FeaturesKey = "Features";
33+
public const string LoadBalancingEnabledTag = "LB";
34+
public const string SignalRUsedTag = "SignalR";
35+
public const string FailoverRequestTag = "Failover";
36+
37+
public const string FeatureFlagFilterTypeKey = "Filter";
38+
public const string CustomFilter = "CSTM";
39+
public const string PercentageFilter = "PRCNT";
40+
public const string TimeWindowFilter = "TIME";
41+
public const string TargetingFilter = "TRGT";
42+
public const string FeatureFlagFeaturesKey = "FFFeatures";
3343
public const string FeatureFlagUsesTelemetryTag = "Telemetry";
3444
public const string FeatureFlagUsesSeedTag = "Seed";
3545
public const string FeatureFlagMaxVariantsKey = "MaxVariants";
3646
public const string FeatureFlagUsesVariantConfigurationReferenceTag = "ConfigRef";
37-
public const string FeatureFlagFeaturesKey = "FFFeatures";
38-
public const string SignalRUsedTag = "UsesSignalR";
3947

4048
public const string DiagnosticHeaderActivityName = "Azure.CustomDiagnosticHeaders";
4149
public const string CorrelationContextHeader = "Correlation-Context";

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ namespace Microsoft.Extensions.Configuration.AzureAppConfiguration.FeatureManage
1414
/// </summary>
1515
internal class FeatureFlagTracing
1616
{
17-
private const string CustomFilter = "CSTM";
18-
private const string PercentageFilter = "PRCNT";
19-
private const string TimeWindowFilter = "TIME";
20-
private const string TargetingFilter = "TRGT";
21-
2217
// Built-in Feature Filter Names
2318
private readonly List<string> PercentageFilterNames = new List<string> { "Percentage", "Microsoft.Percentage", "PercentageFilter", "Microsoft.PercentageFilter" };
2419
private readonly List<string> TimeWindowFilterNames = new List<string> { "TimeWindow", "Microsoft.TimeWindow", "TimeWindowFilter", "Microsoft.TimeWindowFilter" };
@@ -98,7 +93,7 @@ public string CreateFiltersString()
9893

9994
if (UsesCustomFilter)
10095
{
101-
sb.Append(CustomFilter);
96+
sb.Append(RequestTracingConstants.CustomFilter);
10297
}
10398

10499
if (UsesPercentageFilter)
@@ -108,7 +103,7 @@ public string CreateFiltersString()
108103
sb.Append(RequestTracingConstants.Delimiter);
109104
}
110105

111-
sb.Append(PercentageFilter);
106+
sb.Append(RequestTracingConstants.PercentageFilter);
112107
}
113108

114109
if (UsesTimeWindowFilter)
@@ -118,7 +113,7 @@ public string CreateFiltersString()
118113
sb.Append(RequestTracingConstants.Delimiter);
119114
}
120115

121-
sb.Append(TimeWindowFilter);
116+
sb.Append(RequestTracingConstants.TimeWindowFilter);
122117
}
123118

124119
if (UsesTargetingFilter)
@@ -128,14 +123,23 @@ public string CreateFiltersString()
128123
sb.Append(RequestTracingConstants.Delimiter);
129124
}
130125

131-
sb.Append(TargetingFilter);
126+
sb.Append(RequestTracingConstants.TargetingFilter);
132127
}
133128

134129
return sb.ToString();
135130
}
136131

132+
/// <summary>
133+
/// Returns a formatted string containing code names, indicating which tracing features are used by feature flags.
134+
/// </summary>
135+
/// <returns>Formatted string like: "Seed+ConfigRef+Telemetry". If no tracing features are used, empty string will be returned.</returns>
137136
public string CreateFeaturesString()
138137
{
138+
if (!UsesAnyTracingFeature())
139+
{
140+
return string.Empty;
141+
}
142+
139143
var sb = new StringBuilder();
140144

141145
if (UsesSeed)

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

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT license.
33
//
44
using Microsoft.Extensions.Configuration.AzureAppConfiguration.FeatureManagement;
5+
using System.Text;
56

67
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
78
{
@@ -51,5 +52,55 @@ internal class RequestTracingOptions
5152
/// Flag to indicate whether Microsoft.AspNetCore.SignalR assembly is present in the application.
5253
/// </summary>
5354
public bool IsSignalRUsed { get; set; } = false;
55+
56+
/// <summary>
57+
/// Flag to indicate whether load balancing is enabled.
58+
/// </summary>
59+
public bool IsLoadBalancingEnabled { get; set; } = false;
60+
61+
/// <summary>
62+
/// Flag to indicate whether the request is triggered by a failover.
63+
/// </summary>
64+
public bool IsFailoverRequest { get; set; } = false;
65+
66+
/// <summary>
67+
/// Checks whether any tracing feature is used.
68+
/// </summary>
69+
/// <returns>True if any tracing feature is used, otherwise false.</returns>
70+
public bool UsesAnyTracingFeature()
71+
{
72+
return IsLoadBalancingEnabled || IsSignalRUsed;
73+
}
74+
75+
/// <summary>
76+
/// Returns a formatted string containing code names, indicating which tracing features are used by the application.
77+
/// </summary>
78+
/// <returns>Formatted string like: "LB+SignalR". If no tracing features are used, empty string will be returned.</returns>
79+
public string CreateFeaturesString()
80+
{
81+
if (!UsesAnyTracingFeature())
82+
{
83+
return string.Empty;
84+
}
85+
86+
var sb = new StringBuilder();
87+
88+
if (IsLoadBalancingEnabled)
89+
{
90+
sb.Append(RequestTracingConstants.LoadBalancingEnabledTag);
91+
}
92+
93+
if (IsSignalRUsed)
94+
{
95+
if (sb.Length > 0)
96+
{
97+
sb.Append(RequestTracingConstants.Delimiter);
98+
}
99+
100+
sb.Append(RequestTracingConstants.SignalRUsedTag);
101+
}
102+
103+
return sb.ToString();
104+
}
54105
}
55106
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private static string CreateCorrelationContextHeader(RequestType requestType, Re
158158

159159
if (requestTracingOptions.FeatureFlagTracing.UsesAnyFeatureFilter())
160160
{
161-
correlationContextKeyValues.Add(new KeyValuePair<string, string>(RequestTracingConstants.FilterTypeKey, requestTracingOptions.FeatureFlagTracing.CreateFiltersString()));
161+
correlationContextKeyValues.Add(new KeyValuePair<string, string>(RequestTracingConstants.FeatureFlagFilterTypeKey, requestTracingOptions.FeatureFlagTracing.CreateFiltersString()));
162162
}
163163

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

184+
if (requestTracingOptions.UsesAnyTracingFeature())
185+
{
186+
correlationContextKeyValues.Add(new KeyValuePair<string, string>(RequestTracingConstants.FeaturesKey, requestTracingOptions.CreateFeaturesString()));
187+
}
188+
184189
if (requestTracingOptions.IsKeyVaultConfigured)
185190
{
186191
correlationContextTags.Add(RequestTracingConstants.KeyVaultConfiguredTag);
@@ -191,9 +196,9 @@ private static string CreateCorrelationContextHeader(RequestType requestType, Re
191196
correlationContextTags.Add(RequestTracingConstants.KeyVaultRefreshConfiguredTag);
192197
}
193198

194-
if (requestTracingOptions.IsSignalRUsed)
199+
if (requestTracingOptions.IsFailoverRequest)
195200
{
196-
correlationContextTags.Add(RequestTracingConstants.SignalRUsedTag);
201+
correlationContextTags.Add(RequestTracingConstants.FailoverRequestTag);
197202
}
198203

199204
var sb = new StringBuilder();

0 commit comments

Comments
 (0)