Exemple #1
0
        public void Extract_InvalidSamplingPriority(string samplingPriority)
        {
            // HttpRequestHeaders setup
            var request = new HttpRequestMessage();
            var headers = new ReflectionHttpHeadersCollection(request.Headers);

            const ulong  traceId = 9;
            const ulong  spanId  = 7;
            const string origin  = "synthetics";

            InjectContext(
                headers,
                traceId.ToString(CultureInfo.InvariantCulture),
                spanId.ToString(CultureInfo.InvariantCulture),
                samplingPriority,
                origin);

            var resultContext = SpanContextPropagator.Instance.Extract(headers);

            Assert.NotNull(resultContext);
            Assert.Equal(traceId, resultContext.TraceId);
            Assert.Equal(spanId, resultContext.SpanId);
            Assert.Null(resultContext.SamplingPriority);
            Assert.Equal(origin, resultContext.Origin);
        }
Exemple #2
0
        public void Extract_EmptyHeadersReturnsNull()
        {
            // HttpRequestHeaders setup
            var request = new HttpRequestMessage();
            var headers = new ReflectionHttpHeadersCollection(request.Headers);

            var resultContext = SpanContextPropagator.Instance.Extract(headers);

            Assert.Null(resultContext);
        }
Exemple #3
0
        private static Scope CreateScope(object controllerContext, out AspNetTags tags)
        {
            Scope scope = null;

            tags = null;

            try
            {
                if (!Tracer.Instance.Settings.IsIntegrationEnabled(IntegrationName))
                {
                    // integration disabled, don't create a scope, skip this trace
                    return(null);
                }

                var         tracer            = Tracer.Instance;
                var         request           = controllerContext.GetProperty <object>("Request").GetValueOrDefault();
                SpanContext propagatedContext = null;
                var         tagsFromHeaders   = Enumerable.Empty <KeyValuePair <string, string> >();

                if (request != null && tracer.ActiveScope == null)
                {
                    try
                    {
                        // extract propagated http headers
                        var headers           = request.GetProperty <object>("Headers").GetValueOrDefault();
                        var headersCollection = new ReflectionHttpHeadersCollection(headers);

                        propagatedContext = SpanContextPropagator.Instance.Extract(headersCollection);
                        tagsFromHeaders   = SpanContextPropagator.Instance.ExtractHeaderTags(headersCollection, tracer.Settings.HeaderTags);
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex, "Error extracting propagated HTTP headers.");
                    }
                }

                tags  = new AspNetTags();
                scope = tracer.StartActiveWithTags(OperationName, propagatedContext, tags: tags);
                UpdateSpan(controllerContext, scope.Span, tags, tagsFromHeaders);

                // set analytics sample rate if enabled
                var analyticsSampleRate = tracer.Settings.GetIntegrationAnalyticsSampleRate(IntegrationName, enabledWithGlobalSetting: true);

                if (analyticsSampleRate != null)
                {
                    tags.AnalyticsSampleRate = analyticsSampleRate;
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error creating scope.");
            }

            return(scope);
        }
Exemple #4
0
        public void ExtractHeaderTags_EmptyHeadersReturnsEmptyTagsList()
        {
            // HttpRequestHeaders setup
            var request = new HttpRequestMessage();
            var headers = new ReflectionHttpHeadersCollection(request.Headers);

            var tagsFromHeader = SpanContextPropagator.Instance.ExtractHeaderTags(headers, new Dictionary <string, string>());

            Assert.NotNull(tagsFromHeader);
            Assert.Empty(tagsFromHeader);
        }
Exemple #5
0
        public void Extract_InvalidTraceId(string traceId)
        {
            // HttpRequestHeaders setup
            var request = new HttpRequestMessage();
            var headers = new ReflectionHttpHeadersCollection(request.Headers);

            const string spanId           = "7";
            const string samplingPriority = "2";
            const string origin           = "synthetics";

            InjectContext(headers, traceId, spanId, samplingPriority, origin);
            var resultContext = SpanContextPropagator.Instance.Extract(headers);

            // invalid traceId should return a null context even if other values are set
            Assert.Null(resultContext);
        }
Exemple #6
0
        public void InjectExtract_Identity()
        {
            // HttpRequestHeaders setup
            var request = new HttpRequestMessage();
            var headers = new ReflectionHttpHeadersCollection(request.Headers);

            const int traceId = 9;
            const int spanId  = 7;
            const SamplingPriority samplingPriority = SamplingPriority.UserKeep;
            const string           origin           = "synthetics";

            var context = new SpanContext(traceId, spanId, samplingPriority, null, origin);

            SpanContextPropagator.Instance.Inject(context, headers);
            var resultContext = SpanContextPropagator.Instance.Extract(headers);

            Assert.NotNull(resultContext);
            Assert.Equal(context.SpanId, resultContext.SpanId);
            Assert.Equal(context.TraceId, resultContext.TraceId);
            Assert.Equal(context.SamplingPriority, resultContext.SamplingPriority);
            Assert.Equal(context.Origin, resultContext.Origin);
        }
Exemple #7
0
        public void ExtractHeaderTags_MatchesCaseInsensitive()
        {
            // HttpRequestHeaders setup
            var request = new HttpRequestMessage();
            var headers = new ReflectionHttpHeadersCollection(request.Headers);

            // Initialize constants
            const string customHeader1Name    = "dd-custom-header1";
            const string customHeader1Value   = "match1";
            const string customHeader1TagName = "custom-header1-tag";

            const string customHeader2Name                = "DD-CUSTOM-HEADER-MISMATCHING-CASE";
            const string customHeader2Value               = "match2";
            const string customHeader2TagName             = "custom-header2-tag";
            string       customHeader2LowercaseHeaderName = customHeader2Name.ToLowerInvariant();

            // Initialize WebRequest and add headers
            headers.Add(customHeader1Name, customHeader1Value);
            headers.Add(customHeader2Name, customHeader2Value);

            // Initialize header tag arguments
            var headerToTagMap = new Dictionary <string, string>();

            headerToTagMap.Add(customHeader1Name, customHeader1TagName);
            headerToTagMap.Add(customHeader2LowercaseHeaderName, customHeader2TagName);

            // Set expectations
            var expectedResults = new Dictionary <string, string>();

            expectedResults.Add(customHeader1TagName, customHeader1Value);
            expectedResults.Add(customHeader2TagName, customHeader2Value);

            // Test
            var tagsFromHeader = SpanContextPropagator.Instance.ExtractHeaderTags(headers, headerToTagMap);

            // Assert
            Assert.NotNull(tagsFromHeader);
            Assert.Equal(expectedResults, tagsFromHeader);
        }