public void TestUserAgentHeader() { var response = new MockResponse(200); response.SetContent(SerializationHelpers.Serialize(_kvCollectionPageOne.ToArray(), TestHelpers.SerializeBatch)); var mockTransport = new MockTransport(response); var clientOptions = new ConfigurationClientOptions { Transport = mockTransport }; clientOptions.AddPolicy(new UserAgentHeaderPolicy(), HttpPipelinePosition.PerRetry); var config = new ConfigurationBuilder() .AddAzureAppConfiguration(options => { options.Client = new ConfigurationClient(_connectionString, clientOptions); options.Select("*", null); }) .Build(); MockRequest request = mockTransport.SingleRequest; string appUserAgent = TracingUtils.GenerateUserAgent("SdkUserAgent"); appUserAgent = appUserAgent.Replace("SdkUserAgent", ""); Assert.True(request.Headers.TryGetValue("User-Agent", out string userAgentHeader)); Assert.Contains(appUserAgent, userAgentHeader); Assert.NotEqual(appUserAgent.Length, userAgentHeader.Length); }
public static async Task <IEnumerable <KeyValueChange> > GetKeyValueChangeCollection(this ConfigurationClient client, IEnumerable <ConfigurationSetting> keyValues, GetKeyValueChangeCollectionOptions options, CancellationToken cancellationToken) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (keyValues == null) { keyValues = Enumerable.Empty <ConfigurationSetting>(); } if (options.KeyFilter == null) { options.KeyFilter = string.Empty; } if (keyValues.Any(k => string.IsNullOrEmpty(k.Key))) { throw new ArgumentNullException($"{nameof(keyValues)}[].{nameof(ConfigurationSetting.Key)}"); } if (keyValues.Any(k => !string.Equals(k.Label.NormalizeNull(), options.Label.NormalizeNull()))) { throw new ArgumentException("All key-values registered for refresh must use the same label.", $"{nameof(keyValues)}[].{nameof(ConfigurationSetting.Label)}"); } if (keyValues.Any(k => k.Label != null && k.Label.Contains("*"))) { throw new ArgumentException("The label filter cannot contain '*'", $"{nameof(options)}.{nameof(options.Label)}"); } var hasKeyValueCollectionChanged = false; var selector = new SettingSelector { KeyFilter = options.KeyFilter, LabelFilter = string.IsNullOrEmpty(options.Label) ? LabelFilter.Null : options.Label, Fields = SettingFields.ETag | SettingFields.Key }; // Dictionary of eTags that we write to and use for comparison var eTagMap = keyValues.ToDictionary(kv => kv.Key, kv => kv.ETag); // Fetch e-tags for prefixed key-values that can be used to detect changes await TracingUtils.CallWithRequestTracing(options.RequestTracingEnabled, RequestType.Watch, options.RequestTracingOptions, async() => { await foreach (ConfigurationSetting setting in client.GetConfigurationSettingsAsync(selector, cancellationToken).ConfigureAwait(false)) { if (!eTagMap.TryGetValue(setting.Key, out ETag etag) || !etag.Equals(setting.ETag)) { hasKeyValueCollectionChanged = true; break; } eTagMap.Remove(setting.Key); } }).ConfigureAwait(false);
public void TestUserAgentHeader() { var response = new MockResponse(200); response.SetContent(SerializationHelpers.Serialize(_kvCollectionPageOne.ToArray(), TestHelpers.SerializeBatch)); var mockTransport = new MockTransport(response); var clientOptions = new ConfigurationClientOptions { Transport = mockTransport }; clientOptions.AddPolicy(new UserAgentHeaderPolicy(), HttpPipelinePosition.PerRetry); var config = new ConfigurationBuilder() .AddAzureAppConfiguration(options => { options.Client = new ConfigurationClient(_connectionString, clientOptions); options.Select("*", null); }) .Build(); MockRequest request = mockTransport.SingleRequest; string appUserAgent = TracingUtils.GenerateUserAgent("SdkUserAgent"); // Validate the user agent format corresponds to informational version instead of assembly version // Informational version examples : 3.0.0 or 2.1.0-preview-010380001-1099 // Assembly version examples : 3.0.0.0 or 2.1.0.0 var nugetPackageVersionRegex = @"\d+\.\d+\.\d+(-preview-\d+-\d+)?"; Assert.Matches($@"Microsoft\.Extensions\.Configuration\.AzureAppConfiguration/{nugetPackageVersionRegex} SdkUserAgent", appUserAgent); appUserAgent = appUserAgent.Replace("SdkUserAgent", ""); Assert.True(request.Headers.TryGetValue("User-Agent", out string userAgentHeader)); Assert.Contains(appUserAgent, userAgentHeader); Assert.NotEqual(appUserAgent.Length, userAgentHeader.Length); }
public void Enrich(Activity activity, string eventName, object rawObject) { if (eventName.Equals("OnStartActivity")) { if (!(rawObject is HttpWebRequest request)) { return; } if (request.ContentLength > 0) { activity.SetTag(OpenTelemetryAttributes.GetAttributeHttpRequestHeader("content_length"), request.ContentLength); } foreach (var enrichHook in this._enrichHooks) { enrichHook.OnStart(activity, request); } } else if (eventName.Equals("OnStopActivity")) { if (!(rawObject is HttpWebResponse response)) { return; } if (response.ContentLength > 0) { activity.SetTag(OpenTelemetryAttributes.GetAttributeHttpResponseHeader("content_length"), response.ContentLength); } if (TracingUtils.IsErrorStatusCode((int)response.StatusCode)) { activity.SetTag("error", "true"); } foreach (var enrichHook in this._enrichHooks) { enrichHook.OnSuccessEnd(activity, response); } } else if (eventName.Equals("OnException")) { if (!(rawObject is WebException ex)) { return; } activity.SetTag("error", "true"); var statusCode = (ex.Response as HttpWebResponse)?.StatusCode; if (statusCode == null) { activity.SetTag(OpenTelemetryAttributes.AttributeHttpStatusCode, "-"); activity.SetTag(OpenTelemetryAttributes.AttributeHttpClientException, ex.Status.ToString()); } foreach (var enrichHook in this._enrichHooks) { enrichHook.OnError(activity, ex); } } }