public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var trace = requestScopedDataRepository.Get <TraceLogs>(TracerKeys.TraceStoreCacheKey);

            if (trace != null)
            {
                if (context.HttpContext.Request.Method.ToLower() == HttpMethod.Post.ToString().ToLower())
                {
                    if (context.HttpContext.Request.Body.CanRead)
                    {
                        var memery = new MemoryStream();
                        context.HttpContext.Request.Body.CopyTo(memery);
                        memery.Position = 0;
                        trace.Request   = new StreamReader(memery, Encoding.UTF8).ReadToEnd();
                        memery.Position = 0;
                        context.HttpContext.Request.Body = memery;
                    }
                }
                else if (context.HttpContext.Request.Method.ToLower() == HttpMethod.Get.ToString().ToLower())
                {
                    trace.Request = context.HttpContext.Request.QueryString.Value;
                }
                requestScopedDataRepository.Update(TracerKeys.TraceStoreCacheKey, trace);
            }
        }
        private void SetOcelotRequestId(DownstreamContext context)
        {
            var key = context.DownstreamReRoute.RequestIdKey ?? DefaultRequestIdKey.Value;

            if (context.HttpContext.Request.Headers.TryGetValue(key, out var upstreamRequestIds))
            {
                context.HttpContext.TraceIdentifier = upstreamRequestIds.First();

                var previousRequestId = _requestScopedDataRepository.Get <string>("RequestId");
                if (!previousRequestId.IsError && !string.IsNullOrEmpty(previousRequestId.Data) && previousRequestId.Data != context.HttpContext.TraceIdentifier)
                {
                    _requestScopedDataRepository.Add("PreviousRequestId", previousRequestId.Data);
                    _requestScopedDataRepository.Update("RequestId", context.HttpContext.TraceIdentifier);
                }
                else
                {
                    _requestScopedDataRepository.Add("RequestId", context.HttpContext.TraceIdentifier);
                }
            }

            var requestId = new RequestId(context.DownstreamReRoute.RequestIdKey, context.HttpContext.TraceIdentifier);

            if (ShouldAddRequestId(requestId, context.DownstreamRequest.Headers))
            {
                AddRequestIdHeader(requestId, context.DownstreamRequest);
            }
        }
        private void SetOcelotRequestId(HttpContext context)
        {
            // if get request ID is set on upstream request then retrieve it
            var key = DownstreamRoute.ReRoute.RequestIdKey ?? DefaultRequestIdKey.Value;

            StringValues upstreamRequestIds;

            if (context.Request.Headers.TryGetValue(key, out upstreamRequestIds))
            {
                //set the traceidentifier
                context.TraceIdentifier = upstreamRequestIds.First();

                //check if we have previous id
                var previousRequestId = _requestScopedDataRepository.Get <string>("RequestId");
                if (!previousRequestId.IsError && !string.IsNullOrEmpty(previousRequestId.Data))
                {
                    //we have a previous request id lets store it and update request id
                    _requestScopedDataRepository.Add <string>("PreviousRequestId", previousRequestId.Data);
                    _requestScopedDataRepository.Update <string>("RequestId", context.TraceIdentifier);
                }
                else
                {
                    //else just add request id
                    _requestScopedDataRepository.Add <string>("RequestId", context.TraceIdentifier);
                }
            }

            // set request ID on downstream request, if required
            var requestId = new RequestId(DownstreamRoute?.ReRoute?.RequestIdKey, context.TraceIdentifier);

            if (ShouldAddRequestId(requestId, DownstreamRequest.Headers))
            {
                AddRequestIdHeader(requestId, DownstreamRequest);
            }
        }
示例#4
0
        public async Task Invoke(HttpContext context)
        {
            var trace = new TraceLogs()
            {
                ApiUri      = context?.Request?.GetDisplayUrl(),
                StartTime   = DateTime.Now,
                ContextType = context?.Request?.ContentType
            };

            _tracer.AddHeadersToTracer(context, trace);
            _requestScopedDataRepository.Add(TracerKeys.TraceStoreCacheKey, trace);

            await _next(context);

            trace = _requestScopedDataRepository.Get <TraceLogs>(TracerKeys.TraceStoreCacheKey);
            if (trace != null)
            {
                trace.EndTime    = DateTime.Now;
                trace.TimeLength = Math.Round((trace.EndTime - trace.StartTime).TotalMilliseconds, 4);
                _requestScopedDataRepository.Update(TracerKeys.TraceStoreCacheKey, trace);
                await _tracer.PublishAsync(trace);
            }
        }
示例#5
0
        public void AddHeadersToTracer <T>(HttpContext httpContext, T traceLogs)
        {
            if (traceLogs.GetType().Equals(typeof(TraceLogs)))
            {
                var trace = traceLogs as TraceLogs;

                #region 系统参数
                trace.Environment = _tracerOptions.Environment;
                trace.SystemName  = _tracerOptions.SystemName;
                #endregion

                #region 跟踪Id
                if (string.IsNullOrWhiteSpace(trace.TraceId))
                {
                    if (httpContext.Request.Headers.ContainsKey(TracerKeys.TraceId))
                    {
                        trace.TraceId = httpContext.Request.Headers[TracerKeys.TraceId].FirstOrDefault();
                    }
                    else
                    {
                        trace.TraceId = Guid.NewGuid().ToString("N");
                        httpContext.Request.Headers.Add(TracerKeys.TraceId, trace.TraceId);
                    }
                }
                #endregion

                #region 用户标识
                if (string.IsNullOrWhiteSpace(trace.LaunchId) && httpContext.User.HasClaim(it => it.Type == TracerKeys.TraceLaunchId))
                {
                    trace.LaunchId = httpContext.User.Claims.First(c => c.Type == TracerKeys.TraceLaunchId).Value;
                }
                #endregion

                #region 项目标识
                if (string.IsNullOrWhiteSpace(trace.ModName) && httpContext.Request.Headers.ContainsKey(TracerKeys.TraceModName))
                {
                    trace.ModName = httpContext.Request.Headers[TracerKeys.TraceModName].FirstOrDefault();
                }
                else
                {
                    trace.ModName = trace.SystemName;
                }
                #endregion

                #region 父级序列号
                if (string.IsNullOrWhiteSpace(trace.ParentId))
                {
                    if (httpContext.Request.Headers.ContainsKey(TracerKeys.TraceSeq))
                    {
                        trace.ParentId = httpContext.Request.Headers[TracerKeys.TraceSeq].FirstOrDefault();
                    }
                    else
                    {
                        trace.ParentId = trace.TraceId;
                    }
                }
                #endregion

                #region 当前序列号
                int traceSort = _requestScopedDataRepository.Get <int>(TracerKeys.TraceSort);
                traceSort    = traceSort + 1;
                trace.Id     = Guid.NewGuid().ToString("N");
                trace.SortId = traceSort;

                if (traceSort == 1)
                {
                    httpContext.Request.Headers.Add(TracerKeys.TraceSeq, trace.Id);
                }

                _requestScopedDataRepository.Update <int>(TracerKeys.TraceSort, traceSort);
                _requestScopedDataRepository.Update <string>(TracerKeys.TraceSeq, trace.Id);
                #endregion
            }
        }