From 40b83826a4f1f75d36ff1a1d221e302d0bed67b3 Mon Sep 17 00:00:00 2001 From: KharchenkoVV Date: Mon, 27 Sep 2021 11:47:39 +0500 Subject: [PATCH] CS2-88: Changed telemetry analysis start event. --- ...undQueue.cs => IReportsBackgroundQueue.cs} | 2 +- .../Services/ITelemetryAnalyticsService.cs | 2 +- AsbCloudInfrastructure/DependencyInjection.cs | 5 +- .../Services/DataService.cs | 7 +- .../Services/ReportService.cs | 4 +- ...oundQueue.cs => ReportsBackgroundQueue.cs} | 2 +- ...Service.cs => ReportsBackgroundService.cs} | 6 +- .../TelemetryAnalyticsBackgroundService.cs | 64 +++++++++++++++++++ .../Services/TelemetryAnalyticsService.cs | 55 ++++++++++------ 9 files changed, 111 insertions(+), 36 deletions(-) rename AsbCloudApp/Services/{IBackgroundQueue.cs => IReportsBackgroundQueue.cs} (79%) rename AsbCloudInfrastructure/Services/{BackgroundQueue.cs => ReportsBackgroundQueue.cs} (92%) rename AsbCloudInfrastructure/Services/{BackgroundWorkerService.cs => ReportsBackgroundService.cs} (84%) create mode 100644 AsbCloudInfrastructure/Services/TelemetryAnalyticsBackgroundService.cs diff --git a/AsbCloudApp/Services/IBackgroundQueue.cs b/AsbCloudApp/Services/IReportsBackgroundQueue.cs similarity index 79% rename from AsbCloudApp/Services/IBackgroundQueue.cs rename to AsbCloudApp/Services/IReportsBackgroundQueue.cs index b4394cc9..adc42c56 100644 --- a/AsbCloudApp/Services/IBackgroundQueue.cs +++ b/AsbCloudApp/Services/IReportsBackgroundQueue.cs @@ -2,7 +2,7 @@ namespace AsbCloudApp.Services { - public interface IBackgroundQueue + public interface IReportsBackgroundQueue { int EnqueueTask(Action action); diff --git a/AsbCloudApp/Services/ITelemetryAnalyticsService.cs b/AsbCloudApp/Services/ITelemetryAnalyticsService.cs index 065d6429..8b4f86bf 100644 --- a/AsbCloudApp/Services/ITelemetryAnalyticsService.cs +++ b/AsbCloudApp/Services/ITelemetryAnalyticsService.cs @@ -23,7 +23,7 @@ namespace AsbCloudApp.Services Task> GetOperationsToIntervalAsync(int idWell, int intervalHoursTimestamp, int workBeginTimestamp, CancellationToken token = default); - void SaveAnalytics(TelemetryDataSaubDto dataSaub); + void SaveAnalytics(); Task GetOperationsDateRangeAsync(int idWell, CancellationToken token = default); } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index d95d72a1..408f9c72 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -18,11 +18,12 @@ namespace AsbCloudInfrastructure services.AddScoped(provider => provider.GetService()); - services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); services.AddSingleton(new CacheDb()); services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddTransient(); diff --git a/AsbCloudInfrastructure/Services/DataService.cs b/AsbCloudInfrastructure/Services/DataService.cs index ea45fb20..1896a759 100644 --- a/AsbCloudInfrastructure/Services/DataService.cs +++ b/AsbCloudInfrastructure/Services/DataService.cs @@ -17,17 +17,15 @@ namespace AsbCloudInfrastructure.Services { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; - //private readonly ITelemetryAnalyticsService analyticsService; private readonly CacheTable cacheTelemetry; private readonly CacheTable cacheTelemetryUsers; private readonly CacheTable cacheWells; public DataService(IAsbCloudDbContext db, ITelemetryService telemetryService, - ITelemetryAnalyticsService analyticsService, CacheDb cacheDb) + CacheDb cacheDb) { this.db = db; this.telemetryService = telemetryService; - //this.analyticsService = analyticsService; cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheTelemetryUsers = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheWells = cacheDb.GetCachedTable((AsbCloudDbContext)db); @@ -106,9 +104,6 @@ namespace AsbCloudInfrastructure.Services dataSaub.IdUser = telemetryUser?.IdUser; dataSaub.IdTelemetry = telemetryId; db.TelemetryDataSaub.Add(dataSaub); - - //dto.IdTelemetry = telemetryId; - //analyticsService.SaveAnalytics(dto); } return await db.SaveChangesAsync(token); diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index de0cdbb0..e9a47329 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -20,11 +20,11 @@ namespace AsbCloudInfrastructure.Services private readonly IConfiguration configuration; private readonly ITelemetryService telemetryService; private readonly IFileService fileService; - private readonly IBackgroundQueue queue; + private readonly IReportsBackgroundQueue queue; public ReportService(IAsbCloudDbContext db, IConfiguration configuration, ITelemetryService telemetryService, IFileService fileService, - IBackgroundQueue queue) + IReportsBackgroundQueue queue) { this.db = db; this.configuration = configuration; diff --git a/AsbCloudInfrastructure/Services/BackgroundQueue.cs b/AsbCloudInfrastructure/Services/ReportsBackgroundQueue.cs similarity index 92% rename from AsbCloudInfrastructure/Services/BackgroundQueue.cs rename to AsbCloudInfrastructure/Services/ReportsBackgroundQueue.cs index 629551f6..132ff352 100644 --- a/AsbCloudInfrastructure/Services/BackgroundQueue.cs +++ b/AsbCloudInfrastructure/Services/ReportsBackgroundQueue.cs @@ -4,7 +4,7 @@ using System.Collections.Concurrent; namespace AsbCloudInfrastructure.Services { - class BackgroundQueue : IBackgroundQueue + class ReportsBackgroundQueue : IReportsBackgroundQueue { private readonly ConcurrentQueue<(Action action, int id)> tasks = new ConcurrentQueue<(Action action, int id)>(); diff --git a/AsbCloudInfrastructure/Services/BackgroundWorkerService.cs b/AsbCloudInfrastructure/Services/ReportsBackgroundService.cs similarity index 84% rename from AsbCloudInfrastructure/Services/BackgroundWorkerService.cs rename to AsbCloudInfrastructure/Services/ReportsBackgroundService.cs index 14a8e253..705ee426 100644 --- a/AsbCloudInfrastructure/Services/BackgroundWorkerService.cs +++ b/AsbCloudInfrastructure/Services/ReportsBackgroundService.cs @@ -7,11 +7,11 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { - public class BackgroundWorkerService : BackgroundService + public class ReportsBackgroundService : BackgroundService { - private readonly IBackgroundQueue tasksQueue; + private readonly IReportsBackgroundQueue tasksQueue; - public BackgroundWorkerService(IBackgroundQueue tasksQueue) + public ReportsBackgroundService(IReportsBackgroundQueue tasksQueue) { this.tasksQueue = tasksQueue; } diff --git a/AsbCloudInfrastructure/Services/TelemetryAnalyticsBackgroundService.cs b/AsbCloudInfrastructure/Services/TelemetryAnalyticsBackgroundService.cs new file mode 100644 index 00000000..761bc7b7 --- /dev/null +++ b/AsbCloudInfrastructure/Services/TelemetryAnalyticsBackgroundService.cs @@ -0,0 +1,64 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Diagnostics; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Hosting; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.Cache; +using AsbCloudDb.Model; + +namespace AsbCloudInfrastructure.Services +{ + public class TelemetryAnalyticsBackgroundService : BackgroundService + { + private static readonly DbContextOptions options = + new DbContextOptionsBuilder() + .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") + .Options; + private readonly AsbCloudDbContext context = new AsbCloudDbContext(options); + + private readonly CacheDb cacheDb; + private readonly ISaubDataCache saubDataCache; + + public TelemetryAnalyticsBackgroundService(ISaubDataCache saubDataCache, CacheDb cacheDb) + { + this.saubDataCache = saubDataCache; + this.cacheDb = cacheDb; + } + + protected override async Task ExecuteAsync(CancellationToken token = default) + { + var telemetryService = new TelemetryService(context, cacheDb); + var analyticsService = new TelemetryAnalyticsService(context, + telemetryService, saubDataCache, cacheDb); + + var timeToStartAnalysis = DateTime.Now; + + while (!token.IsCancellationRequested) + { + if(DateTime.Now > timeToStartAnalysis) + { + try + { + timeToStartAnalysis = DateTime.Now.AddHours(1); + + await Task.Run(() => analyticsService.SaveAnalytics(), token) + .ConfigureAwait(false); + } + catch (Exception ex) + { + Trace.TraceError(ex.Message); + Console.WriteLine(ex.Message); + } + } + } + } + + public override async Task StopAsync(CancellationToken token) + { + await base.StopAsync(token).ConfigureAwait(false); + } + + } +} diff --git a/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs b/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs index 5c5b93fb..0ec88364 100644 --- a/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs @@ -231,32 +231,47 @@ namespace AsbCloudInfrastructure.Services return groupedOperationsList; } - public void SaveAnalytics(TelemetryDataSaubDto dataSaubDto) + public void SaveAnalytics() { - saubDataCache.AddData(dataSaubDto); + var alltelemetryIds = db.TelemetryDataSaub.Select(t => t.IdTelemetry).Distinct().ToList(); - if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1) + foreach(var idTelemetry in alltelemetryIds) { - var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry) - .OrderBy(d => d.Date); + var telemetries = db.TelemetryDataSaub.Where(t => t.IdTelemetry == idTelemetry && + t.Date.Hour == (DateTime.UtcNow.Hour - 1)).ToList(); - var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs); - - if (saubDataCache.CurrentAnalysis is null) - saubDataCache.CurrentAnalysis = telemetryAnalysisDto; - - if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation) + foreach(var telemetry in telemetries) { - saubDataCache.CurrentAnalysis.DurationSec += - telemetryAnalysisDto.DurationSec; - saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth; - } - else - { - db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt()); - saubDataCache.CurrentAnalysis = telemetryAnalysisDto; - saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth; + var dataSaubDto = telemetry.Adapt(); + + saubDataCache.AddData(dataSaubDto); + + if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1) + { + var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry) + .OrderBy(d => d.Date); + + var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs); + + if (saubDataCache.CurrentAnalysis is null) + saubDataCache.CurrentAnalysis = telemetryAnalysisDto; + + if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation) + { + saubDataCache.CurrentAnalysis.DurationSec += + telemetryAnalysisDto.DurationSec; + saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth; + } + else + { + db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt()); + saubDataCache.CurrentAnalysis = telemetryAnalysisDto; + saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth; + } + } } + + db.SaveChanges(); } }