public static async Task <IList <ISpan> > ScanAsync(
            [NotNull] this IHerculesTracingClient client,
            [NotNull] TraceScanAsyncQuery query,
            TimeSpan perRequestTimeout,
            CancellationToken cancellationToken = default)
        {
            var result = new List <ISpan>();
            var state  = TracePagingState.Empty;

            while (true)
            {
                var readQuery = new TraceReadQuery(query.TraceId)
                {
                    ParentSpanId = query.ParentSpanId,
                    Limit        = query.BatchSize,
                    PagingState  = state
                };

                var readPayload = (await client.ReadAsync(readQuery, perRequestTimeout, cancellationToken).ConfigureAwait(false)).Payload;

                result.AddRange(readPayload.Spans);

                if (readPayload.Spans.Count == 0 || readPayload.Next.State == null || result.Count > query.Limit)
                {
                    break;
                }

                state = readPayload.Next;
            }

            return(result);
        }
Пример #2
0
 public static Request WithTraceReadQuery(this Request request, TraceReadQuery query)
 {
     return(request
            .WithAdditionalQueryParameter("traceId", query.TraceId)
            .WithAdditionalQueryParameter("parentSpanId", query.ParentSpanId)
            .WithAdditionalQueryParameter("limit", query.Limit)
            .WithAdditionalQueryParameter("pagingState", query.PagingState.State));
 }
        public async Task <ReadTraceResult> ReadAsync(TraceReadQuery query, TimeSpan timeout, CancellationToken cancellationToken = default)
        {
            try
            {
                var request = Request.Get("/trace").WithTraceReadQuery(query);
                var result  = await client.SendAsync(request, timeout, cancellationToken : cancellationToken).ConfigureAwait(false);

                var status = ResponseAnalyzer.Analyze(result.Response, out var errorMessage);

                var payload = default(ReadTracePayload);
                if (status == HerculesStatus.Success)
                {
                    payload = CreateReadTracePayload(JsonConvert.DeserializeObject <TraceResponseDto>(result.Response.Content.ToString()));
                }

                return(new ReadTraceResult(status, payload, errorMessage));
            }
            catch (Exception error)
            {
                log.Error(error);
                return(new ReadTraceResult(HerculesStatus.UnknownError, default, error.Message));
        public static IEnumerable <ISpan> Scan(
            [NotNull] this IHerculesTracingClient client,
            [NotNull] TraceScanQuery query,
            TimeSpan perRequestTimeout,
            CancellationToken cancellationToken = default)
        {
            var state = TracePagingState.Empty;

            while (true)
            {
                var readQuery = new TraceReadQuery(query.TraceId)
                {
                    ParentSpanId = query.ParentSpanId,
                    Limit        = query.BatchSize,
                    PagingState  = state
                };

                var readPayload = client.Read(readQuery, perRequestTimeout, cancellationToken).Payload;

                if (readPayload.Spans.Count == 0)
                {
                    break;
                }

                foreach (var @event in readPayload.Spans)
                {
                    yield return(@event);
                }

                if (readPayload.Next.State == null)
                {
                    break;
                }

                state = readPayload.Next;
            }
        }
 public static ReadTraceResult Read(
     [NotNull] this IHerculesTracingClient client,
     [NotNull] TraceReadQuery query,
     TimeSpan timeout,
     CancellationToken cancellationToken = default) =>
 client.ReadAsync(query, timeout, cancellationToken).GetAwaiter().GetResult();