public async Task <IActionResult> DetermineFileTypeFromBase64([FromBody][Required] Base64Request request) { _logger.LogInformation($"[{UserAgentInfo.ClientTypeString}]:: {nameof(DetermineFileTypeFromBase64)} method invoked"); string originalStoreFilePath = string.Empty; string rebuiltStoreFilePath = string.Empty; string fileId = string.Empty; CloudProxyResponseModel cloudProxyResponseModel = new CloudProxyResponseModel(); ISpanBuilder builder = _tracer.BuildSpan("Post::Data"); ISpan span = builder.Start(); // Set some context data span.Log("File Type Detection base64"); span.SetTag("Jaeger Testing Client", "POST api/FileTypeDetection/base64 request"); try { if (!ModelState.IsValid) { cloudProxyResponseModel.Errors.AddRange(ModelState.Values.SelectMany(v => v.Errors).Select(x => x.ErrorMessage)); return(BadRequest(cloudProxyResponseModel)); } if (!_fileUtility.TryGetBase64File(request.Base64, out byte[] file))
/// <summary>根据跟踪数据创建对象</summary> /// <param name="builder"></param> /// <returns></returns> public static TraceData Create(ISpanBuilder builder) { var time = builder.StartTime.ToDateTime().ToLocalTime(); var td = new TraceData { Id = Meta.Factory.Snow.NewId(), StatDate = time.Date, StatHour = time.Date.AddHours(time.Hour), StatMinute = time.Date.AddHours(time.Hour).AddMinutes(time.Minute / 5 * 5), Name = builder.Name.Cut(_.Name.Length), StartTime = builder.StartTime, EndTime = builder.EndTime, Total = builder.Total, Errors = builder.Errors, TotalCost = builder.Cost, MaxCost = builder.MaxCost, MinCost = builder.MinCost, }; if (builder.Samples != null) { td.Samples = builder.Samples.Count; } if (builder.ErrorSamples != null) { td.ErrorSamples = builder.ErrorSamples.Count; } return(td); }
public static TResult Trace <TResult>(this IServiceTracer tracer, ISpanBuilder spanBuilder, Func <ISpan, TResult> operation) { if (tracer == null) { throw new ArgumentNullException(nameof(tracer)); } using (var span = tracer.Start(spanBuilder)) { try { if (operation == null) { return(default(TResult)); } return(operation(span)); } catch (Exception exception) { span.Exception(exception); throw; } } }
public static TResult Trace <TResult>(this IServiceTracer tracer, ISpanBuilder spanBuilder, Func <ISpan, TResult> operation) { if (tracer == null) { throw new ArgumentNullException(nameof(tracer)); } var span = tracer.Start(spanBuilder); var curr = tracer.Tracer.GetCurrentSpan(); try { tracer.Tracer.SetCurrentSpan(span); if (operation == null) { return(default(TResult)); } return(operation(span)); } catch (Exception exception) { span.Exception(exception); throw; } finally { span.Finish(DateTimeOffset.UtcNow); tracer.Tracer.SetCurrentSpan(curr); } }
public static void Trace(this IServiceTracer tracer, ISpanBuilder spanBuilder, Action <ISpan> operation) { if (tracer == null) { throw new ArgumentNullException(nameof(tracer)); } var span = tracer.Start(spanBuilder); var curr = tracer.Tracer.GetCurrentSpan(); try { tracer.Tracer.SetCurrentSpan(span); operation?.Invoke(span); } catch (Exception exception) { span.Exception(exception); throw; } finally { span.Finish(DateTimeOffset.UtcNow); tracer.Tracer.SetCurrentSpan(curr); } }
public async Task InvokeAsync(HttpContext context, ITracer tracer) { // Open Tracing ISpanBuilder builder = CreateTracingSpanBuilder("中间件Span", tracer, context.Request); using (IScope scope = builder.StartActive(true)) { // Span Name scope.Span.SetOperationName(context.Request.Path); // 记录请求信息到span if (_jaegerOptions != null && _jaegerOptions.QuerySpan) { foreach (var query in context.Request.Query) { var value = _jaegerOptions.QueryValueMaxLength <= 0 ? query.Value.ToString() : query.Value.ToString().Substring(0, _jaegerOptions.FormValueMaxLength); scope.Span.SetTag(query.Key, query.Value); } } if (_jaegerOptions != null && _jaegerOptions.FormSpan && context.Request.HasFormContentType) { foreach (var form in context.Request.Form) { var value = _jaegerOptions.FormValueMaxLength <= 0 ? form.Value.ToString() : form.Value.ToString().Substring(0, _jaegerOptions.FormValueMaxLength); scope.Span.SetTag(form.Key, value); } } //foreach (var form in context.Request.Headers) //{ // scope.Span.SetTag(form.Key, form.Value); //} } await _next(context); }
private IScope BuildServerScope(HttpContext context) { ISpanBuilder spanBuilder = null; var operationName = GetOperationName(context); var requestTraceHeaders = context.GetTraceHeaders(); if (requestTraceHeaders?.Any() ?? false) { try { spanBuilder = _tracer.BuildSpan(operationName); var parentSpanContext = _tracer.Extract(BuiltinFormats.TextMap, new TextMapExtractAdapter(requestTraceHeaders)); if (parentSpanContext != null) { spanBuilder = spanBuilder.AsChildOf(parentSpanContext); } } catch { } } if (spanBuilder == null) { spanBuilder = _tracer.BuildSpan(operationName); } return(spanBuilder.WithTag(Tags.SpanKind, Tags.SpanKindServer).StartActive(true)); }
/// <summary> /// 开始执行Action /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { var path = context.HttpContext.Request.Path; var callingHeaders = new TextMapExtractAdapter(context.HttpContext.Request.Headers.ToDictionary(m => m.Key, m => m.Value.ToString())); var spanContex = _tracer.Extract(BuiltinFormats.HttpHeaders, callingHeaders); ISpanBuilder builder = null; if (spanContex != null) { builder = _tracer.BuildSpan("中间件Span").AsChildOf(spanContex); } else { builder = _tracer.BuildSpan("中间件Span"); } _scope = builder.StartActive(true); _scope.Span.SetOperationName(path); // 记录请求信息到span foreach (var query in context.HttpContext.Request.Query) { _scope.Span.SetTag(query.Key, query.Value); } if (context.HttpContext.Request.HasFormContentType) { foreach (var form in context.HttpContext.Request.Form) { _scope.Span.SetTag(form.Key, form.Value); } } }
public SpanBuilderDecorator([NotNull] ISpanBuilder builder, [NotNull] string kind, [CanBeNull] string operationName) { this.builder = builder; this.operationName = operationName; builder.SetAnnotation(WellKnownAnnotations.Common.Kind, kind); }
internal static ISpanBuilder AddDefaultTags(this ISpanBuilder builder) { return(builder .WithTag(Tags.Component, ClientIdentifier.GetClientDescription()) .WithTag(Tags.DbType, CouchbaseTags.DbTypeCouchbase) .WithTag(Tags.SpanKind, Tags.SpanKindClient)); }
/// <summary>根据跟踪数据创建对象</summary> /// <param name="builder"></param> /// <returns></returns> public static TraceData Create(ISpanBuilder builder) { var td = new TraceData { Name = builder.Name, StartTime = builder.StartTime, EndTime = builder.EndTime, Total = builder.Total, Errors = builder.Errors, TotalCost = builder.Cost, MaxCost = builder.MaxCost, MinCost = builder.MinCost, }; if (builder.Samples != null) { td.Samples = builder.Samples.Count; } if (builder.ErrorSamples != null) { td.ErrorSamples = builder.ErrorSamples.Count; } return(td); }
public async Task <IActionResult> RebuildFromFormFile([FromForm][Required] IFormFile file) { bool zipRequest = Request.Path.ToString().ToLower().EndsWith(Constants.Endpoints.ZIP_FILE); _logger.LogInformation($"[{UserAgentInfo.ClientTypeString}]:: {nameof(RebuildFromFormFile)} method invoked"); string originalStoreFilePath = string.Empty; string rebuiltStoreFilePath = string.Empty; string fileId = string.Empty; string tempFolderPath = Path.Combine(Constants.VAR_PATH, $"{Guid.NewGuid()}"); string extractedFolderPath = Path.Combine(tempFolderPath, $"{Guid.NewGuid()}"); string extractedRebuildZipFilePath = Path.Combine(tempFolderPath, $"{Guid.NewGuid()}"); string extractedRebuildFolderPath = Path.Combine(tempFolderPath, $"{Guid.NewGuid()}"); CloudProxyResponseModel cloudProxyResponseModel = new CloudProxyResponseModel(); ISpanBuilder builder = _tracer.BuildSpan("Post::Data"); ISpan span = builder.Start(); // Set some context data span.Log("Rebuild file"); span.SetTag("Jaeger Testing Client", "POST api/Rebuild/file request"); try { if (!_fileUtility.TryReadFormFile(file, out byte[] fileBytes))
public async Task InvokeAsync(HttpContext context, ITracer tracer) { // Open Tracing ISpanBuilder builder = CreateTracingSpanBuilder("中间件Span", tracer, context.Request); using (IScope scope = builder.StartActive(true)) { // Span Name scope.Span.SetOperationName(context.Request.Path); // 记录请求信息到span foreach (var query in context.Request.Query) { scope.Span.SetTag(query.Key, query.Value); } if (context.Request.HasFormContentType) { foreach (var form in context.Request.Form) { scope.Span.SetTag(form.Key, form.Value); } } //foreach (var form in context.Request.Headers) //{ // scope.Span.SetTag(form.Key, form.Value); //} } await _next(context); }
public ISpan Start(ISpanBuilder spanBuilder) { if (spanBuilder == null) { throw new ArgumentNullException(nameof(spanBuilder)); } var traceId = spanBuilder.References?.FirstOrDefault()?.SpanContext?.TraceId ?? Guid.NewGuid().ToString(); var spanId = Guid.NewGuid().ToString(); var baggage = new Baggage(); if (spanBuilder.References != null) { foreach (var reference in spanBuilder.References) { baggage.Merge(reference.SpanContext.Baggage); } } var sampled = spanBuilder.Sampled ?? _sampler?.ShouldSample(); var spanContext = _spanContextFactory.Create(new SpanContextPackage(traceId, spanId, sampled.GetValueOrDefault(true), baggage, spanBuilder.References)); return(new Span(spanBuilder.OperationName, spanBuilder.StartTimestamp ?? DateTimeOffset.UtcNow, spanContext, _spanRecorder)); }
public IScope CreateServerSpan(ServerCallContext context) { _ = context ?? throw new ArgumentNullException(nameof(context)); var operationName = context.Method.Split('/').Last(); ISpanBuilder spanBuilder = null; try { var headers = context.RequestHeaders.ToDictionary(x => x.Key, x => x.Value); ISpanContext parentSpanCtx = _tracer.Extract(BuiltinFormats.HttpHeaders, new TextMapExtractAdapter(headers)); spanBuilder = _tracer.BuildSpan(operationName); spanBuilder = parentSpanCtx != null?spanBuilder.AsChildOf(parentSpanCtx) : spanBuilder; } finally { if (spanBuilder == null) { spanBuilder = _tracer.BuildSpan(operationName); } } return (spanBuilder .WithTag(Tags.SpanKind, Tags.SpanKindServer) .WithTag(Tags.PeerHostname, context.Host) .WithTag("correlation-id", GetCorrelationId()) .StartActive(true)); }
public ISpanBuilder BuildSpanIgnoreActive(string operationName) { ISpanBuilder innerSpanBuilder = _innerTracer.BuildSpan(operationName); ISpanBuilder spanBuilder = new AdvancedSpanBuilder(innerSpanBuilder, _traceContext); return(spanBuilder); }
public SpanBuilderDecorator(ISpanBuilder spanBuilder, ITracer tracer, string operationName, BuildersDecoratorHooks hooks) { _spanBuilder = spanBuilder; _tracer = tracer; _operationName = operationName; _hooks = hooks; }
public async Task Send(PublishContext context, IPipe <PublishContext> next) { DeimosOptions options = GetDeimosOptions(); if (options is null || !options.Enabled) { return; } if (GlobalTracer.Instance is null) { return; } var operationName = $"Publishing Message: {context.DestinationAddress.GetExchangeName()}"; ISpanBuilder spanBuilder = GlobalTracer.Instance.BuildSpan(operationName) .AsChildOf(GlobalTracer.Instance.ActiveSpan.Context) .WithTag("destination.address", context.DestinationAddress?.ToString()) .WithTag("source.address", context.SourceAddress?.ToString()) .WithTag("initiator.id", context.InitiatorId?.ToString()) .WithTag("message.id", context.MessageId?.ToString()); using (IScope scope = spanBuilder.StartActive()) { GlobalTracer.Instance.Inject(GlobalTracer.Instance.ActiveSpan.Context, BuiltinFormats.TextMap, new MassTransitTextMapInjectAdapter(context)); await next.Send(context); } }
public ISpanBuilder BuildSpan(string operationName) { ISpanBuilder innerSpanBuilder = _innerTracer.BuildSpan(operationName); ISpanBuilder spanBuilder = new AdvancedSpanBuilder(innerSpanBuilder, _traceContext); spanBuilder.AsChildOf(_traceContext.CurrentSpan); return(spanBuilder); }
public void TestSetup() { spanBuilder = Substitute.For <ISpanBuilder>(); baseTracer = Substitute.For <ITracer>(); baseTracer.BeginSpan().Returns(spanBuilder); baseTracer.CurrentContext.Returns(new TraceContext(Guid.Empty, Guid.Empty)); }
/// <remarks> /// <see cref="CallerLineNumberAttribute"/> is explicitly NOT used, since that can change /// over time and is likely not valid as a 'Tag' on a <see cref="ISpan"/>, since 'Tag's are /// meant to apply to the entirety of the span. Instead, see <see cref="ISpan.Log(IEnumerable{KeyValuePair{string,object}})"/> /// options like <see cref="SpanExtensions.LogMemberInfo"/>. /// </remarks> public static ISpanBuilder WithCallerMemberNameTag( this ISpanBuilder spanBuilder, string tagName = Constants.CallerMemberNameTagName, [CallerMemberName] string callerMemberName = null) { return(spanBuilder .WithTag(tagName, callerMemberName)); }
public void TestSetup() { tracer = Substitute.For <ITracer>(); tracer.BeginSpan().Returns(builder = Substitute.For <ISpanBuilder>()); absoluteUrl = new Uri("https://vostok.tools/version/123?q=a", UriKind.Absolute); relativeUrl = new Uri("version/123?q=a", UriKind.Relative); }
public void TestSetup() { tracer = Substitute.For <ITracer>(); tracer.CurrentContext.Returns(new TraceContext(Guid.NewGuid(), Guid.NewGuid())); tracer.BeginSpan().Returns(spanBuilder = Substitute.For <ISpanBuilder>()); baseTransport = Substitute.For <ITransport>(); baseTransport.SendAsync(default, default, default, default).ReturnsForAnyArgs(_ => response);
/// <summary> /// 调用管道 /// </summary> /// <param name="context">上下文</param> /// <param name="tracer">跟踪器</param> /// <returns></returns> public async Task InvokeAsync(HttpContext context, ITracer tracer) { _logger.LogInformation("jaeger调用"); var path = context.Request.Path; if (Path.HasExtension(path)) { await _next(context); } else { //接收传入的Headers var callingHeaders = new TextMapExtractAdapter(context.Request.Headers.ToDictionary(m => m.Key, m => m.Value.ToString())); var spanContex = tracer.Extract(BuiltinFormats.HttpHeaders, callingHeaders); ISpanBuilder builder = null; if (spanContex != null) { builder = tracer.BuildSpan("中间件Span").AsChildOf(spanContex); } else { builder = tracer.BuildSpan("中间件Span"); } //开始设置Span using (IScope scope = builder.StartActive(true)) { scope.Span.SetOperationName(path); // 记录请求信息到span if (_jaegerOptions.IsQuerySpan) { foreach (var query in context.Request.Query) { //包含敏感词跳出 if (_jaegerOptions.NoSpanKeys.Contains(query.Key)) { continue; } var value = query.Value.ToString().Length > _jaegerOptions.QueryValueMaxLength ? query.Value.ToString()?.Substring(0, _jaegerOptions.QueryValueMaxLength) : query.Value.ToString(); scope.Span.SetTag(query.Key, value); } } if (_jaegerOptions.IsFormSpan && context.Request.HasFormContentType) { foreach (var form in context.Request.Form) { //包含敏感词跳出 if (_jaegerOptions.NoSpanKeys.Contains(form.Key)) { continue; } var value = form.Value.ToString().Length > _jaegerOptions.FormValueMaxLength ? form.Value.ToString()?.Substring(0, _jaegerOptions.FormValueMaxLength) : form.Value.ToString(); scope.Span.SetTag(form.Key, value); } } await _next(context); } } }
public static async Task ExecuteInScopeAndLogExceptionsAsync( this ISpanBuilder spanBuilder, Func <Task> action) { using (IScope scope = spanBuilder.StartActive()) { await scope.Span.LogExceptions(action); } }
public static void ExecuteInScopeAndLogExceptions( this ISpanBuilder spanBuilder, Action action) { using (IScope scope = spanBuilder.StartActive()) { scope.Span.LogExceptions(action); } }
public static T ExecuteInScopeAndLogExceptions <T>( this ISpanBuilder spanBuilder, Func <T> action) { using (IScope scope = spanBuilder.StartActive()) { return(scope.Span.LogExceptions(action)); } }
public static T ExecuteInScope <T>( [NotNull] this ISpanBuilder spanBuilder, [NotNull] Func <T> action) { using (IScope scope = spanBuilder.StartActive(true)) { return(action()); } }
public static async Task ExecuteInScopeAsync( [NotNull] this ISpanBuilder spanBuilder, [NotNull] Func <Task> action) { using (IScope scope = spanBuilder.StartActive(true)) { await action().ConfigureAwait(false); } }
public static async Task <T> ExecuteInScopeAsync <T>( [NotNull] this ISpanBuilder spanBuilder, [NotNull] Func <ISpan, Task <T> > action) { using (IScope scope = spanBuilder.StartActive(true)) { return(await action(scope.Span).ConfigureAwait(false)); } }