public async Task <MetricsTimeSeriesResultDto> Handle(GetMetricTimeSeriesQuery request, CancellationToken cancellationToken) { var dbMetrics = await ValidateMetrics(request); if (dbMetrics.Count == 0) { return(new MetricsTimeSeriesResultDto()); } var timePeriod = TimePeriodUtils.Parse(request.StartTimestamp, request.EndTimestamp, request.LiveSpan); MetricsTimeSeriesResultDto result = new MetricsTimeSeriesResultDto(); for (int i = 0; i < request.Metrics.Count; i++) { var requestMetric = request.Metrics[i]; var dbMetric = dbMetrics.FirstOrDefault(x => x.Name.Equals(requestMetric.MetricName) && x.Namespace.Equals(requestMetric.Namespace)); if (dbMetric == null) { continue; } // Retrieve the metrics var metricValues = await metricsRetriever.QueryAsync(dbMetric, timePeriod); // Down sample the metrics var samplingResult = metricDownSampler.DownSample(metricValues, request.SamplingTime, timePeriod.StartTimestamp, timePeriod.EndTimestamp); var metricValue = GetMetricTimeSeriesValueForSamplingType(requestMetric, samplingResult); result.Values.Add(metricValue); if (i == 0) { result.Timestamps = samplingResult.MetricValues.Select(x => x.TimeStamp).ToList(); result.Count = samplingResult.MetricValues.Count; result.SamplingValue = samplingResult.DownsamplingValue; } } return(result); }
public void ShouldDownSampleToSingleResult() { var metricValues = GetMetricValues(); var downsaplingResult = metricDownSampler.DownSample(metricValues, 10, 1000, 1009); downsaplingResult.DownsamplingValue.Should().Be(10); downsaplingResult.MetricValues.Should().HaveCount(1); downsaplingResult.MetricValues[0].Count.Should().Be(5); downsaplingResult.MetricValues[0].Min.Should().Be(10); downsaplingResult.MetricValues[0].Max.Should().Be(50); downsaplingResult.MetricValues[0].Sum.Should().Be(500); downsaplingResult.MetricValues[0].TimeStamp.Should().Be(1000); }