public void StartRemoteChildSpan_WithProbabilitySamplerDefaultSampler()
        {
            var configMock = Mock.Get <ITraceConfig>(traceConfig);

            configMock.Setup((c) => c.ActiveTraceParams).Returns(TraceParams.Default);
            // This traceId will not be sampled by the ProbabilitySampler because the first 8 bytes as long
            // is not less than probability * Long.MAX_VALUE;
            var traceId =
                TraceId.FromBytes(
                    new byte[]
            {
                0x8F,
                0xFF,
                0xFF,
                0xFF,
                0xFF,
                0xFF,
                0xFF,
                0xFF,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
            });

            // If parent is sampled then the remote child must be sampled.
            var childSpan =
                SpanBuilder.Create(
                    SPAN_NAME,
                    SpanKind.Internal,
                    SpanContext.Create(
                        traceId,
                        SpanId.GenerateRandomId(randomHandler),
                        TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty),
                    spanBuilderOptions)
                .StartSpan();

            Assert.True(childSpan.Context.IsValid);
            Assert.Equal(traceId, childSpan.Context.TraceId);
            Assert.True(childSpan.Context.TraceOptions.IsSampled);
            childSpan.End();

            Assert.Equal(TraceParams.Default, traceConfig.ActiveTraceParams);

            // If parent is not sampled then the remote child must be not sampled.
            childSpan =
                SpanBuilder.Create(
                    SPAN_NAME,
                    SpanKind.Internal,
                    SpanContext.Create(
                        traceId,
                        SpanId.GenerateRandomId(randomHandler),
                        TraceOptions.Default, Tracestate.Empty),
                    spanBuilderOptions)
                .StartSpan();
            Assert.True(childSpan.Context.IsValid);
            Assert.Equal(traceId, childSpan.Context.TraceId);
            Assert.False(childSpan.Context.TraceOptions.IsSampled);
            childSpan.End();
        }
Esempio n. 2
0
 protected abstract void Inject(SpanContext spanContext, TCarrier carrier);
 public void TestContextFromStringEmptyException()
 {
     Assert.Throws <ArgumentException>(() => SpanContext.ContextFromString(""));
 }
 /// <inheritdoc />
 public bool ShouldSample(SpanContext parentContext, ActivityTraceId traceId, ActivitySpanId spanId, string name, IEnumerable <ILink> parentLinks)
 {
     return(true);
 }
Esempio n. 5
0
 public void Inject <T>(SpanContext spanContext, T carrier, Action <T, string, string> setter)
 {
     Logger.Log($"LoggingTextFormat.Inject({spanContext}, ...)");
 }
        private static AspNetCoreMvcContext CreateContext(object actionDescriptor, object httpContext)
        {
            var context = new AspNetCoreMvcContext();

            try
            {
                var request = httpContext.GetProperty("Request").GetValueOrDefault();

                GetTagValues(
                    actionDescriptor,
                    request,
                    out string httpMethod,
                    out string host,
                    out string resourceName,
                    out string url,
                    out string controllerName,
                    out string actionName);

                SpanContext propagatedContext = null;
                var         tracer            = Tracer.Instance;

                if (tracer.ActiveScope == null)
                {
                    try
                    {
                        // extract propagated http headers
                        var requestHeaders = request.GetProperty <IEnumerable>("Headers").GetValueOrDefault();

                        if (requestHeaders != null)
                        {
                            var headersCollection = new DictionaryHeadersCollection();

                            foreach (object header in requestHeaders)
                            {
                                var key    = header.GetProperty <string>("Key").GetValueOrDefault();
                                var values = header.GetProperty <IList <string> >("Value").GetValueOrDefault();

                                if (key != null && values != null)
                                {
                                    headersCollection.Add(key, values);
                                }
                            }

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

                var scope = tracer.StartActive(OperationName, propagatedContext);
                context.Scope = scope;
                var span = scope.Span;

                span.DecorateWebServerSpan(
                    resourceName: resourceName,
                    method: httpMethod,
                    host: host,
                    httpUrl: url);

                span.SetTag(Tags.AspNetController, controllerName);
                span.SetTag(Tags.AspNetAction, actionName);

                var analyticsSampleRate = tracer.Settings.GetIntegrationAnalyticsSampleRate(IntegrationName, enabledWithGlobalSetting: true);
                span.SetMetric(Tags.Analytics, analyticsSampleRate);
            }
            catch (Exception ex)
            {
                context.ShouldInstrument = false;
                context.Scope.Dispose();
                Log.Error(
                    ex,
                    "An exception occurred when trying to initialize a Scope for {0}",
                    nameof(AspNetCoreMvc3Integration));
                throw;
            }

            return(context);
        }
Esempio n. 7
0
 private static GrpcReference BuildReference(SpanContext context, string referenceType)
 {
     return(JaegerGrpcSpanConverter.BuildReferences(new List <Reference> {
         new Reference(context, referenceType)
     }.AsReadOnly())[0]);
 }
Esempio n. 8
0
        private static SyntaxList <RazorSyntaxNode> GetRewrittenMarkupStartTagChildren(MarkupStartTagSyntax node)
        {
            // Rewrites the children of the start tag to look like the legacy syntax tree.
            if (node.IsMarkupTransition)
            {
                var tokens       = node.DescendantNodes().Where(n => n is SyntaxToken token && !token.IsMissing).Cast <SyntaxToken>().ToArray();
                var tokenBuilder = SyntaxListBuilder <SyntaxToken> .Create();

                tokenBuilder.AddRange(tokens, 0, tokens.Length);
                var markupTransition = SyntaxFactory.MarkupTransition(tokenBuilder.ToList()).Green.CreateRed(node, node.Position);
                var spanContext      = node.GetSpanContext();
                if (spanContext != null)
                {
                    markupTransition = markupTransition.WithSpanContext(spanContext);
                }

                var builder = new SyntaxListBuilder(1);
                builder.Add(markupTransition);
                return(new SyntaxList <RazorSyntaxNode>(builder.ToListNode().CreateRed(node, node.Position)));
            }

            SpanContext latestSpanContext = null;
            var         children          = node.Children;
            var         newChildren       = new SyntaxListBuilder(children.Count);
            var         literals          = new List <MarkupTextLiteralSyntax>();

            foreach (var child in children)
            {
                if (child is MarkupTextLiteralSyntax literal)
                {
                    literals.Add(literal);
                    latestSpanContext = literal.GetSpanContext() ?? latestSpanContext;
                }
                else if (child is MarkupMiscAttributeContentSyntax miscContent)
                {
                    foreach (var contentChild in miscContent.Children)
                    {
                        if (contentChild is MarkupTextLiteralSyntax contentLiteral)
                        {
                            literals.Add(contentLiteral);
                            latestSpanContext = contentLiteral.GetSpanContext() ?? latestSpanContext;
                        }
                        else
                        {
                            // Pop stack
                            AddLiteralIfExists();
                            newChildren.Add(contentChild);
                        }
                    }
                }
                else
                {
                    AddLiteralIfExists();
                    newChildren.Add(child);
                }
            }

            AddLiteralIfExists();

            return(new SyntaxList <RazorSyntaxNode>(newChildren.ToListNode().CreateRed(node, node.Position)));

            void AddLiteralIfExists()
            {
                if (literals.Count > 0)
                {
                    var mergedLiteral = SyntaxUtilities.MergeTextLiterals(literals.ToArray());
                    mergedLiteral = mergedLiteral.WithSpanContext(latestSpanContext);
                    literals.Clear();
                    latestSpanContext = null;
                    newChildren.Add(mergedLiteral);
                }
            }
        }
Esempio n. 9
0
 public void Propagate_SpanContextTracingEnabled()
 {
     TestSpanContextConversion(
         SpanContext.Create(TRACE_ID, SPAN_ID, TraceOptions.Builder().SetIsSampled(true).Build()));
 }
Esempio n. 10
0
        /// <summary>
        /// Creates a scope used to instrument an MVC action and populates some common details.
        /// </summary>
        /// <param name="controllerContext">The System.Web.Mvc.ControllerContext that was passed as an argument to the instrumented method.</param>
        /// <returns>A new scope used to instrument an MVC action.</returns>
        internal static Scope CreateScope(ControllerContextStruct controllerContext)
        {
            Scope scope = null;

            try
            {
                var httpContext = controllerContext.HttpContext;
                if (httpContext == null)
                {
                    return(null);
                }

                Span span = null;
                // integration enabled, go create a scope!
                var tracer = Tracer.Instance;
                if (tracer.Settings.IsIntegrationEnabled(IntegrationId))
                {
                    var    newResourceNamesEnabled = tracer.Settings.RouteTemplateResourceNamesEnabled;
                    string host         = httpContext.Request.Headers.Get("Host");
                    string httpMethod   = httpContext.Request.HttpMethod.ToUpperInvariant();
                    string url          = httpContext.Request.RawUrl.ToLowerInvariant();
                    string resourceName = null;

                    RouteData            routeData   = controllerContext.RouteData;
                    Route                route       = routeData?.Route as Route;
                    RouteValueDictionary routeValues = routeData?.Values;
                    bool wasAttributeRouted          = false;
                    bool isChildAction = controllerContext.ParentActionViewContext.RouteData?.Values["controller"] is not null;

                    if (isChildAction && newResourceNamesEnabled)
                    {
                        // For child actions, we want to stick to what was requested in the http request.
                        // And the child action being a child, then we have already computed the resourcename.
                        resourceName = httpContext.Items[SharedItems.HttpContextPropagatedResourceNameKey] as string;
                    }

                    if (route == null && routeData?.Route.GetType().FullName == RouteCollectionRouteTypeName)
                    {
                        var routeMatches = routeValues?.GetValueOrDefault("MS_DirectRouteMatches") as List <RouteData>;

                        if (routeMatches?.Count > 0)
                        {
                            // route was defined using attribute routing i.e. [Route("/path/{id}")]
                            // get route and routeValues from the RouteData in routeMatches
                            wasAttributeRouted = true;
                            route       = routeMatches[0].Route as Route;
                            routeValues = routeMatches[0].Values;
                        }
                    }

                    string routeUrl = route?.Url;
                    string areaName;
                    string controllerName;
                    string actionName;

                    if ((wasAttributeRouted || newResourceNamesEnabled) && string.IsNullOrEmpty(resourceName) && !string.IsNullOrEmpty(routeUrl))
                    {
                        resourceName = AspNetResourceNameHelper.CalculateResourceName(
                            httpMethod: httpMethod,
                            routeTemplate: routeUrl,
                            routeValues,
                            defaults: wasAttributeRouted ? null : route.Defaults,
                            out areaName,
                            out controllerName,
                            out actionName,
                            expandRouteTemplates: newResourceNamesEnabled && tracer.Settings.ExpandRouteTemplatesEnabled);
                    }
                    else
                    {
                        // just grab area/controller/action directly
                        areaName       = (routeValues?.GetValueOrDefault("area") as string)?.ToLowerInvariant();
                        controllerName = (routeValues?.GetValueOrDefault("controller") as string)?.ToLowerInvariant();
                        actionName     = (routeValues?.GetValueOrDefault("action") as string)?.ToLowerInvariant();
                    }

                    if (string.IsNullOrEmpty(resourceName) && httpContext.Request.Url != null)
                    {
                        var cleanUri = UriHelpers.GetCleanUriPath(httpContext.Request.Url);
                        resourceName = $"{httpMethod} {cleanUri.ToLowerInvariant()}";
                    }

                    if (string.IsNullOrEmpty(resourceName))
                    {
                        // Keep the legacy resource name, just to have something
                        resourceName = $"{httpMethod} {controllerName}.{actionName}";
                    }

                    SpanContext propagatedContext = null;
                    var         tagsFromHeaders   = Enumerable.Empty <KeyValuePair <string, string> >();

                    if (tracer.InternalActiveScope == null)
                    {
                        try
                        {
                            // extract propagated http headers
                            var headers = httpContext.Request.Headers.Wrap();
                            propagatedContext = SpanContextPropagator.Instance.Extract(headers);
                            tagsFromHeaders   = SpanContextPropagator.Instance.ExtractHeaderTags(headers, tracer.Settings.HeaderTags, SpanContextPropagator.HttpRequestHeadersTagPrefix);
                        }
                        catch (Exception ex)
                        {
                            Log.Error(ex, "Error extracting propagated HTTP headers.");
                        }
                    }

                    var tags = new AspNetTags();
                    scope = tracer.StartActiveInternal(isChildAction ? ChildActionOperationName : OperationName, propagatedContext, tags: tags);
                    span  = scope.Span;

                    span.DecorateWebServerSpan(
                        resourceName: resourceName,
                        method: httpMethod,
                        host: host,
                        httpUrl: url,
                        tags,
                        tagsFromHeaders);

                    tags.AspNetRoute      = routeUrl;
                    tags.AspNetArea       = areaName;
                    tags.AspNetController = controllerName;
                    tags.AspNetAction     = actionName;

                    tags.SetAnalyticsSampleRate(IntegrationId, tracer.Settings, enabledWithGlobalSetting: true);

                    if (newResourceNamesEnabled && string.IsNullOrEmpty(httpContext.Items[SharedItems.HttpContextPropagatedResourceNameKey] as string))
                    {
                        // set the resource name in the HttpContext so TracingHttpModule can update root span
                        httpContext.Items[SharedItems.HttpContextPropagatedResourceNameKey] = resourceName;
                    }

                    tracer.TracerManager.Telemetry.IntegrationGeneratedSpan(IntegrationId);
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error creating or populating scope.");
            }

            return(scope);
        }
        /// <summary>
        /// Creates a scope used to instrument an MVC action and populates some common details.
        /// </summary>
        /// <param name="controllerContext">The System.Web.Mvc.ControllerContext that was passed as an argument to the instrumented method.</param>
        /// <returns>A new scope used to instrument an MVC action.</returns>
        public static Scope CreateScope(object controllerContext)
        {
            Scope scope = null;

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

                if (controllerContext == null || controllerContext.GetType().FullName != ControllerContextTypeName)
                {
                    return(null);
                }

                var httpContext = controllerContext.GetProperty <HttpContextBase>("HttpContext").GetValueOrDefault();

                if (httpContext == null)
                {
                    return(null);
                }

                string host         = httpContext.Request.Headers.Get("Host");
                string httpMethod   = httpContext.Request.HttpMethod.ToUpperInvariant();
                string url          = httpContext.Request.RawUrl.ToLowerInvariant();
                string resourceName = null;

                RouteData            routeData   = controllerContext.GetProperty <RouteData>("RouteData").GetValueOrDefault();
                Route                route       = routeData?.Route as Route;
                RouteValueDictionary routeValues = routeData?.Values;

                if (route == null && routeData?.Route.GetType().FullName == RouteCollectionRouteTypeName)
                {
                    var routeMatches = routeValues?.GetValueOrDefault("MS_DirectRouteMatches") as List <RouteData>;

                    if (routeMatches?.Count > 0)
                    {
                        // route was defined using attribute routing i.e. [Route("/path/{id}")]
                        // get route and routeValues from the RouteData in routeMatches
                        route       = routeMatches[0].Route as Route;
                        routeValues = routeMatches[0].Values;

                        if (route != null)
                        {
                            var resourceUrl = route.Url?.ToLowerInvariant() ?? string.Empty;
                            if (resourceUrl.FirstOrDefault() != '/')
                            {
                                resourceUrl = string.Concat("/", resourceUrl);
                            }

                            resourceName = $"{httpMethod} {resourceUrl}";
                        }
                    }
                }

                if (string.IsNullOrEmpty(resourceName) && httpContext.Request.Url != null)
                {
                    var cleanUri = UriHelpers.GetRelativeUrl(httpContext.Request.Url, tryRemoveIds: true);
                    resourceName = $"{httpMethod} {cleanUri.ToLowerInvariant()}";
                }

                string controllerName = (routeValues?.GetValueOrDefault("controller") as string)?.ToLowerInvariant();
                string actionName     = (routeValues?.GetValueOrDefault("action") as string)?.ToLowerInvariant();

                if (string.IsNullOrEmpty(resourceName))
                {
                    // Keep the legacy resource name, just to have something
                    resourceName = $"{httpMethod} {controllerName}.{actionName}";
                }

                SpanContext propagatedContext = null;
                var         tracer            = Tracer.Instance;

                if (tracer.ActiveScope == null)
                {
                    try
                    {
                        // extract propagated http headers
                        var headers = httpContext.Request.Headers.Wrap();
                        propagatedContext = tracer.Propagator.Extract(headers);
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex, "Error extracting propagated HTTP headers.");
                    }
                }

                scope = Tracer.Instance.StartActive(OperationName, propagatedContext);
                Span span = scope.Span;

                // Fail safe to catch templates in routing values
                resourceName =
                    resourceName
                    .Replace("{controller}", controllerName)
                    .Replace("{action}", actionName);

                IPAddress remoteIp = null;
                if (Tracer.Instance.Settings.AddClientIpToServerSpans)
                {
                    IPAddress.TryParse(httpContext.Request.UserHostAddress, out remoteIp);
                }

                span.DecorateWebServerSpan(
                    resourceName: resourceName,
                    method: httpMethod,
                    host: host,
                    httpUrl: url,
                    remoteIp: remoteIp);
                span.SetTag(Tags.AspNetRoute, route?.Url);
                span.SetTag(Tags.AspNetController, controllerName);
                span.SetTag(Tags.AspNetAction, actionName);

                // set analytics sample rate if enabled
                var analyticsSampleRate = tracer.Settings.GetIntegrationAnalyticsSampleRate(IntegrationName, enabledWithGlobalSetting: true);
                span.SetMetric(Tags.Analytics, analyticsSampleRate);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error creating or populating scope.");
            }

            return(scope);
        }
        private void TestSpanContextConversion(SpanContext spanContext)
        {
            var propagatedBinarySpanContext = binaryFormat.FromByteArray(binaryFormat.ToByteArray(spanContext));

            Assert.Equal(spanContext, propagatedBinarySpanContext);
        }
Esempio n. 13
0
 /// <inheritdoc/>
 public void Record(IEnumerable <IMeasurement> measurements, ITagContext tagContext, SpanContext spanContext)
 {
 }
        /// <summary>
        /// Creates a scope used to instrument an MVC action and populates some common details.
        /// </summary>
        /// <param name="controllerContext">The System.Web.Mvc.ControllerContext that was passed as an argument to the instrumented method.</param>
        /// <returns>A new scope used to instrument an MVC action.</returns>
        public static Scope CreateScope(ControllerContextStruct controllerContext)
        {
            Scope scope = null;

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

                var httpContext = controllerContext.HttpContext;

                if (httpContext == null)
                {
                    return(null);
                }

                var    newResourceNamesEnabled = Tracer.Instance.Settings.RouteTemplateResourceNamesEnabled;
                string host         = httpContext.Request.Headers.Get("Host");
                string httpMethod   = httpContext.Request.HttpMethod.ToUpperInvariant();
                string url          = httpContext.Request.RawUrl.ToLowerInvariant();
                string resourceName = null;

                RouteData            routeData   = controllerContext.RouteData;
                Route                route       = routeData?.Route as Route;
                RouteValueDictionary routeValues = routeData?.Values;
                bool wasAttributeRouted          = false;

                if (route == null && routeData?.Route.GetType().FullName == RouteCollectionRouteTypeName)
                {
                    var routeMatches = routeValues?.GetValueOrDefault("MS_DirectRouteMatches") as List <RouteData>;

                    if (routeMatches?.Count > 0)
                    {
                        // route was defined using attribute routing i.e. [Route("/path/{id}")]
                        // get route and routeValues from the RouteData in routeMatches
                        wasAttributeRouted = true;
                        route       = routeMatches[0].Route as Route;
                        routeValues = routeMatches[0].Values;

                        if (route != null)
                        {
                            var resourceUrl = route.Url?.ToLowerInvariant() ?? string.Empty;
                            if (resourceUrl.FirstOrDefault() != '/')
                            {
                                resourceUrl = string.Concat("/", resourceUrl);
                            }

                            resourceName = $"{httpMethod} {resourceUrl}";
                        }
                    }
                }

                string routeUrl       = route?.Url;
                string areaName       = (routeValues?.GetValueOrDefault("area") as string)?.ToLowerInvariant();
                string controllerName = (routeValues?.GetValueOrDefault("controller") as string)?.ToLowerInvariant();
                string actionName     = (routeValues?.GetValueOrDefault("action") as string)?.ToLowerInvariant();

                if (newResourceNamesEnabled && string.IsNullOrEmpty(resourceName) && !string.IsNullOrEmpty(routeUrl))
                {
                    resourceName = $"{httpMethod} /{routeUrl.ToLowerInvariant()}";
                }

                if (string.IsNullOrEmpty(resourceName) && httpContext.Request.Url != null)
                {
                    var cleanUri = UriHelpers.GetCleanUriPath(httpContext.Request.Url);
                    resourceName = $"{httpMethod} {cleanUri.ToLowerInvariant()}";
                }

                if (string.IsNullOrEmpty(resourceName))
                {
                    // Keep the legacy resource name, just to have something
                    resourceName = $"{httpMethod} {controllerName}.{actionName}";
                }

                // Replace well-known routing tokens
                resourceName =
                    resourceName
                    .Replace("{area}", areaName)
                    .Replace("{controller}", controllerName)
                    .Replace("{action}", actionName);

                if (newResourceNamesEnabled && !wasAttributeRouted && routeValues is not null && route is not null)
                {
                    // Remove unused parameters from conventional route templates
                    // Don't bother with routes defined using attribute routing
                    foreach (var parameter in route.Defaults)
                    {
                        var parameterName = parameter.Key;
                        if (parameterName != "area" &&
                            parameterName != "controller" &&
                            parameterName != "action" &&
                            !routeValues.ContainsKey(parameterName))
                        {
                            resourceName = resourceName.Replace($"/{{{parameterName}}}", string.Empty);
                        }
                    }
                }

                SpanContext propagatedContext = null;
                var         tracer            = Tracer.Instance;
                var         tagsFromHeaders   = Enumerable.Empty <KeyValuePair <string, string> >();

                if (tracer.ActiveScope == null)
                {
                    try
                    {
                        // extract propagated http headers
                        var headers = httpContext.Request.Headers.Wrap();
                        propagatedContext = tracer.Propagator.Extract(headers);
                        tagsFromHeaders   = headers.ExtractHeaderTags(tracer.Settings.HeaderTags, PropagationExtensions.HttpRequestHeadersTagPrefix);
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex, "Error extracting propagated HTTP headers.");
                    }
                }

                var tags = new AspNetTags();
                scope = Tracer.Instance.StartActiveWithTags(OperationName, propagatedContext, tags: tags);
                Span span = scope.Span;

                span.DecorateWebServerSpan(
                    resourceName: resourceName,
                    method: httpMethod,
                    host: host,
                    httpUrl: url,
                    tags,
                    tagsFromHeaders);

                tags.AspNetRoute      = routeUrl;
                tags.AspNetArea       = areaName;
                tags.AspNetController = controllerName;
                tags.AspNetAction     = actionName;

                tags.SetAnalyticsSampleRate(IntegrationId, tracer.Settings, enabledWithGlobalSetting: true);

                if (newResourceNamesEnabled)
                {
                    // set the resource name in the HttpContext so TracingHttpModule can update root span
                    httpContext.Items[SharedConstants.HttpContextPropagatedResourceNameKey] = resourceName;
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error creating or populating scope.");
            }

            return(scope);
        }
        /// <summary>
        /// Injects the specified <see cref="SpanContext"/> in the <see cref="HttpHeaders"/>.
        /// </summary>
        /// <param name="headers">The headers.</param>
        /// <param name="context">The context.</param>
        public static void Inject(this HttpHeaders headers, SpanContext context)
        {
            var wrapper = new HttpHeadersWrapper(headers);

            wrapper.Inject(context);
        }
Esempio n. 16
0
 public void Propagate_SpanContextNoTracing()
 {
     TestSpanContextConversion(SpanContext.Create(TRACE_ID, SPAN_ID, TraceOptions.DEFAULT));
 }
        internal static Span CreateTestSpan(bool setAttributes = true,
                                            bool addEvents     = true,
                                            bool addLinks      = true)
        {
            var startTimestamp = DateTime.UtcNow;
            var endTimestamp   = startTimestamp.AddSeconds(60);
            var eventTimestamp = DateTime.UtcNow;
            var traceId        = ActivityTraceId.CreateFromString("e8ea7e9ac72de94e91fabc613f9686b2".AsSpan());

            var parentSpanId = ActivitySpanId.CreateFromBytes(new byte[] { 12, 23, 34, 45, 56, 67, 78, 89 });
            var attributes   = new Dictionary <string, object>
            {
                { "stringKey", "value" },
                { "longKey", 1L },
                { "longKey2", 1 },
                { "doubleKey", 1D },
                { "doubleKey2", 1F },
                { "boolKey", true },
            };
            var events = new List <IEvent>
            {
                Event.Create(
                    "Event1",
                    eventTimestamp,
                    new Dictionary <string, object>
                {
                    { "key", "value" },
                }
                    ),
                Event.Create(
                    "Event2",
                    eventTimestamp,
                    new Dictionary <string, object>
                {
                    { "key", "value" },
                }
                    ),
            };

            var linkedSpanId = ActivitySpanId.CreateFromString("888915b6286b9c41".AsSpan());

            var link = Link.FromSpanContext(SpanContext.Create(
                                                traceId,
                                                linkedSpanId,
                                                ActivityTraceFlags.Recorded,
                                                Tracestate.Empty));

            var span = (Span)Tracing.Tracer
                       .SpanBuilder("Name")
                       .SetParent(SpanContext.Create(traceId, parentSpanId, ActivityTraceFlags.Recorded, Tracestate.Empty))
                       .SetSpanKind(SpanKind.Client)
                       .SetStartTimestamp(startTimestamp)
                       .StartSpan();

            if (addLinks)
            {
                span.AddLink(link);
            }

            if (setAttributes)
            {
                foreach (var attribute in attributes)
                {
                    span.SetAttribute(attribute);
                }
            }

            if (addEvents)
            {
                foreach (var evnt in events)
                {
                    span.AddEvent(evnt);
                }
            }

            span.Status = Status.Ok;

            span.End(endTimestamp);
            return(span);
        }
Esempio n. 18
0
        private static Scope CreateScope(RequestContext requestContext)
        {
            var requestMessage = requestContext?.RequestMessage;

            if (requestMessage == null)
            {
                return(null);
            }

            var tracer = Tracer.Instance;

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

            Scope scope = null;

            try
            {
                SpanContext propagatedContext = null;
                string      host       = null;
                string      httpMethod = null;

                if (requestMessage.Properties.TryGetValue("httpRequest", out var httpRequestProperty) &&
                    httpRequestProperty is HttpRequestMessageProperty httpRequestMessageProperty)
                {
                    // we're using an http transport
                    host       = httpRequestMessageProperty.Headers[HttpRequestHeader.Host];
                    httpMethod = httpRequestMessageProperty.Method?.ToUpperInvariant();

                    // try to extract propagated context values from http headers
                    if (tracer.ActiveScope == null)
                    {
                        try
                        {
                            var headers = httpRequestMessageProperty.Headers.Wrap();
                            propagatedContext = SpanContextPropagator.Instance.Extract(headers);
                        }
                        catch (Exception ex)
                        {
                            Log.Error(ex, "Error extracting propagated HTTP headers.");
                        }
                    }
                }

                scope = tracer.StartActive("wcf.request", propagatedContext);
                Span span = scope.Span;

                span.DecorateWebServerSpan(
                    resourceName: requestMessage.Headers.Action,
                    httpMethod,
                    host,
                    httpUrl: requestMessage.Headers.To?.AbsoluteUri);

                // set analytics sample rate if enabled
                var analyticsSampleRate = tracer.Settings.GetIntegrationAnalyticsSampleRate(IntegrationName, enabledWithGlobalSetting: true);
                span.SetMetric(Tags.Analytics, analyticsSampleRate);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error creating or populating scope.");
            }

            // always returns the scope, even if it's null
            return(scope);
        }
Esempio n. 19
0
 protected override void Inject(SpanContext spanContext, ITextMap carrier)
 {
     throw new InvalidOperationException("Some Codecs can be faulty, this one is.");
 }
Esempio n. 20
0
 /// <summary>
 /// Injects the specified <see cref="SpanContext"/> in the <see cref="IHeaderCollection"/>.
 /// </summary>
 /// <param name="headers">The headers.</param>
 /// <param name="context">The context.</param>
 public static void Inject(this IHeaderCollection headers, SpanContext context)
 {
     headers.Set(HttpHeaderNames.HttpHeaderParentId, context.SpanId.ToString());
     headers.Set(HttpHeaderNames.HttpHeaderTraceId, context.TraceId.ToString());
 }
Esempio n. 21
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AspNetCoreMvc2Integration"/> class.
        /// </summary>
        /// <param name="actionDescriptor">An ActionDescriptor with information about the current action.</param>
        /// <param name="httpContext">The HttpContext for the current request.</param>
        public AspNetCoreMvc2Integration(object actionDescriptor, object httpContext)
        {
            try
            {
                _httpContext = httpContext;
                var request = _httpContext.GetProperty("Request").GetValueOrDefault();

                GetTagValues(
                    actionDescriptor,
                    request,
                    out string httpMethod,
                    out string host,
                    out string resourceName,
                    out string url,
                    out string controllerName,
                    out string actionName);

                SpanContext propagatedContext = null;
                var         tracer            = Tracer.Instance;

                if (tracer.ActiveScope == null)
                {
                    try
                    {
                        // extract propagated http headers
                        var requestHeaders = request.GetProperty <IEnumerable>("Headers").GetValueOrDefault();

                        if (requestHeaders != null)
                        {
                            var headersCollection = new DictionaryHeadersCollection();

                            foreach (object header in requestHeaders)
                            {
                                var key    = header.GetProperty <string>("Key").GetValueOrDefault();
                                var values = header.GetProperty <IList <string> >("Value").GetValueOrDefault();

                                if (key != null && values != null)
                                {
                                    headersCollection.Add(key, values);
                                }
                            }

                            propagatedContext = SpanContextPropagator.Instance.Extract(headersCollection);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.ErrorException("Error extracting propagated HTTP headers.", ex);
                    }
                }

                _scope = tracer.StartActive(OperationName, propagatedContext);
                var span = _scope.Span;

                span.DecorateWebServerSpan(
                    resourceName: resourceName,
                    method: httpMethod,
                    host: host,
                    httpUrl: url);

                span.SetTag(Tags.AspNetController, controllerName);
                span.SetTag(Tags.AspNetAction, actionName);

                // set analytics sample rate if enabled
                var analyticsSampleRate = tracer.Settings.GetIntegrationAnalyticsSampleRate(IntegrationName, enabledWithGlobalSetting: true);
                span.SetMetric(Tags.Analytics, analyticsSampleRate);
            }
            catch (Exception) when(DisposeObject(_scope))
            {
                // unreachable code
                throw;
            }
        }
Esempio n. 22
0
 public LoggingSpanBuilder(string spanName, SpanKind spanKind, SpanContext remoteParentSpanContext)
     : this(spanName, spanKind)
 {
     Logger.Log($"SpanBuilder.ctor({spanName}, {spanKind}, {remoteParentSpanContext})");
     this.remoteParentSpanContext = remoteParentSpanContext;
 }
 /// <inheritdoc />
 public Decision ShouldSample(SpanContext parentContext, ActivityTraceId traceId, ActivitySpanId spanId, string name, IEnumerable <Link> links)
 {
     return(new Decision(false));
 }
Esempio n. 24
0
 public ISpanBuilder AddLink(SpanContext spanContext)
 {
     Logger.Log($"SpanBuilder.AddLink({spanContext})");
     return(this);
 }
Esempio n. 25
0
        private SyntaxList <RazorSyntaxNode> GetLegacyChildren()
        {
            // This method returns the children of this start tag in legacy format.
            // This is needed to generate the same classified spans as the legacy syntax tree.
            var builder = new SyntaxListBuilder(5);
            var tokens  = SyntaxListBuilder <SyntaxToken> .Create();

            var context = this.GetSpanContext();

            // We want to know if this tag contains non-whitespace attribute content to set the appropriate AcceptedCharacters.
            // The prefix of a start tag(E.g '|<foo| attr>') will have 'Any' accepted characters if non-whitespace attribute content exists.
            var acceptsAnyContext = new SpanContext(context.ChunkGenerator, SpanEditHandler.CreateDefault());

            acceptsAnyContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
            var containsAttributesContent = false;

            foreach (var attribute in Attributes)
            {
                if (!string.IsNullOrWhiteSpace(attribute.GetContent()))
                {
                    containsAttributesContent = true;
                    break;
                }
            }

            if (!OpenAngle.IsMissing)
            {
                tokens.Add(OpenAngle);
            }
            if (Bang != null)
            {
                builder.Add(SyntaxFactory.MarkupTextLiteral(tokens.Consume()).WithSpanContext(acceptsAnyContext));

                tokens.Add(Bang);
                var acceptsNoneContext = new SpanContext(context.ChunkGenerator, SpanEditHandler.CreateDefault());
                acceptsNoneContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
                builder.Add(SyntaxFactory.RazorMetaCode(tokens.Consume()).WithSpanContext(acceptsNoneContext));
            }
            if (!Name.IsMissing)
            {
                tokens.Add(Name);
            }

            builder.Add(SyntaxFactory.MarkupTextLiteral(tokens.Consume()).WithSpanContext(containsAttributesContent ? acceptsAnyContext : context));

            builder.AddRange(Attributes);

            if (ForwardSlash != null)
            {
                tokens.Add(ForwardSlash);
            }
            if (!CloseAngle.IsMissing)
            {
                tokens.Add(CloseAngle);
            }

            if (tokens.Count > 0)
            {
                builder.Add(SyntaxFactory.MarkupTextLiteral(tokens.Consume()).WithSpanContext(context));
            }

            return(new SyntaxList <RazorSyntaxNode>(builder.ToListNode().CreateRed(this, Position)));
        }
Esempio n. 26
0
 public ISpanBuilder AddLink(SpanContext context, IDictionary <string, object> attributes)
 {
     Logger.Log($"SpanBuilder.AddLink({context}, {attributes.Count})");
     return(this);
 }
Esempio n. 27
0
 public void Inject(SpanContext spanContext, object carrier)
 {
     Inject(spanContext, (TCarrier)carrier);
 }
Esempio n. 28
0
 public ISpanBuilder SetParent(SpanContext remoteParent)
 {
     Logger.Log($"SpanBuilder.SetParent({remoteParent})");
     return(this);
 }
 public void TestContextFromStringMalformedException()
 {
     Assert.Throws <ArgumentException>(() => SpanContext.ContextFromString("ff:ff:ff"));
 }
 /// <inheritdoc />
 public void Inject <TCarrier>(SpanContext context, IFormat <TCarrier> format, TCarrier carrier)
 {
     Propagators.ForEach(propagator =>
                         propagator.Inject(context, format, carrier)
                         );
 }