Esempio n. 1
0
        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);
                }
            }
        }