Exemple #1
0
        public async Task <IEnumerable <TracingDto> > GetTracing(TracingQueryParameter tracingQueryParameter, CancellationToken cancellationToken)
        {
            if (tracingQueryParameter.IsEmpty())
            {
                return(Enumerable.Empty <TracingDto>());
            }
            var buildQuerys = BuildMustQuery(tracingQueryParameter).ToList();
            var query       = BuildQuery(buildQuerys);


            var traceid_aggregation = await ElasticClient.SearchAsync <SpanModel>(s => s.Index(QueryIndexName).Size(0).Query(query)
                                                                                  .Aggregations(a => a.Terms("group_traceId", t =>
                                                                                                             t.Aggregations(sub => sub.Min("min_timestapm", m => m.Field(f => f.StartTime)))
                                                                                                             .Field(f => f.TraceId).Order(o => o.Descending("min_timestapm")).Size(tracingQueryParameter.Limit)
                                                                                                             )));


            var traceIdsAggregations = traceid_aggregation.Aggregations.FirstOrDefault().Value as BucketAggregate;

            if (traceIdsAggregations == null || traceIdsAggregations.Items.Count <= 0)
            {
                return(Enumerable.Empty <TracingDto>());
            }

            var keyBuckets = traceIdsAggregations.Items.Cast <KeyedBucket <object> >();

            var limit = -1;

            var tracIds = keyBuckets.Where(w => w.Key != null).Select(s => s.Key.ToString()).ToList();

            var result = await ElasticClient.SearchAsync <SpanModel>(s => s.Index(QueryIndexName)
                                                                     .Query(q => q.Terms(t => t.Field(f => f.TraceId).Terms(tracIds))).Take(limit));

            List <TracingDto> tracingDtos = new List <TracingDto>();
            int i            = 0;
            var processModel = result.Documents.Select(s => s.Process).Distinct(new SpanProcessModelEqualityComparer())
                               .ToDictionary(d => $"p{i++}", d => d);

            foreach (var item in result.Documents.GroupBy(g => g.TraceId))
            {
                var tracing = Convert(item.ToArray(), processModel);
                tracingDtos.Add(tracing);
            }
            return(tracingDtos);
        }
Exemple #2
0
 private IEnumerable <Func <QueryContainerDescriptor <SpanModel>, QueryContainer> > BuildMustQuery(TracingQueryParameter tracingQueryParameter)
 {
     if (!string.IsNullOrEmpty(tracingQueryParameter.ServiceName))
     {
         yield return(q => q.Term(new Field("serviceName.keyword"), tracingQueryParameter.ServiceName));
     }
     if (!string.IsNullOrEmpty(tracingQueryParameter.OperationName))
     {
         yield return(q => q.Term(new Field("operationName.keyword"), tracingQueryParameter.OperationName));
     }
     if (tracingQueryParameter.StartTimeMin.HasValue)
     {
         yield return(q => q.LongRange(d => d.Field(x => x.StartTime).GreaterThanOrEquals(tracingQueryParameter.StartTimeMin)));
     }
     if (tracingQueryParameter.StartTimeMax.HasValue)
     {
         yield return(q => q.LongRange(d => d.Field(x => x.StartTime).LessThan(tracingQueryParameter.StartTimeMax)));
     }
     if (tracingQueryParameter.DurationMin.HasValue)
     {
         yield return(q => q.Range(d => d.Field(x => x.Duration).GreaterThanOrEquals(tracingQueryParameter.DurationMin.Value)));
     }
     if (tracingQueryParameter.DurationMax.HasValue)
     {
         yield return(q => q.Range(d => d.Field(x => x.Duration).LessThan(tracingQueryParameter.DurationMax.Value)));
     }
     if (tracingQueryParameter.Tags != null && tracingQueryParameter.Tags.Count > 0)
     {
         foreach (var tag in tracingQueryParameter.Tags)
         {
             yield return(q => q.Nested(n => n.Path(x => x.Tags).Query(q1 => q1.Bool(b => b.Must(f => f.Term(new Field("tags.key"), tag.Key), f => f.Term(new Field("tags.value"),
                                                                                                                                                          tag.Value?.ToString()))))));
         }
     }
 }