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 string GetOcelotRequestId() { var requestId = _scopedDataRepository.Get <string>("RequestId"); if (requestId == null || requestId.IsError) { return("no request id"); } return(requestId.Data); }
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); } }
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); } }
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"); }
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); }); }
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); } } }
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); } }
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); }