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))
Example #2
0
        /// <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;
                }
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
            }
        }
Example #6
0
        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);
                    }
                }
            }
Example #9
0
        public SpanBuilderDecorator([NotNull] ISpanBuilder builder, [NotNull] string kind, [CanBeNull] string operationName)
        {
            this.builder       = builder;
            this.operationName = operationName;

            builder.SetAnnotation(WellKnownAnnotations.Common.Kind, kind);
        }
Example #10
0
 internal static ISpanBuilder AddDefaultTags(this ISpanBuilder builder)
 {
     return(builder
            .WithTag(Tags.Component, ClientIdentifier.GetClientDescription())
            .WithTag(Tags.DbType, CouchbaseTags.DbTypeCouchbase)
            .WithTag(Tags.SpanKind, Tags.SpanKindClient));
 }
Example #11
0
        /// <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);
        }
Example #12
0
        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);
        }
Example #14
0
        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));
        }
Example #15
0
        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));
        }
Example #16
0
        public ISpanBuilder BuildSpanIgnoreActive(string operationName)
        {
            ISpanBuilder innerSpanBuilder = _innerTracer.BuildSpan(operationName);
            ISpanBuilder spanBuilder      = new AdvancedSpanBuilder(innerSpanBuilder, _traceContext);

            return(spanBuilder);
        }
Example #17
0
 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);
            }
        }
Example #19
0
        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);
        }
Example #23
0
        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);
                }
            }
        }
Example #25
0
 public static async Task ExecuteInScopeAndLogExceptionsAsync(
     this ISpanBuilder spanBuilder,
     Func <Task> action)
 {
     using (IScope scope = spanBuilder.StartActive())
     {
         await scope.Span.LogExceptions(action);
     }
 }
Example #26
0
 public static void ExecuteInScopeAndLogExceptions(
     this ISpanBuilder spanBuilder,
     Action action)
 {
     using (IScope scope = spanBuilder.StartActive())
     {
         scope.Span.LogExceptions(action);
     }
 }
Example #27
0
 public static T ExecuteInScopeAndLogExceptions <T>(
     this ISpanBuilder spanBuilder,
     Func <T> action)
 {
     using (IScope scope = spanBuilder.StartActive())
     {
         return(scope.Span.LogExceptions(action));
     }
 }
Example #28
0
 public static T ExecuteInScope <T>(
     [NotNull] this ISpanBuilder spanBuilder,
     [NotNull] Func <T> action)
 {
     using (IScope scope = spanBuilder.StartActive(true))
     {
         return(action());
     }
 }
Example #29
0
 public static async Task ExecuteInScopeAsync(
     [NotNull] this ISpanBuilder spanBuilder,
     [NotNull] Func <Task> action)
 {
     using (IScope scope = spanBuilder.StartActive(true))
     {
         await action().ConfigureAwait(false);
     }
 }
Example #30
0
 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));
     }
 }