Beispiel #1
0
 internal static void CaptureSpan(ISpan span, Action capturedAction)
 {
     try
     {
         capturedAction();
     }
     catch (Exception e) when(ExceptionFilter.Capture(e, span))
     {
     }
     finally
     {
         span.End();
     }
 }
Beispiel #2
0
        public void CaptureTransaction(string name, string type, Action <ITransaction> action, DistributedTracingData distributedTracingData = null)
        {
            var transaction = StartTransaction(name, type, distributedTracingData);

            try
            {
                action(transaction);
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                transaction.End();
            }
        }
Beispiel #3
0
        public void CaptureTransaction(string name, string type, Action action)
        {
            var transaction = StartTransaction(name, type);

            try
            {
                action();
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                transaction.End();
            }
        }
Beispiel #4
0
        public void CaptureSpan(string name, string type, Action capturedAction, string subType = null, string action = null)
        {
            var span = StartSpan(name, type, subType, action);

            try
            {
                capturedAction();
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, span))
            {
            }
            finally
            {
                span.End();
            }
        }
Beispiel #5
0
        public void CaptureTransaction(string name, string type, Action action, DistributedTracingData distributedTracingData = null, IEnumerable <SpanLink> links = null)
        {
            var transaction = StartTransaction(name, type, distributedTracingData, links: links);

            try
            {
                action();
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                transaction.End();
            }
        }
Beispiel #6
0
        public async Task InvokeAsync(HttpContext context)
        {
            var transaction = Agent.Tracer.StartTransaction($"{context.Request.Method} {context.Request.Path}",
                                                            Transaction.TYPE_REQUEST);

            transaction.Context = new Context
            {
                Request = new Request
                {
                    Method = context.Request.Method,
                    Socket = new Socket
                    {
                        Encrypted      = context.Request.IsHttps,
                        Remote_address = context.Connection?.RemoteIpAddress?.ToString()
                    },
                    Url = new Url
                    {
                        Full     = context.Request?.Path.Value,
                        HostName = context.Request.Host.Host,
                        Protocol = GetProtocolName(context.Request.Protocol),
                        Raw      = context.Request?.Path.Value //TODO
                    },
                    HttpVersion = GetHttpVersion(context.Request.Protocol)
                }
            };

            try
            {
                await next(context);
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                transaction.Result =
                    $"{GetProtocolName(context.Request.Protocol)} {context.Response.StatusCode.ToString()[0]}xx";
                transaction.Context.Response = new Response
                {
                    Finished    = context.Response.HasStarted, //TODO ?
                    Status_code = context.Response.StatusCode
                };

                transaction.End();
            }
        }
Beispiel #7
0
        public async Task InvokeAsync(HttpContext context)
        {
            var transaction = StartTransaction(context);

            try
            {
                await _next(context);
            }
            catch (Exception e) when(transaction != null &&
                                     ExceptionFilter.Capture(e, transaction, context, _configurationReader, _logger))
            {
            }
            finally
            {
                StopTransaction(transaction, context);
            }
        }
Beispiel #8
0
        internal static T CaptureSpan <T>(ISpan span, Func <T> func)
        {
            var retVal = default(T);

            try
            {
                retVal = func();
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, span))
            {
            }
            finally
            {
                span.End();
            }

            return(retVal);
        }
Beispiel #9
0
        public T CaptureTransaction <T>(string name, string type, Func <T> func, DistributedTracingData distributedTracingData = null)
        {
            var transaction = StartTransaction(name, type, distributedTracingData);
            var retVal      = default(T);

            try
            {
                retVal = func();
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                transaction.End();
            }

            return(retVal);
        }
Beispiel #10
0
        public T CaptureSpan <T>(string name, string type, Func <T> func, string subType = null, string action = null)
        {
            var span   = StartSpan(name, type, subType, action);
            var retVal = default(T);

            try
            {
                retVal = func();
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, span))
            {
            }
            finally
            {
                span.End();
            }

            return(retVal);
        }
Beispiel #11
0
        public T CaptureTransaction <T>(string name, string type, Func <ITransaction, T> func)
        {
            var transaction = StartTransaction(name, type);
            var retVal      = default(T);

            try
            {
                retVal = func(transaction);
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                transaction.End();
            }

            return(retVal);
        }
        /// <summary>
        /// Registers a continuation on the task.
        /// Within the continuation it ends the transaction and captures errors
        /// </summary>
        /// <param name="task">Task.</param>
        /// <param name="transaction">Transaction.</param>
        private void RegisterContinuation(Task task, ISpan span)
        {
            task.ContinueWith((t) =>
            {
                if (t.IsFaulted)
                {
                    if (t.Exception != null)
                    {
                        if (t.Exception is AggregateException aggregateException)
                        {
                            ExceptionFilter.Capture(
                                aggregateException.InnerExceptions.Count == 1
                                    ? aggregateException.InnerExceptions[0]
                                    : aggregateException.Flatten(), span);
                        }
                        else
                        {
                            ExceptionFilter.Capture(t.Exception, span);
                        }
                    }
                    else
                    {
                        span.CaptureError("Task faulted", "A task faulted", new StackTrace().GetFrames());
                    }
                }
                else if (t.IsCanceled)
                {
                    if (t.Exception == null)
                    {
                        span.CaptureError("Task canceled", "A task was canceled", new StackTrace().GetFrames()); //TODO: this async stacktrace is hard to use, make it readable!
                    }
                    else
                    {
                        span.CaptureException(t.Exception);
                    }
                }

                span.End();
            }, System.Threading.CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
        }
Beispiel #13
0
        public async Task <T> CaptureTransaction <T>(string name, string type, Func <Task <T> > func, DistributedTracingData distributedTracingData = null, IEnumerable <SpanLink> links = null)
        {
            var transaction = StartTransaction(name, type, distributedTracingData, links: links);

            try
            {
                return(await func());
            }
            catch (OperationCanceledException ex)
            {
                transaction.CaptureError("Task canceled", "A task was canceled", new StackTrace(ex).GetFrames());

                throw;
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                transaction.End();
            }
            return(default);
Beispiel #14
0
        public async Task InvokeAsync(HttpContext context)
        {
            var transaction = _tracer.StartTransactionInternal($"{context.Request.Method} {context.Request.Path}",
                                                               ApiConstants.TypeRequest);

            var url = new Url
            {
                Full     = context.Request?.Path.Value,
                HostName = context.Request.Host.Host,
                Protocol = GetProtocolName(context.Request.Protocol),
                Raw      = context.Request?.Path.Value            //TODO
            };

            Dictionary <string, string> requestHeaders = null;

            if (_configurationReader.CaptureHeaders)
            {
                requestHeaders = new Dictionary <string, string>();

                foreach (var header in context.Request.Headers)
                {
                    requestHeaders.Add(header.Key, header.Value.ToString());
                }
            }

            transaction.Context.Request = new Request(context.Request.Method, url)
            {
                Socket = new Socket
                {
                    Encrypted     = context.Request.IsHttps,
                    RemoteAddress = context.Connection?.RemoteIpAddress?.ToString()
                },
                HttpVersion = GetHttpVersion(context.Request.Protocol),
                Headers     = requestHeaders
            };

            try
            {
                await _next(context);
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                Dictionary <string, string> responseHeaders = null;

                if (_configurationReader.CaptureHeaders)
                {
                    responseHeaders = new Dictionary <string, string>();

                    foreach (var header in context.Response.Headers)
                    {
                        responseHeaders.Add(header.Key, header.Value.ToString());
                    }
                }

                transaction.Result           = $"{GetProtocolName(context.Request.Protocol)} {context.Response.StatusCode.ToString()[0]}xx";
                transaction.Context.Response = new Response
                {
                    Finished   = context.Response.HasStarted,                   //TODO ?
                    StatusCode = context.Response.StatusCode,
                    Headers    = responseHeaders
                };

                transaction.End();
            }
        }
Beispiel #15
0
        public async Task InvokeAsync(HttpContext context)
        {
            Transaction transaction;

            if (context.Request.Headers.ContainsKey(TraceParent.TraceParentHeaderName))
            {
                var headerValue = context.Request.Headers[TraceParent.TraceParentHeaderName].ToString();

                var distributedTracingData = TraceParent.TryExtractTraceparent(headerValue);
                if (distributedTracingData != null)
                {
                    _logger.Debug()
                    ?.Log(
                        "Incoming request with {TraceParentHeaderName} header. DistributedTracingData: {DistributedTracingData}. Continuing trace.",
                        TraceParent.TraceParentHeaderName, distributedTracingData);

                    transaction = _tracer.StartTransactionInternal(
                        $"{context.Request.Method} {context.Request.Path}",
                        ApiConstants.TypeRequest,
                        distributedTracingData);
                }
                else
                {
                    _logger.Debug()
                    ?.Log(
                        "Incoming request with invalid {TraceParentHeaderName} header (received value: {TraceParentHeaderValue}). Starting trace with new trace id.",
                        TraceParent.TraceParentHeaderName, headerValue);

                    transaction = _tracer.StartTransactionInternal($"{context.Request.Method} {context.Request.Path}",
                                                                   ApiConstants.TypeRequest);
                }
            }
            else
            {
                _logger.Debug()?.Log("Incoming request. Starting Trace.");
                transaction = _tracer.StartTransactionInternal($"{context.Request.Method} {context.Request.Path}",
                                                               ApiConstants.TypeRequest);
            }

            if (transaction.IsSampled)
            {
                FillSampledTransactionContextRequest(context, transaction);
            }

            try
            {
                await _next(context);
            }
            catch (Exception e) when(ExceptionFilter.Capture(e, transaction))
            {
            }
            finally
            {
                //fixup Transaction.Name - e.g. /user/profile/1 -> /user/profile/{id}
                var routeData = (context.Features[typeof(IRoutingFeature)] as IRoutingFeature)?.RouteData;
                if (routeData != null)
                {
                    var name = GetNameFromRouteContext(routeData.Values);

                    if (!string.IsNullOrWhiteSpace(name))
                    {
                        transaction.Name = $"{context.Request.Method} {name}";
                    }
                }

                transaction.Result = Transaction.StatusCodeToResult(GetProtocolName(context.Request.Protocol), context.Response.StatusCode);

                if (transaction.IsSampled)
                {
                    FillSampledTransactionContextResponse(context, transaction);
                    FillSampledTransactionContextUser(context, transaction);
                }

                transaction.End();
            }
        }