Пример #1
0
        /// <summary>
        ///     Обработка вернувшихся сообщений
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnMessageReturned(object sender, EasyNetQ.MessageReturnedEventArgs args)
        {
            var stringDictionary      = args.MessageProperties.Headers.ToDictionary(x => x.Key, x => Encoding.UTF8.GetString((byte[])x.Value));
            var textMapExtractAdapter = new TextMapExtractAdapter(stringDictionary);
            var spanContext           = _tracer.Extract(BuiltinFormats.HttpHeaders, textMapExtractAdapter);

            using (_tracer.BuildSpan(nameof(OnMessageReturned)).AddReference(References.ChildOf, spanContext).StartActive(true))
                using (_logger.BeginScope(new[] { new KeyValuePair <string, object>(nameof(_tracer.ActiveSpan.Context.TraceId), _tracer.ActiveSpan.Context.TraceId) }))
                {
                    _tracer.ActiveSpan.SetTag(Tags.Error, true);

                    if (args.MessageProperties.Headers.TryGetValue(MessageKeyHeader, out var bytes) && bytes is byte[] value)
                    {
                        var key = Encoding.UTF8.GetString(value);

                        _logger.LogError("Message returned {Exchange} {RoutingKey} reason {ReturnReason} {Key}",
                                         args.MessageReturnedInfo.Exchange,
                                         args.MessageReturnedInfo.RoutingKey,
                                         args.MessageReturnedInfo.ReturnReason,
                                         key);

                        MessageReturned?.Invoke(new MessageReturnedEventArgs(key));
                    }
                    else
                    {
                        _logger.LogError("Can not get error message filename");
                    }
                }
        }
        private IScope BeforeWrappedMethod(string name, ILambdaContext lambdaContext, ISpanContext distributedTraceContext, object input = null)
        {
            // Should we use  _tracer.ScopeManager.Active instead?  It returns null if none is active;
            IScope scope = null;

            try
            {
                var tags           = IOParser.ParseRequest(input);
                var extractAdapter = new TextMapExtractAdapter(tags);
                var spanContext    = distributedTraceContext ?? _tracer.Extract(BuiltinFormats.TextMap, extractAdapter);
                tags.Remove("newrelic");
                scope = _tracer
                        .BuildSpan(name)
                        .AsChildOf(spanContext)
                        .WithTag("aws.requestId", lambdaContext.AwsRequestId ?? string.Empty)
                        .WithTag("aws.arn", lambdaContext.InvokedFunctionArn ?? string.Empty)
                        .StartActive();

                DetectColdStart(scope, ref _isColdStart);

                if (input != null)
                {
                    AddTagsToActiveSpan(scope.Span, "request", tags);
                }
            }
            catch (Exception exception)
            {
                Logger.Log(message: exception.ToString(), level: "ERROR");
            }

            return(scope);
        }
Пример #3
0
        private static IScope StartServerSpan(ITracer tracer, IDictionary <string, string> headers, string operationName)
        {
            if (tracer != null)
            {
                ISpanBuilder spanBuilder;
                try
                {
                    ISpanContext parentSpanCtx =
                        tracer.Extract(BuiltinFormats.HttpHeaders, new TextMapExtractAdapter(headers));

                    spanBuilder = tracer.BuildSpan(operationName);
                    if (parentSpanCtx != null)
                    {
                        spanBuilder = spanBuilder.AsChildOf(parentSpanCtx);
                    }
                }
                catch (Exception)
                {
                    spanBuilder = tracer.BuildSpan(operationName);
                }

                return(spanBuilder.StartActive(true));
            }

            return(null);
        }
            /// <summary>
            /// 开始执行Action
            /// </summary>
            /// <param name="context"></param>
            public void OnActionExecuting(ActionExecutingContext context)
            {
                var          path           = context.HttpContext.Request.Path;
                var          callingHeaders = new TextMapExtractAdapter(context.HttpContext.Request.Headers.ToDictionary(m => m.Key, m => m.Value.ToString()));
                var          spanContex     = _tracer.Extract(BuiltinFormats.HttpHeaders, callingHeaders);
                ISpanBuilder builder        = null;

                if (spanContex != null)
                {
                    builder = _tracer.BuildSpan("中间件Span").AsChildOf(spanContex);
                }
                else
                {
                    builder = _tracer.BuildSpan("中间件Span");
                }
                _scope = builder.StartActive(true);
                _scope.Span.SetOperationName(path);
                // 记录请求信息到span
                foreach (var query in context.HttpContext.Request.Query)
                {
                    _scope.Span.SetTag(query.Key, query.Value);
                }
                if (context.HttpContext.Request.HasFormContentType)
                {
                    foreach (var form in context.HttpContext.Request.Form)
                    {
                        _scope.Span.SetTag(form.Key, form.Value);
                    }
                }
            }
Пример #5
0
        public async Task InvokeAsync(HttpContext context)
        {
            HttpRequest request = context.Request;

            ISpanContext extractedSpanContext = _tracer.Extract(BuiltinFormats.HttpHeaders, new RequestHeadersExtractAdapter(request.Headers));
            string       operationName        = "HTTP " + request.Method;

            IScope scope = _tracer.BuildSpan(operationName)
                           .AsChildOf(extractedSpanContext)
                           .WithTag(Tags.Component, "ICH.WebAPI")
                           .WithTag(Tags.SpanKind, Tags.SpanKindServer)
                           .WithTag(Tags.HttpMethod, request.Method)
                           .WithTag(Tags.HttpUrl, GetDisplayUrl(request))
                           .StartActive();

            context.Response.Headers["traceid"] = new StringValues(scope.Span.Context.TraceId);

            try
            {
                await _next(context);

                scope.Span.SetTag(Tags.HttpStatus, context.Response.StatusCode);
                scope.Dispose();
            }
            catch (Exception e)
            {
                scope.Span.SetException(e);
                scope.Dispose();
                await HandleException(context, e);
            }
        }
Пример #6
0
        private EventHandler <MsgHandlerEventArgs> Consumer_Received()
        {
            return(async(sender, args) =>
            {
                var eventName = args.Message.Subject;
                var message = Encoding.UTF8.GetString(args.Message.Data);
                var eventType = _subsManager.GetEventTypeByName(eventName);
                var integrationEvent = JsonSerializer.Deserialize(message, eventType) as IntegrationEvent;

                ISpanContext spanCtx = _tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(integrationEvent.TracingKeys));
                using var tracingScope = _tracer.BuildSpan($"EventBus-Consume-{eventName}")
                                         .AsChildOf(spanCtx)
                                         .WithTag(Tags.SpanKind, Tags.SpanKindConsumer)
                                         .StartActive(finishSpanOnDispose: true);
                try
                {
                    await ProcessEvent(eventName, message);
                }
                catch (Exception ex)
                {
                    tracingScope.Span.SetTag(Tags.Error, true);
                    tracingScope.Span.Log(ex.Message);
                    _logger.LogWarning(ex, "----- ERROR Processing message \"{Message}\"", message);
                }
            });
        }
Пример #7
0
        public EndMethodDelegate BeforeWrappedMethod(TraceMethodInfo traceMethodInfo)
        {
            if (HttpRuntime.UsingIntegratedPipeline)
            {
                HttpContext context = (traceMethodInfo.InvocationTarget as HttpApplication)?.Context;
                if (context != null)
                {
                    if (context.Items["ClrProfiler.Trace.AspNet.TraceScope"] == null)
                    {
                        var extractedSpanContext = _tracer.Extract(BuiltinFormats.HttpHeaders, new RequestHeadersExtractAdapter(context.Request.Headers));

                        var scope = _tracer.BuildSpan("http.in")
                                    .AsChildOf(extractedSpanContext)
                                    .WithTag(Tags.SpanKind, Tags.SpanKindServer)
                                    .WithTag(Tags.Component, "AspNet")
                                    .WithTag(Tags.HttpMethod, context.Request.HttpMethod)
                                    .WithTag(Tags.HttpUrl, context.Request.Path.ToString())
                                    .WithTag(Tags.PeerHostname, context.Request.UserHostName)
                                    .StartActive();

                        context.Items["ClrProfiler.Trace.AspNet.TraceScope"] = scope;
                    }
                }
            }
            return(null);
        }
Пример #8
0
        public async Task Invoke(MessagingContext context, CancellationToken cancellationToken, Func <Task> next)
        {
            var    extractedSpanContext = _tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(context.MessagingEnvelope.Headers));
            string operationName        = $"Subscriber {context.MessagingEnvelope.Payload.GetType().GetPrettyName()}";

            using (var scope = _tracer.BuildSpan(operationName)
                               .AddReference(References.FollowsFrom, extractedSpanContext)
                               .WithTag(Tags.Component, "NBB.Messaging")
                               .WithTag(Tags.SpanKind, Tags.SpanKindConsumer)
                               .WithTag(Tags.PeerService,
                                        context.MessagingEnvelope.Headers.TryGetValue(MessagingHeaders.Source, out var value) ? value : default)
                               .WithTag("correlationId", CorrelationManager.GetCorrelationId()?.ToString())
                               .StartActive(true))
            {
                try
                {
                    await next();
                }
                catch (Exception exception)
                {
                    scope.Span.SetException(exception);
                    throw;
                }
            }
        }
Пример #9
0
        public IScope CreateServerSpan(ServerCallContext context)
        {
            _ = context ?? throw new ArgumentNullException(nameof(context));

            var          operationName = context.Method.Split('/').Last();
            ISpanBuilder spanBuilder   = null;

            try
            {
                var          headers       = context.RequestHeaders.ToDictionary(x => x.Key, x => x.Value);
                ISpanContext parentSpanCtx = _tracer.Extract(BuiltinFormats.HttpHeaders, new TextMapExtractAdapter(headers));

                spanBuilder = _tracer.BuildSpan(operationName);
                spanBuilder = parentSpanCtx != null?spanBuilder.AsChildOf(parentSpanCtx) : spanBuilder;
            }
            finally
            {
                if (spanBuilder == null)
                {
                    spanBuilder = _tracer.BuildSpan(operationName);
                }
            }

            return
                (spanBuilder
                 .WithTag(Tags.SpanKind, Tags.SpanKindServer)
                 .WithTag(Tags.PeerHostname, context.Host)
                 .WithTag("correlation-id", GetCorrelationId())
                 .StartActive(true));
        }
        private IScope BuildServerScope(HttpContext context)
        {
            ISpanBuilder spanBuilder = null;

            var operationName = GetOperationName(context);

            var requestTraceHeaders = context.GetTraceHeaders();

            if (requestTraceHeaders?.Any() ?? false)
            {
                try
                {
                    spanBuilder = _tracer.BuildSpan(operationName);
                    var parentSpanContext = _tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(requestTraceHeaders));
                    if (parentSpanContext != null)
                    {
                        spanBuilder = spanBuilder.AsChildOf(parentSpanContext);
                    }
                }
                catch { }
            }

            if (spanBuilder == null)
            {
                spanBuilder = _tracer.BuildSpan(operationName);
            }

            return(spanBuilder.WithTag(Tags.SpanKind, Tags.SpanKindServer).StartActive(true));
        }
        public static ISpanBuilder ObtainConsumerSpanBuilder(ITracer tracer, Headers headers, string spanName)
        {
            // See if we have a trace header
            IHeader traceHeader = null;

            // For whatever insane reason this linq query is not working ??
            //traceHeader = cr.Message.Headers.FirstOrDefault(p => p.Key == "tracing-id");
            foreach (var header in headers)
            {
                bool isKey = header.Key == "tracing-id";
                if (isKey)
                {
                    traceHeader = header;
                    break;
                }
            }

            ISpanBuilder spanBuilder;

            if (traceHeader != null)
            {
                var map = KafkaTracingContextHelper.Decode(traceHeader.GetValueBytes());
                var ctx = tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(map));
                spanBuilder = tracer.BuildSpan(spanName)
                              .WithTag(Tags.SpanKind.Key, Tags.SpanKindConsumer)
                              .AsChildOf(ctx);
            }
            else
            {
                spanBuilder = tracer.BuildSpan(spanName)
                              .WithTag(Tags.SpanKind.Key, Tags.SpanKindConsumer);
            }

            return(spanBuilder);
        }
Пример #12
0
        internal static async Task Receive(MessageEnvelope envelope, SpanSetup receiveSpanSetup, ITracer tracer, Func <Task> receive)
        {
            var message = envelope.Message;

            var parentSpanCtx = envelope.Header != null
              ? tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(envelope.Header.ToDictionary()))
              : null;

            using (var scope = tracer.BuildStartedScope(parentSpanCtx, nameof(Receive), message, receiveSpanSetup))
            {
                try
                {
                    var span = scope.Span;

                    if (envelope.Sender != null)
                    {
                        ProtoTags.SenderPID.Set(span, envelope.Sender.ToShortString());
                    }

                    receiveSpanSetup?.Invoke(span, message);

                    await receive().ConfigureAwait(false);
                }
                catch (Exception ex)
                {
                    ex.SetupSpan(scope.Span);
                    throw;
                }
            }
        }
Пример #13
0
        private static IScope GetScope(ActionExecutingContext context, ITracer tracer, OpenTracingOptions options)
        {
            //get spanContext
            ISpanContext spanContext;

            if (context.Header == null)
            {
                spanContext = null;
            }
            else
            {
                spanContext = tracer.Extract(BuiltinFormats.HttpHeaders, new RequestHeadersExtractAdapter(context.Header));
            }

            //get scope
            IScope scope;

            if (spanContext == null)
            {
                scope = tracer.BuildSpan($"{context.ContractMethod.MethodInfo.Name} {ConstValue.ReceiveStr}")
                        .StartActive(true);
            }
            else
            {
                scope = tracer.BuildSpan($"{context.ContractMethod.MethodInfo.Name} {ConstValue.ReceiveStr}")
                        .AsChildOf(spanContext).StartActive(true);
                spanContext.CopyBaggageItemsTo(scope.Span);
            }

            return(scope);
        }
Пример #14
0
        public IScope AroundReceive(IActorContext context, TracedMessage tracedMessage, Type actorType)
        {
            var actorPath = context.Self.Path.ToString().Substring(context.Self.Path.Address.ToString().Length);

            string operationName = $"{actorPath}:{tracedMessage.Message.GetType().Name}";

            string parent  = "no";
            var    builder = _tracer.BuildSpan(operationName);

            if (tracedMessage.Span != null)
            {
                parent  = tracedMessage.Span.Context.SpanId;
                builder = builder.AsChildOf(tracedMessage.Span);
            }
            else if (tracedMessage.Context.Count != 0)
            {
                ISpanContext spanContext = _tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(tracedMessage.Context));
                parent  = spanContext.SpanId;
                builder = builder.AsChildOf(spanContext);
            }

            IScope ret = builder.StartActive(true);

            ret.Span.SetTag("sender.path", GetSenderPath(context.Sender));
            ret.Span.SetTag("receiver.path", GetLocalActorPath(context.Self));
            ret.Span.SetTag("receiver.type", actorType.ToString());
            ret.Span.SetTag("message.type", tracedMessage.Message.GetType().ToString());

            LocalLog($"> {context.Self.Path}.Tell({tracedMessage.Message}) Thread={Thread.CurrentThread.ManagedThreadId}, parent={parent}");

            return(ret);
        }
        /// <summary>
        /// 调用管道
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="tracer">跟踪器</param>
        /// <returns></returns>
        public async Task InvokeAsync(HttpContext context, ITracer tracer)
        {
            _logger.LogInformation("jaeger调用");
            var path = context.Request.Path;

            if (Path.HasExtension(path))
            {
                await _next(context);
            }
            else
            {
                //接收传入的Headers
                var          callingHeaders = new TextMapExtractAdapter(context.Request.Headers.ToDictionary(m => m.Key, m => m.Value.ToString()));
                var          spanContex     = tracer.Extract(BuiltinFormats.HttpHeaders, callingHeaders);
                ISpanBuilder builder        = null;
                if (spanContex != null)
                {
                    builder = tracer.BuildSpan("中间件Span").AsChildOf(spanContex);
                }
                else
                {
                    builder = tracer.BuildSpan("中间件Span");
                }
                //开始设置Span
                using (IScope scope = builder.StartActive(true))
                {
                    scope.Span.SetOperationName(path);
                    // 记录请求信息到span
                    if (_jaegerOptions.IsQuerySpan)
                    {
                        foreach (var query in context.Request.Query)
                        {
                            //包含敏感词跳出
                            if (_jaegerOptions.NoSpanKeys.Contains(query.Key))
                            {
                                continue;
                            }
                            var value = query.Value.ToString().Length > _jaegerOptions.QueryValueMaxLength ? query.Value.ToString()?.Substring(0, _jaegerOptions.QueryValueMaxLength) : query.Value.ToString();
                            scope.Span.SetTag(query.Key, value);
                        }
                    }
                    if (_jaegerOptions.IsFormSpan && context.Request.HasFormContentType)
                    {
                        foreach (var form in context.Request.Form)
                        {
                            //包含敏感词跳出
                            if (_jaegerOptions.NoSpanKeys.Contains(form.Key))
                            {
                                continue;
                            }
                            var value = form.Value.ToString().Length > _jaegerOptions.FormValueMaxLength ? form.Value.ToString()?.Substring(0, _jaegerOptions.FormValueMaxLength) : form.Value.ToString();
                            scope.Span.SetTag(form.Key, value);
                        }
                    }
                    await _next(context);
                }
            }
        }
Пример #16
0
 /// <summary>
 /// Extracts the specified tracer.
 /// </summary>
 /// <param name="message">The message.</param>
 /// <param name="tracer">The tracer.</param>
 /// <param name="headers">The headers.</param>
 /// <returns></returns>
 public static ISpanContext Extract(this IMessage message, ITracer tracer, IStandardHeaders headers)
 {
     if (message.Headers.ContainsKey(headers.TraceSpan.Name))
     {
         var mapping =
             (DataMappingTextMap)message.Headers[headers.TraceSpan.Name];
         return(tracer.Extract(BuiltinFormats.TextMap, mapping));
     }
     return(null);
 }
Пример #17
0
 /// <summary>
 /// Extracts the specified tracer.
 /// </summary>
 /// <param name="inputHeaders">The input headers.</param>
 /// <param name="tracer">The tracer.</param>
 /// <param name="headers">The headers.</param>
 /// <returns></returns>
 public static ISpanContext Extract(this IDictionary <string, object> inputHeaders, ITracer tracer, IStandardHeaders headers)
 {
     if (inputHeaders.ContainsKey(headers.TraceSpan.Name))
     {
         var mapping =
             (DataMappingTextMap)inputHeaders[headers.TraceSpan.Name];
         return(tracer.Extract(BuiltinFormats.TextMap, mapping));
     }
     return(null);
 }
        public static ISpanContext?CreateSpanContextFromHeaders(this ITracer tracer,
                                                                IDictionary <string, object> headers)
        {
            if (headers == null)
            {
                return(null);
            }

            var dictionary = headers.ToDictionary(x => x.Key, x => Encoding.UTF8.GetString((byte[])x.Value));

            return(tracer.Extract(BuiltinFormats.HttpHeaders, new TextMapExtractAdapter(dictionary)));
        }
        private void Process(Message message)
        {
            ISpanContext context = _tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(message));

            using (IScope scope = _tracer.BuildSpan("receive")
                                  .WithTag(Tags.SpanKind.Key, Tags.SpanKindServer)
                                  .WithTag(Tags.Component.Key, "example-server")
                                  .AsChildOf(context)
                                  .StartActive(finishSpanOnDispose: true))
            {
            }
        }
        private static ISpanContext ExtractSpanContextOrDefault(
            ITracer tracer,
            ServerCallContext context,
            ISpanContext defaultVal = null)
        {
            ISpanContext spanContext = defaultVal;

            try {
                var dict    = MetadataToDictionary(context.RequestHeaders);
                var adapter = new TextMapExtractAdapter(dict);
                spanContext = tracer.Extract(BuiltinFormats.HttpHeaders, adapter);
            } catch {}
            return(spanContext);
        }
        protected ISpanBuilder CreateTracingSpanBuilder(string spanName, ITracer tracer, HttpRequest request)
        {
            var callingHeaders = new TextMapExtractAdapter(request.Headers.ToDictionary(m => m.Key, m => m.Value.ToString()));
            var spanContex     = tracer.Extract(BuiltinFormats.HttpHeaders, callingHeaders);

            if (spanContex != null)
            {
                return(tracer.BuildSpan(spanName).AsChildOf(spanContex));
            }
            else
            {
                return(tracer.BuildSpan(spanName));
            }
        }
Пример #22
0
        public static IScope CreateAndInjectActiveConsumerScopeFrom(this ITracer tracer, IDictionary <string, string> headers)
        {
            var spanBuilder = tracer.BuildSpan("receive")
                              .WithTag(Tags.SpanKind.Key, Tags.SpanKindConsumer);

            var parentSpanContext = tracer.Extract(BuiltinFormats.TextMap,
                                                   new TextMapExtractAdapter(headers));

            spanBuilder.AddReference(References.FollowsFrom, parentSpanContext);

            var scope = spanBuilder.StartActive(true);

            tracer.Inject(scope.Span.Context, BuiltinFormats.TextMap,
                          new TextMapInjectAdapter(headers));

            return(scope);
        }
Пример #23
0
        public static IScope CreateAndInjectActiveProducerScopeFrom(this ITracer tracer, IDictionary <string, string> headers)
        {
            var spanBuilder = tracer.BuildSpan("send")
                              .WithTag(Tags.SpanKind.Key, Tags.SpanKindProducer);

            var spanContext = tracer.Extract(BuiltinFormats.TextMap,
                                             new TextMapExtractAdapter(headers));

            spanBuilder.AsChildOf(spanContext);

            var scope = spanBuilder.StartActive(true);

            tracer.Inject(scope.Span.Context, BuiltinFormats.TextMap,
                          new TextMapInjectAdapter(headers));

            return(scope);
        }
Пример #24
0
        public Videos Get(string id)
        {
            ISpanContext traceContext = _tracer.Extract(BuiltinFormats.HttpHeaders, new TextMapExtractAdapter(GetHeaders()));

            string videoContent;

            using (var scope = _tracer.BuildSpan("videos-api-net: redis-get")
                               .AsChildOf(traceContext)
                               .StartActive(true))
            {
                IDatabase db = _redis.GetDatabase();
                videoContent = db.StringGet(id);
            }

            var video = JsonSerializer.Deserialize <Videos>(videoContent, _serializationOptions);

            return(video);
        }
Пример #25
0
        public static ISpanContext Extract(IBasicProperties props, ITracer tracer)
        {
            var spanContext = tracer
                              .Extract(BuiltinFormats.TextMap, new HeadersMapExtractAdapter(props.Headers));

            if (spanContext != null)
            {
                return(spanContext);
            }

            var span = tracer.ActiveSpan;

            if (span != null)
            {
                return(span.Context);
            }
            return(null);
        }
        private ISpan BuildClientSpan <TRequest, TResponse>(ClientInterceptorContext <TRequest, TResponse> context) where TRequest : class where TResponse : class
        {
            var spanBuilder = tracer.BuildSpan(context.Method.FullName)  //TODO: make an OperationNameConstructor configurable like in java impl?
                              .IgnoreActiveSpan()
                              .WithTag(Tags.SpanKind.Key, Tags.SpanKindClient)
                              .WithTag(Tags.PeerHostname.Key, context.Host)
                              .WithTag(Tags.PeerService.Key, context.Method.ServiceName)
                              .WithTag(GRPCTags.GrpcMethodName.Key, context.Method.FullName)
                              .WithTag(GRPCTags.GrpcMethodType.Key, context.Method.Type.ToString()); //TODO: Check this...

            if (context.Options.Deadline.HasValue)
            {
                spanBuilder.WithTag(GRPCTags.GrpcDeadline.Key, (DateTime.Now - context.Options.Deadline).Value.Milliseconds);
            }

            ISpanContext spanContext = null;

            if (context.Options.Headers != null)
            {
                // just in case if span context was injected manually to props in basicPublish
                spanContext = tracer.Extract(BuiltinFormats.TextMap,
                                             new HeadersMapExtractAdapter(context.Options.Headers));
            }

            if (spanContext == null)
            {
                var parentSpan = tracer.ActiveSpan;
                if (parentSpan != null)
                {
                    spanContext = parentSpan.Context;
                }
            }

            if (spanContext != null)
            {
                spanBuilder.AsChildOf(spanContext);
            }

            var span = spanBuilder.Start();

            SpanDecorator.OnRequest(span);

            return(span);
        }
Пример #27
0
        public static IScope StartServerSpan(ITracer tracer, IDictionary <string, string> headers, string operationName)
        {
            ISpanBuilder spanBuilder;

            try {
                var parentSpanCtx = tracer.Extract(BuiltinFormats.HttpHeaders, new TextMapExtractAdapter(headers));

                spanBuilder = tracer.BuildSpan(operationName);
                if (parentSpanCtx != null)
                {
                    spanBuilder = spanBuilder.AsChildOf(parentSpanCtx);
                }
            } catch (Exception) {
                spanBuilder = tracer.BuildSpan(operationName);
            }

            // TODO could add more tags like http.url
            return(spanBuilder.WithTag(Tags.SpanKind, Tags.SpanKindServer).StartActive(true));
        }
Пример #28
0
        internal static IScope StartSpanConsumer(this ITracer tracer, IDictionary <string, string> messageAttributes, string operationName)
        {
            ISpanBuilder spanBuilder;

            try
            {
                ISpanContext spanContext = tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(messageAttributes));

                spanBuilder = tracer.BuildSpan(operationName);
                if (spanContext != null)
                {
                    spanBuilder = spanBuilder.AsChildOf(spanContext);
                }
            }
            catch (Exception)
            {
                spanBuilder = tracer.BuildSpan(operationName);
            }
            return(spanBuilder.WithTag(Tags.SpanKind, Tags.SpanKindConsumer).StartActive(true));
        }
Пример #29
0
        public static IScope StartSpan(
            this ITracer tracer,
            [CallerMemberName] string?callerMethodName = default,
            [CallerFilePath] string?callerFilePath     = default)
        {
            var operationName = GetOperationName(callerMethodName, callerFilePath);

            var context = tracer.Extract(
                format: BuiltinFormats.TextMap,
                carrier: new TextMapExtractAdapter(_textMap));

            if (context is null)
            {
                return(tracer.StartParentSpan(callerMethodName, callerFilePath));
            }

            return(tracer.BuildSpan(operationName)
                   .AsChildOf(context)
                   .StartActive());
        }
        public static IScope StartServerSpan(ITracer tracer, IDictionary <string, string> headers, string operationName)
        {
            ISpanBuilder spanBuilder;

            try
            {
                ISpanContext parentSpanCtx = tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(headers));

                spanBuilder = tracer.BuildSpan(operationName);
                if (parentSpanCtx != null)
                {
                    spanBuilder = spanBuilder.AsChildOf(parentSpanCtx);
                }
            }
            catch (Exception)
            {
                spanBuilder = tracer.BuildSpan(operationName);
            }

            return(spanBuilder.WithTag(Tags.SpanKind, Tags.SpanKindConsumer).StartActive(true));
        }