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);
            }
        }
Exemplo n.º 2
0
        private string GetOcelotRequestId()
        {
            var requestId = _scopedDataRepository.Get <string>("RequestId");

            if (requestId == null || requestId.IsError)
            {
                return("no request id");
            }

            return(requestId.Data);
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        public Placeholders(IBaseUrlFinder finder, IRequestScopedDataRepository repo)
        {
            _repo = repo;
            _finder = finder;
            _placeholders = new Dictionary<string, Func<Response<string>>>();
            _placeholders.Add("{BaseUrl}", () => new OkResponse<string>(_finder.Find()));
            _placeholders.Add("{TraceId}", () => {
                var traceId = _repo.Get<string>("TraceId");
                if(traceId.IsError)
                {
                    return new ErrorResponse<string>(traceId.Errors);
                }

                return new OkResponse<string>(traceId.Data);
            });

            _requestPlaceholders = new Dictionary<string, Func<HttpRequestMessage, string>>();
            _requestPlaceholders.Add("{DownstreamBaseUrl}", x => {
                var downstreamUrl = $"{x.RequestUri.Scheme}://{x.RequestUri.Host}";

                if(x.RequestUri.Port != 80 && x.RequestUri.Port != 443)
                {
                    downstreamUrl = $"{downstreamUrl}:{x.RequestUri.Port}";
                }

                return $"{downstreamUrl}/";
            });
        }
        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);
            }
        }
Exemplo n.º 6
0
        private string GetMessageWithOcelotRequestId(string message)
        {
            var requestId = _scopedDataRepository.Get <string>("RequestId");

            if (requestId != null && !requestId.IsError)
            {
                return($"{message} : OcelotRequestId - {requestId.Data}");
            }
            return($"{message} : OcelotRequestId - not set");
        }
Exemplo n.º 7
0
        private Func <Response <string> > GetTraceId()
        {
            return(() =>
            {
                var traceId = _repo.Get <string>("TraceId");
                if (traceId.IsError)
                {
                    return new ErrorResponse <string>(traceId.Errors);
                }

                return new OkResponse <string>(traceId.Data);
            });
        }
Exemplo n.º 8
0
        public async Task Invoke(HttpContext context)
        {
            ErrorResult errorInfo   = null;
            var         isException = false;

            try
            {
                await _next(context);
            }
            catch (BucketException ex)
            {
                var newMsg = _errorCodeStore.StringGet(ex.ErrorCode);
                if (string.IsNullOrWhiteSpace(newMsg))
                {
                    newMsg = ex.ErrorMessage;
                }
                errorInfo = new ErrorResult(ex.ErrorCode, newMsg);
            }
            catch (Exception ex)
            {
                errorInfo   = new ErrorResult("-1", "系统开小差了,请稍后再试");
                isException = true;
                _logger.LogError(ex, $"全局异常捕获,状态码:{ context?.Response?.StatusCode},Url:{context?.Request?.GetDisplayUrl()}");
            }
            finally
            {
                if (errorInfo != null)
                {
                    var Message = JsonConvert.SerializeObject(errorInfo);
                    var trace   = _requestScopedDataRepository.Get <TraceLogs>(TracerKeys.TraceStoreCacheKey);
                    if (trace != null)
                    {
                        trace.Response    = Message;
                        trace.IsSuccess   = true;
                        trace.IsException = isException;
                        trace.Code        = errorInfo.ErrorCode;
                        _requestScopedDataRepository.Add(TracerKeys.TraceStoreCacheKey, trace);
                    }
                    await HandleExceptionAsync(context, Message);
                }
            }
        }
Exemplo n.º 9
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);
            }
        }
Exemplo n.º 10
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
            }
        }
 private void WhenIGetTheItem()
 {
     _result = _requestScopedDataRepository.Get <int[]>(_key);
 }