/// <summary> /// 结束会话跟踪 /// </summary> /// <param name="traceContext">跟踪上下文</param> public static void EndSpan(UrlTraceContext traceContext) { try { if (traceContext.TraceSpan != null) traceContext.TraceSpan.Stop(); } catch { } }
/// <summary> /// 创建新的实例 /// </summary> /// <returns></returns> public static UrlTraceContext Create() { var context = new UrlTraceContext(); //跟踪开始时间 context.StartTime = DateTime.Now; HttpContext.Current.Items.Add(cacheKey, context); return context; }
/// <summary> /// 开始会话跟踪 /// </summary> /// <param name="traceContext">跟踪上下文</param> public static void StartSpan(UrlTraceContext traceContext) { ISpan span = null; long traceId, spanId; try { tracer.Clear(); var request = HttpContext.Current.Request; if (long.TryParse(request.Headers["Tracing-TraceId"], out traceId) && long.TryParse(request.Headers["Tracing-SpanId"], out spanId)) span = tracer.ContinueSpan("HttpRequest", typeof(UrlTraceLogger).FullName, traceId, spanId, GetSpanType(request)); //延续现有跟踪 else span = tracer.StartSpan("HttpRequest", typeof(UrlTraceLogger).FullName, GetSpanType(request)); //开始新的跟踪 //将TraceId存放起来供后续其他处理逻辑使用,例如写入Html<meta>标签等 HttpContext.Current.Items.Add(AppConst.CloggingTraceIdKey, span.TraceId); traceContext.TraceSpan = span; } catch {} }
/// <summary> /// 记录 /// </summary> /// <param name="traceContext">跟踪上下文</param> public static void Log(UrlTraceContext traceContext) { if (traceContext.TraceSpan == null || traceContext.TraceInfo == null) return; //写入Trace信息 WriteTraceInfo(traceContext.TraceInfo); //写入component UrlTracerContain.AddUrlTrace(traceContext.TraceInfo); //写入Metric信息 WriteMetricInfo(traceContext.TraceInfo); }
/// <summary> /// 结束收集 /// </summary> /// <param name="traceContext">跟踪上下文</param> public static void EndColloct(UrlTraceContext traceContext) { if (traceContext.TraceSpan == null || traceContext.TraceInfo == null) return; var traceInfo = traceContext.TraceInfo; try { //请求文件的虚拟路径 traceInfo.FilePath = GetFilePath(); if (traceInfo.TraceItems.ResponseStatus) traceInfo.ResponseStatus = (int)HttpContext.Current.Response.StatusCode; if (traceInfo.TraceItems.RequestCost) traceInfo.RequestCost = DateTime.Now.Subtract(traceContext.StartTime).TotalMilliseconds; } catch { } }
/// <summary> /// 开始收集 /// </summary> /// <param name="traceContext">跟踪上下文</param> public static void StartCollect(UrlTraceContext traceContext) { if (traceContext.TraceSpan == null) return; var request = HttpContext.Current.Request; var response = HttpContext.Current.Response; UrlTraceInfo traceInfo = new UrlTraceInfo(); try { traceInfo.TraceItems = (UrlTraceItems)ConfigHelper.UrlTraceItems.Clone(); traceInfo.HostAddress = request.ServerVariables["Server_Name"].ToLower(); //主机域名或IP //请求的目标服务方法 if (traceContext.TraceSpan.SpanType == SpanType.WEB_SERVICE && traceInfo.TraceItems.WSRequestInfo) { string requestType = request.Headers["Tracing-RequestType"]; if (requestType != null) { traceInfo.RequestType = requestType; } else { requestType = request.Headers["SOAPAction"]; if (requestType != null) { Match match = Regex.Match(requestType, "/?([^\"/]*)\"$", RegexOptions.Compiled); if (match.Success && match.Groups.Count > 1) traceInfo.RequestType = match.Groups[1].Value; } } traceInfo.ClientAppId = request.Headers["ClientAppId"]; } //请求内容大小 if (traceInfo.TraceItems.RequestSize) { long value; if (long.TryParse(request.Headers["Content-Length"], out value)) traceInfo.RequestSize = value; } if (traceInfo.TraceItems.RawUrl) { traceInfo.RawUrl = request.RawUrl; traceInfo.HttpMethod = request.HttpMethod; } if (traceInfo.TraceItems.ResponseSize) response.Filter = new ResponseFilter(response.Filter, traceInfo); //响应内容大小 if (traceInfo.TraceItems.ClientIP) traceInfo.ClientIP = IPHelper.GetClientIP(); //客户端IP traceContext.TraceInfo = traceInfo; } catch { } }