Esempio n. 1
0
        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);
            }
        }