public async Task AggregatingData(CollectedDataType sourceType, CollectedDataType destinationType, TimeSpan interval, bool deleteSource) { // Need destinationType, // Subtract interval from the current time var timeFrom = DateTime.UtcNow.Add(-interval); var timeTo = DateTime.UtcNow; var sourceCollectedDataDtos = (await _aggregatorService.GetSourceEntitiesAsync(sourceType, timeFrom, timeTo)).ToList(); var filteredCollectedDataDtos = await FilterCollectedDataByInstanceSettings(sourceCollectedDataDtos, destinationType); var collectedDataDtos = filteredCollectedDataDtos as CollectedDataDto[] ?? filteredCollectedDataDtos.ToArray(); if (collectedDataDtos.Any()) { var collectedDataDtosAverage = from collectedDataDto in collectedDataDtos group collectedDataDto by collectedDataDto.ClientId into collectedDataGroup select new CollectedDataDto { ClientId = collectedDataGroup.Key, CollectedDataType = destinationType, ProcessesCount = Convert.ToInt32(collectedDataGroup .Average(d => d.ProcessesCount)), Processes = collectedDataGroup .SelectMany(d => d.Processes) .GroupBy(p => p.Name) .Select(g => new ProcessData() { Name = g.Key, PCpu = g.Average(c => c.PCpu), PCpuMax = g.Max(c => c.PCpu), PCpuMin = g.Min(c => c.PCpu), PRam = g.Average(r => r.PRam), PRamMax = g.Max(r => r.PRam), PRamMin = g.Min(r => r.PRam), RamMBytes = g.Average(b => b.RamMBytes), RamMBytesMax = g.Max(b => b.RamMBytes), RamMBytesMin = g.Min(b => b.RamMBytes) }).ToList(), UsageRamMBytes = collectedDataGroup .Average(d => d.UsageRamMBytes), TotalRamMBytes = collectedDataGroup .Average(d => d.TotalRamMBytes), RamUsagePercentage = collectedDataGroup .Average(d => d.RamUsagePercentage), InterruptsPerSeconds = collectedDataGroup .Average(d => d.InterruptsPerSeconds), LocalDiskUsageMBytes = collectedDataGroup .Average(d => d.LocalDiskUsageMBytes), LocalDiskTotalMBytes = collectedDataGroup .Average(d => d.LocalDiskTotalMBytes), LocalDiskUsagePercentage = collectedDataGroup .Average(d => d.LocalDiskUsagePercentage), CpuUsagePercentage = collectedDataGroup .Average(d => d.CpuUsagePercentage), Time = collectedDataGroup .Max(d => d.Time) }; var tasks = new List <Task> { SendMLReport(collectedDataDtos, destinationType), _aggregatorService.AddAggregatorEntitiesAsync(collectedDataDtosAverage) }; // await SendMLReport(collectedDataDtos, destinationType); // Save aggregated CollectedDataDto to destination table MongoDb // await _aggregatorService.AddAggregatorEntitiesAsync(collectedDataDtosAverage); if (deleteSource) { // Delete already aggregated CollectedDataDto from source table MongoDb // await _aggregatorService.DeleteManyAggregatedEntitiesAsync(collectedDataDtos.Select(dto => dto.Id)); tasks.Add(_aggregatorService.DeleteManyAggregatedEntitiesAsync(collectedDataDtos.Select(dto => dto.Id))); } await Task.WhenAll(tasks); } }