public ISpan OnBeginRequest(HttpContext httpContext)
        {
            var spanBuilder = new SpanBuilder($"server {httpContext.Request.Method} {httpContext.Request.Path}");

            if (_tracer.Tracer.TryExtract(out var spanContext, httpContext.Request.Headers, (c, k) => c[k].GetValue(),
                                          c => c.Select(x => new KeyValuePair <string, string>(x.Key, x.Value.GetValue())).GetEnumerator()))
            {
                spanBuilder.AsChildOf(spanContext);
            }
            var span = _tracer.Start(spanBuilder);

            httpContext.SetSpan(span);
            span.Log(LogField.CreateNew().ServerReceive());
            span.Log(LogField.CreateNew().Event("AspNetCore BeginRequest"));
            span.Tags
            .Server().Component("AspNetCore")
            .HttpMethod(httpContext.Request.Method)
            .HttpUrl($"{httpContext.Request.Scheme}://{httpContext.Request.Host.ToUriComponent()}{httpContext.Request.Path}{httpContext.Request.QueryString}")
            .HttpHost(httpContext.Request.Host.ToUriComponent())
            .HttpPath(httpContext.Request.Path)
            .HttpStatusCode(httpContext.Response.StatusCode)
            .PeerAddress(httpContext.Connection.RemoteIpAddress.ToString())
            .PeerPort(httpContext.Connection.RemotePort);
            _tracer.Tracer.SetCurrentSpan(span);
            return(span);
        }
        public void HttpRequest([Property(Name = "Request")] HttpRequestMessage request)
        {
            var patterns = _options.IgnoredRoutesRegexPatterns;

            if (patterns == null || patterns.Any(x => Regex.IsMatch(request.RequestUri.AbsolutePath, x)))
            {
                return;
            }
            var spanBuilder = new SpanBuilder($"httpclient {request.Method}");
            var spanContext = _tracer.Tracer.GetEntrySpan()?.SpanContext;

            if (spanContext != null)
            {
                spanBuilder.AsChildOf(spanContext);
            }
            var span = _tracer.Start(spanBuilder);

            span.Tags.Client().Component("HttpClient")
            .HttpMethod(request.Method.Method)
            .HttpUrl(request.RequestUri.OriginalString)
            .HttpHost(request.RequestUri.Host)
            .HttpPath(request.RequestUri.PathAndQuery)
            .PeerAddress(request.RequestUri.OriginalString)
            .PeerHostName(request.RequestUri.Host)
            .PeerPort(request.RequestUri.Port);

            _tracer.Tracer.Inject(span.SpanContext, request.Headers, (c, k, v) => c.Add(k, v));
            span.Log(LogField.CreateNew().ClientSend());
            if (request.Method == HttpMethod.Post)
            {
                span.Tags.Add("request", request.Content.ReadAsStringAsync().Result);
            }

            _tracer.Tracer.SetExitSpan(span);
        }
Esempio n. 3
0
        private void Initialization()
        {
            ITracer        tracer        = new Tracer(recorder);
            IServiceTracer serviceTracer = new ServiceTracer(tracer, "benckmark", "debug", "Butterfly.Client.Benckmark.Formatter");

            for (var i = 0; i < 250; i++)
            {
                using (var span = serviceTracer.Start("parent"))
                {
                    span.Log(LogField.CreateNew().ServerReceive());
                    span.Tags
                    .Server().Component("AspNetCore")
                    .HttpMethod("method")
                    .HttpUrl("url")
                    .HttpHost("host")
                    .HttpPath("path")
                    .HttpStatusCode(200)
                    .PeerAddress("ip")
                    .PeerPort(8080);
                    span.Log(LogField.CreateNew().ServerSend());

                    using (var child = serviceTracer.StartChild("child"))
                    {
                    }
                }
            }
        }
Esempio n. 4
0
        public void HttpResponse([Property(Name = "Response")] HttpResponseMessage response)
        {
            if (response == null)
            {
                return;
            }

            var span = _tracer.Tracer.GetExitSpan();

            if (span == null)
            {
                return;
            }

            span.Log(LogField.CreateNew().ClientReceive());
            span.Tags.HttpStatusCode((int)response.StatusCode);
            if (_options.TraceHttpContent && response.Content != null)
            {
                var result = response.Content.ReadAsStringAsync().Result;
                if (result.Length > 2048)
                {
                    result = result.Substring(0, 2048) + "...";
                }
                if (!string.IsNullOrWhiteSpace(result))
                {
                    span.Tags.Add("http.response", _tbbrRegex.Replace(result, ""));
                }
            }
            span.Finish();
            _tracer.Tracer.SetExitSpan(null);
        }
Esempio n. 5
0
        protected override async Task <HttpResponseMessage> TracingSendAsync(
            ISpan span,
            HttpRequestMessage request,
            CancellationToken cancellationToken,
            Action <string> addTraceIdToRepo,
            Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > baseSendAsync)
        {
            if (request.Headers.Contains(PrefixSpanId))
            {
                request.Headers.Remove(PrefixSpanId);
                request.Headers.TryAddWithoutValidation(PrefixSpanId, span.SpanContext.SpanId);
            }

            addTraceIdToRepo(span.SpanContext.TraceId);

            span.Log(LogField.CreateNew().ClientSend());

            var responseMessage = await baseSendAsync(request, cancellationToken);

            span.Log(LogField.CreateNew().ClientReceive());

            await Task.Run(() => SendSpan(span, request, responseMessage));

            return(responseMessage);
        }
Esempio n. 6
0
        public void Event(HttpContext httpContext, string @event)
        {
            // todo - if the user isnt using tracing the code gets here and will blow up on
            // _tracer.Tracer.TryExtract..
            if (_tracer == null)
            {
                return;
            }

            var span = httpContext.GetSpan();

            if (span == null)
            {
                var spanBuilder = new SpanBuilder($"server {httpContext.Request.Method} {httpContext.Request.Path}");
                if (_tracer.Tracer.TryExtract(out var spanContext, httpContext.Request.Headers, (c, k) => c[k].GetValue(),
                                              c => c.Select(x => new KeyValuePair <string, string>(x.Key, x.Value.GetValue())).GetEnumerator()))
                {
                    spanBuilder.AsChildOf(spanContext);
                }

                span = _tracer.Start(spanBuilder);
                httpContext.SetSpan(span);
            }

            span?.Log(LogField.CreateNew().Event(@event));
        }
        protected virtual async Task <HttpResponseMessage> TracingSendAsync(ISpan span, HttpRequestMessage request, CancellationToken cancellationToken)
        {
            IEnumerable <string> traceIdVals = null;

            if (request.Headers.TryGetValues(prefix_spanId, out traceIdVals))
            {
                request.Headers.Remove(prefix_spanId);
                request.Headers.TryAddWithoutValidation(prefix_spanId, span.SpanContext.SpanId);
            }

            span.Tags.Client().Component("HttpClient")
            .HttpMethod(request.Method.Method)
            .HttpUrl(request.RequestUri.OriginalString)
            .HttpHost(request.RequestUri.Host)
            .HttpPath(request.RequestUri.PathAndQuery)
            .PeerAddress(request.RequestUri.OriginalString)
            .PeerHostName(request.RequestUri.Host)
            .PeerPort(request.RequestUri.Port);

            _tracer.Tracer.Inject(span.SpanContext, request.Headers, (c, k, v) =>
            {
                if (!c.Contains(k))
                {
                    c.Add(k, v);
                }
            });

            span.Log(LogField.CreateNew().ClientSend());

            var responseMessage = await base.SendAsync(request, cancellationToken);

            span.Log(LogField.CreateNew().ClientReceive());

            return(responseMessage);
        }
        private void Event(HttpContext httpContext, string @event)
        {
            // todo - if the user isnt using tracing the code gets here and will blow up on
            // _tracer.Tracer.TryExtract. We already use the fake tracer for another scenario
            // so sticking it here as well..I guess we need a factory for this but cba to do it at
            // the moment
            if (_tracer.GetType() == typeof(FakeServiceTracer))
            {
                return;
            }

            var span = httpContext.GetSpan();

            if (span == null)
            {
                var spanBuilder = new SpanBuilder($"server {httpContext.Request.Method} {httpContext.Request.Path}");
                if (_tracer.Tracer.TryExtract(out var spanContext, httpContext.Request.Headers, (c, k) => c[k].GetValue(),
                                              c => c.Select(x => new KeyValuePair <string, string>(x.Key, x.Value.GetValue())).GetEnumerator()))
                {
                    spanBuilder.AsChildOf(spanContext);
                }

                span = _tracer.Start(spanBuilder);
                httpContext.SetSpan(span);
            }

            span?.Log(LogField.CreateNew().Event(@event));
        }
        public void BeginRequest([Property] HttpContext httpContext)
        {
            var patterns = _options.IgnoredRoutesRegexPatterns;

            if (patterns == null || patterns.Any(x => Regex.IsMatch(httpContext.Request.Path, x)))
            {
                return;
            }
            var spanBuilder = new SpanBuilder($"server {httpContext.Request.Method} {httpContext.Request.Path}");

            if (_tracer.Tracer.TryExtract(out var spanContext, httpContext.Request.Headers, (c, k) => c[k].GetValue(),
                                          c => c.Select(x => new KeyValuePair <string, string>(x.Key, x.Value.GetValue())).GetEnumerator()))
            {
                spanBuilder.AsChildOf(spanContext);
            }
            var span = _tracer.Start(spanBuilder);

            span.Log(LogField.CreateNew().ServerReceive());
            span.Log(LogField.CreateNew().Event("AspNetCore BeginRequest"));
            span.Tags
            .Server().Component("AspNetCore")
            .HttpMethod(httpContext.Request.Method)
            .HttpUrl($"{httpContext.Request.Scheme}://{httpContext.Request.Host.ToUriComponent()}{httpContext.Request.Path}{httpContext.Request.QueryString}")
            .HttpHost(httpContext.Request.Host.ToUriComponent())
            .HttpPath(httpContext.Request.Path)
            .HttpStatusCode(httpContext.Response.StatusCode)
            .PeerAddress(httpContext.Connection.RemoteIpAddress.ToString())
            .PeerPort(httpContext.Connection.RemotePort)
            .UserIp(httpContext.GetUserIp());

            _tracer.Tracer.SetEntrySpan(span);
        }
        public void BeginRequest([Property] HttpContext httpContext)
        {
            if (IgnoredRoute(httpContext.Request.Path))
            {
                return;
            }

            var carrier = _contextCarrierFactory.Create();

            foreach (var item in carrier.Items)
            {
                item.HeadValue = httpContext.Request.Headers[item.HeadKey];
            }

            var httpRequestSpan = ContextManager.CreateEntrySpan($"{_skrTraceOptions.ApplicationCode} {httpContext.Request.Path}", carrier);

            httpRequestSpan.AsHttp();
            httpRequestSpan.SetComponent(SpanComponent.AspNetCore);
            httpRequestSpan.Tags.Server()
            .HttpMethod(httpContext.Request.Method)
            .HttpUrl(httpContext.Request.GetDisplayUrl());

            httpRequestSpan.Log(LogField.CreateNew().Event("AspNetCore Hosting BeginRequest")
                                .Message($"Request starting {httpContext.Request.Protocol} {httpContext.Request.Method} {httpContext.Request.GetDisplayUrl()}"));
        }
        public void BeforeOnException(ExceptionContext exceptionContext)
        {
            var httpContext = exceptionContext.HttpContext;

            Event(httpContext, "Microsoft.AspNetCore.Mvc.BeforeOnException");
            var span = httpContext.GetSpan();

            span?.Log(LogField.CreateNew().EventError().ErrorKind(exceptionContext.Exception).ErrorObject(exceptionContext.Exception).Stack(exceptionContext.Exception.StackTrace));
        }
        public void DiagnosticUnhandledException([Property] HttpContext httpContext, [Property] Exception exception)
        {
            var span = _tracer.Tracer.GetEntrySpan();

            if (span == null)
            {
                return;
            }
            span.Log(LogField.CreateNew().Event("AspNetCore UnhandledException"));
            span.Exception(exception);
        }
Esempio n. 13
0
        public void OnException(HttpContext httpContext, Exception exception, string @event)
        {
            var span = httpContext.GetSpan();

            if (span == null)
            {
                return;
            }
            span.Log(LogField.CreateNew().Event(@event));
            span.Exception(exception);
        }
        public void EndRequest([Property] HttpContext httpContext)
        {
            var span = _tracer.Tracer.GetEntrySpan();

            if (span == null)
            {
                return;
            }
            span.Tags.HttpStatusCode(httpContext.Response.StatusCode);

            span.Log(LogField.CreateNew().Event("AspNetCore EndRequest"));
            span.Log(LogField.CreateNew().ServerSend());
            span.Finish();
            _tracer.Tracer.SetEntrySpan(null);
        }
Esempio n. 15
0
        public static ISpan Exception(this ISpan span, Exception exception)
        {
            if (span == null)
            {
                return(span);
            }

            if (exception == null)
            {
                throw new ArgumentNullException(nameof(exception));
            }
            span.ErrorOccurred();
            span.Log(LogField.CreateNew().EventError().ErrorKind(exception).Message(exception.Message).Stack(exception.StackTrace));
            return(span);
        }
Esempio n. 16
0
        public ISpan OnBeginRequest(HttpContext httpContext)
        {
            var spanBuilder = new SpanBuilder($"server {httpContext.Request.Method} {httpContext.Request.Path}");

            if (_tracer.Tracer.TryExtract(out var spanContext, httpContext.Request.Headers, (c, k) => c[k],
                                          c => c.Select(x => new KeyValuePair <string, string>(x.Key, x.Value)).GetEnumerator()))
            {
                spanBuilder.AsChildOf(spanContext);
            }
            var span = _tracer.Start(spanBuilder);

            httpContext.SetSpan(span);
            span.Log(LogField.CreateNew().ServerReceive());
            span.Log(LogField.CreateNew().Event("Microsoft.AspNetCore.Hosting.BeginRequest"));
            _tracer.Tracer.SetCurrentSpan(span);
            return(span);
        }
Esempio n. 17
0
        public async override Task Invoke(AspectContext context, AspectDelegate next)
        {
            var serviceType = context.ServiceMethod.DeclaringType;

            if (excepts.Any(x => serviceType.Name.Matches(x)) || excepts.Any(x => serviceType.Namespace.Matches(x)) || context.Implementation is IServiceTracer)
            {
                await context.Invoke(next);

                return;
            }
            await ServiceTracer?.ChildTraceAsync(context.ServiceMethod.GetReflector().DisplayName, DateTimeOffset.UtcNow, async span =>
            {
                span.Log(LogField.CreateNew().MethodExecuting());
                span.Tags.Set("ServiceType", context.ServiceMethod.DeclaringType.GetReflector().FullDisplayName);
                span.Tags.Set("ImplementationType", context.ImplementationMethod.DeclaringType.GetReflector().FullDisplayName);
                await context.Invoke(next);
                span.Log(LogField.CreateNew().MethodExecuted());
            });
        }
Esempio n. 18
0
        protected virtual async Task <HttpResponseMessage> TracingSendAsync(
            OpenTracing.ISpan span,
            HttpRequestMessage request,
            CancellationToken cancellationToken,
            Action <string> addTraceIdToRepo,
            Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > baseSendAsync)
        {
            if (request.Headers.Contains(PrefixSpanId))
            {
                request.Headers.Remove(PrefixSpanId);
                request.Headers.TryAddWithoutValidation(PrefixSpanId, span.Context.SpanId);
            }

            addTraceIdToRepo(span.Context.TraceId);

            span.SetTag(Tags.SpanKind, Tags.SpanKindClient)
            .SetTag(Tags.HttpMethod, request.Method.Method)
            .SetTag(Tags.HttpUrl, request.RequestUri.ToString())
            //.SetTag(Tags.Host(request.RequestUri.Host)
            //.HttpPath(request.RequestUri.PathAndQuery)
            //.SetTag(Tags.PeerHostname(request.RequestUri.OriginalString)
            .SetTag(Tags.PeerHostname, request.RequestUri.Host)
            .SetTag(Tags.PeerPort, request.RequestUri.Port)
            ;

            var dictionary = new Dictionary <string, string>();

            _tracer.Inject(span.Context, BuiltinFormats.HttpHeaders, new TextMapInjectAdapter(dictionary));
            foreach (var entry in dictionary)
            {
                request.Headers.Add(entry.Key, entry.Value);
            }

            span.Log(LogField.CreateNew().ClientSend());

            var responseMessage = await baseSendAsync(request, cancellationToken);

            span.Log(LogField.CreateNew().ClientReceive());

            return(responseMessage);
        }
Esempio n. 19
0
        protected virtual async Task <HttpResponseMessage> TracingSendAsync(ISpan span, HttpRequestMessage request, CancellationToken cancellationToken)
        {
            span.Tags.Client().Component("HttpClient")
            .HttpMethod(request.Method.Method)
            .HttpUrl(request.RequestUri.OriginalString)
            .HttpHost(request.RequestUri.Host)
            .HttpPath(request.RequestUri.PathAndQuery)
            .PeerAddress(request.RequestUri.OriginalString)
            .PeerHostName(request.RequestUri.Host)
            .PeerPort(request.RequestUri.Port);

            _tracer.Tracer.Inject(span.SpanContext, request.Headers, (c, k, v) => c.Add(k, v));

            span.Log(LogField.CreateNew().ClientSend());

            var responseMessage = await base.SendAsync(request, cancellationToken);

            span.Log(LogField.CreateNew().ClientReceive());

            return(responseMessage);
        }
        public void HttpResponse([Property(Name = "Response")] HttpResponseMessage response)
        {
            var span = _tracer.Tracer.GetExitSpan();

            if (span == null)
            {
                return;
            }

            span.Log(LogField.CreateNew().ClientReceive());
            span.Tags.HttpStatusCode((int)response.StatusCode);

            var result = response.Content.ReadAsStringAsync().Result;

            if (result.Length > 2048)
            {
                result = result.Substring(0, 2048) + "...";
            }
            span.Tags.Add("response", result);

            span.Finish();
            _tracer.Tracer.SetExitSpan(null);
        }
Esempio n. 21
0
        public void OnEndRequest(HttpContext httpContext)
        {
            var span = httpContext.GetSpan();

            if (span == null)
            {
                return;
            }

            span.Tags
            .Server().Component("AspNetCore")
            .HttpMethod(httpContext.Request.Method)
            .HttpUrl($"{httpContext.Request.Scheme}://{httpContext.Request.Host.ToUriComponent()}{httpContext.Request.Path}{httpContext.Request.QueryString}")
            .HttpHost(httpContext.Request.Host.ToUriComponent())
            .HttpPath(httpContext.Request.Path)
            .HttpStatusCode(httpContext.Response.StatusCode)
            .PeerAddress(httpContext.Connection.RemoteIpAddress.ToString())
            .PeerPort(httpContext.Connection.RemotePort);
            span.Log(LogField.CreateNew().Event("Microsoft.AspNetCore.Hosting.EndRequest"));
            span.Log(LogField.CreateNew().ServerSend());
            span.Finish();
            _tracer.Tracer.SetCurrentSpan(null);
        }
        public void EndRequest([Property] HttpContext httpContext)
        {
            var httpRequestSpan = ContextManager.ActiveSpan;

            if (httpRequestSpan == null)
            {
                return;
            }

            var statusCode = httpContext.Response.StatusCode;

            if (statusCode >= 400)
            {
                httpRequestSpan.ErrorOccurred();
            }

            httpRequestSpan.Tags.HttpStatusCode(statusCode);

            httpRequestSpan.Log(LogField.CreateNew().Event("AspNetCore Hosting EndRequest")
                                .Message($"Request finished {httpContext.Response.StatusCode} {httpContext.Response.ContentType}"));

            ContextManager.StopSpan(httpRequestSpan);
        }
Esempio n. 23
0
        private void Event(HttpContext httpContext, string @event)
        {
            var span = httpContext.GetSpan();

            span?.Log(LogField.CreateNew().Event(@event));
        }