예제 #1
0
        public async Task <IEnumerable <TraceHistogram> > GetTraceHistogram(TraceQuery traceQuery)
        {
            traceQuery.Ensure();

            var index = Indices.Index(_indexManager.CreateTracingIndex());

            var query = BuildTracesQuery(traceQuery);

            var timeSpan = traceQuery.FinishTimestamp.Value - traceQuery.StartTimestamp.Value;

            var histogramAggregationsResult = await _elasticClient.SearchAsync <Span>(s => s.Index(index).Size(0).Query(query).
                                                                                      Aggregations(a =>
                                                                                                   a.DateHistogram("data_histogram_startTimestamp", d => d.Field(f => f.StartTimestamp).Interval(DateInterval.Minute).Format("yyyy-MM-dd HH:mm:ss").
                                                                                                                   Aggregations(sub => sub.Cardinality("cardinality_traceId", c => c.Field(f => f.TraceId))))));

            var histogramAggregations = histogramAggregationsResult.Aggregations.FirstOrDefault().Value as BucketAggregate;

            if (histogramAggregations == null || histogramAggregations.Items == null || !histogramAggregations.Items.OfType <DateHistogramBucket>().Any())
            {
                return(new TraceHistogram[0]);
            }

            var traceHistograms = histogramAggregations.Items.OfType <DateHistogramBucket>().Select(x => new TraceHistogram {
                Time = GetHistogramTime((long)x.Key), Count = GetTraceCount(x)
            });

            return(traceHistograms.OrderBy(x => x.Time).ToList());
        }
예제 #2
0
        public async Task <IEnumerable <TraceOperationHistogram> > GetSpanHistogramByOperaionName(TraceQuery traceQuery)
        {
            traceQuery.Ensure();

            var index = Indices.Index(_indexManager.CreateTracingIndex());

            var query = BuildTracesQuery(traceQuery);
            var histogramAggregationsResult = await _elasticClient.SearchAsync <Span>(s => s.Index(index).Size(0).Query(query)
                                                                                      .Aggregations(agg => agg.Terms("group_by_operationName",
                                                                                                                     g => g.Script(sc => sc.Source("doc['operationName'].value.toUpperCase()"))
                                                                                                                     )));

            var histogramAggregations = histogramAggregationsResult.Aggregations.FirstOrDefault().Value as BucketAggregate;

            if (histogramAggregations == null || histogramAggregations.Items == null)
            {
                return(new TraceOperationHistogram[0]);
            }

            var traceHistograms = histogramAggregations.Items
                                  .Select(x =>
            {
                KeyedBucket <object> bucket = x as KeyedBucket <object>;
                return(new TraceOperationHistogram
                {
                    OperationName = bucket.Key.ToString(),
                    Count = bucket.DocCount.HasValue ? bucket.DocCount.Value : 0
                });
            })
                                  .OrderByDescending(x => x.Count)
                                  .ToArray();

            return(traceHistograms);
        }
예제 #3
0
        public async Task <IEnumerable <TraceHistogram> > GetTraceHistogram(TraceQuery traceQuery)
        {
            traceQuery.Ensure();

            var query = _dbContext.Spans.AsQueryable();

            if (traceQuery.StartTimestamp != null)
            {
                query = query.Where(x => x.StartTimestamp >= traceQuery.StartTimestamp);
            }

            if (traceQuery.FinishTimestamp != null)
            {
                query = query.Where(x => x.FinishTimestamp <= traceQuery.FinishTimestamp);
            }

            var queryGroup = query.ToList().GroupBy(x => x.TraceId).ToList();

            var histogram = queryGroup.GroupBy(x => x.Min(s => s.StartTimestamp).ToString("yyyy-MM-dd HH:mm")).Select(x => new TraceHistogram {
                Count = x.Count(), Time = DateTimeOffset.Parse(x.Key)
            });

            return(histogram.ToList());
        }