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); }
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())))))); } } }