protected virtual ISpan CreateSpan(string activityId, string parentId, string operationName, CommandEventData eventData, IEfCoreSpanMetadataProvider metadataProvider)
        {
            var span = ConcurrentContextManager.CreateExitSpan(operationName, metadataProvider.GetPeer(eventData.Command.Connection), activityId, parentId);

            span.SetComponent(metadataProvider.Component);
            return(span);
        }
        private ISpan CreateDefaultSpan(string activityId, string parentId, string operationName, CommandEventData eventData)
        {
            var span = ConcurrentContextManager.CreateLocalSpan(operationName, activityId, parentId);

            span.SetComponent(ComponentsDefine.EntityFrameworkCore);
            return(span);
        }
        public void EndRequest([Property] HttpContext httpContext)
        {
            var httpRequestSpan = ConcurrentContextManager.ActiveSpan(Activity.Current.Id);

            if (httpRequestSpan == null)
            {
                return;
            }

            var statusCode = httpContext.Response.StatusCode;

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

            Tags.StatusCode.Set(httpRequestSpan, statusCode.ToString());
            httpRequestSpan.Log(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
                                new Dictionary <string, object>
            {
                { "event", "AspNetCore Hosting EndRequest" },
                { "message", $"Request finished {httpContext.Response.StatusCode} {httpContext.Response.ContentType}" }
            });
            ConcurrentContextManager.StopSpan(httpRequestSpan, Activity.Current.Id);
        }
        public void BeginRequest([Property] HttpContext httpContext)
        {
//            Console.WriteLine($"{Activity.Current.Id} {Activity.Current.ParentId} {Activity.Current.RootId}");
            var carrier = _contextCarrierFactory.Create();

            foreach (var item in carrier.Items)
            {
                item.HeadValue = httpContext.Request.Headers[item.HeadKey];
            }
            var httpRequestSpan = ConcurrentContextManager.CreateEntrySpan($"{_config.ApplicationCode} {httpContext.Request.Path}", carrier, Activity.Current.Id, Activity.Current.ParentId);

            httpRequestSpan.AsHttp();
            httpRequestSpan.SetComponent(ComponentsDefine.AspNetCore);
            Tags.Url.Set(httpRequestSpan, httpContext.Request.Path);
            Tags.HTTP.Method.Set(httpRequestSpan, httpContext.Request.Method);
            httpRequestSpan.Log(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
                                new Dictionary <string, object>
            {
                { "event", "AspNetCore Hosting BeginRequest" },
                { "currentActivityId", Activity.Current.Id },
                { "currentThreadId", Thread.CurrentThread.ManagedThreadId },
                { "Priority", Thread.CurrentThread.Priority },
                { "GlobalTraceId", ConcurrentContextManager.GlobalTraceId },
                { "message", $"Request starting {httpContext.Request.Protocol} {httpContext.Request.Method} {httpContext.Request.GetDisplayUrl()}" }
            });
            httpContext.Items[HttpContextDiagnosticStrings.SpanKey] = httpRequestSpan;
        }
 public void AfterExecuteCommand()
 {
     if (ConcurrentContextManager.ContextProperties.ContainsKey(TRACE_ORM))
     {
         return;
     }
     ConcurrentContextManager.StopSpan(Activity.Current.Id);
 }
        public void HttpException([Property(Name = "Request")] HttpRequestMessage request,
                                  [Property(Name = "Exception")] Exception ex)
        {
            var span = ConcurrentContextManager.ActiveSpan(Activity.Current.Id);

            if (span != null && span.IsExit)
            {
                span.ErrorOccurred();
            }
        }
        public void HttpResponse([Property(Name = "Response")] HttpResponseMessage response, [Property(Name = "RequestTaskStatus")] TaskStatus taskStatus)
        {
            var span = ConcurrentContextManager.ActiveSpan(Activity.Current.Id);

            if (span != null && response != null)
            {
                Tags.StatusCode.Set(span, response.StatusCode.ToString());
            }

            ConcurrentContextManager.StopSpan(Activity.Current.Id);
        }
        public void ErrorExecuteCommand([Property(Name = "Exception")] Exception ex)
        {
            if (ConcurrentContextManager.ContextProperties.ContainsKey(TRACE_ORM))
            {
                return;
            }
            var span = ConcurrentContextManager.ActiveSpan(Activity.Current.Id);

            span?.ErrorOccurred();
            span?.Log(ex);
            ContextManager.StopSpan(span);
        }
        public void HttpRequest([Property(Name = "Request")] HttpRequestMessage request)
        {
//            Console.WriteLine($"{Activity.Current.Id} {Activity.Current.ParentId} {Activity.Current.RootId}");
            var contextCarrier = _contextCarrierFactory.Create();
            var peer           = $"{request.RequestUri.Host}:{request.RequestUri.Port}";
            var span           = ConcurrentContextManager.CreateExitSpan(request.RequestUri.ToString(), contextCarrier, peer, Activity.Current.Id, Activity.Current.ParentId, Activity.Current.FormatRootId());

            Tags.Url.Set(span, request.RequestUri.ToString());
            span.AsHttp();
            span.SetComponent(ComponentsDefine.HttpClient);
            Tags.HTTP.Method.Set(span, request.Method.ToString());
            foreach (var item in contextCarrier.Items)
            {
                request.Headers.Add(item.HeadKey, item.HeadValue);
            }
        }
        public void BeforeExecuteCommand([Property(Name = "Command")] SqlCommand sqlCommand)
        {
            if (ConcurrentContextManager.ContextProperties.ContainsKey(TRACE_ORM))
            {
                return;
            }
            var peer = sqlCommand.Connection.DataSource;
            var span = ConcurrentContextManager.CreateExitSpan(ResolveOperationName(sqlCommand), peer, Activity.Current.Id, Activity.Current.ParentId);

            span.SetLayer(SpanLayer.DB);
            span.SetComponent(ComponentsDefine.SqlClient);
            Tags.DbType.Set(span, "Sql");
            Tags.DbInstance.Set(span, sqlCommand.Connection.Database);
            Tags.DbStatement.Set(span, sqlCommand.CommandText);
            //todo Tags.DbBindVariables
        }
 public void HostingUnhandledException([Property] HttpContext httpContext, [Property] Exception exception)
 {
     ConcurrentContextManager.ActiveSpan(Activity.Current.Id)?.ErrorOccurred()?.Log(exception);
 }