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); } }
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 } }