From ac5b500045f25e28e74456d06797a4a69b4ffc2a Mon Sep 17 00:00:00 2001 From: wzh425 Date: Fri, 26 Jan 2024 15:05:55 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9ARemove=20LazyLoader=20and=20separat?= =?UTF-8?q?e=20Alarm=20Rule=20Records=20from=20Alarm=20Rule=20(#338)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore : using * reactor: Adjust job blocking strategy * fix:Remove LazyLoader and separate Alarm Rule Records from Alarm Rule --- .../Commands/CheckAlarmRuleCommandHandler.cs | 11 +++--- .../UpsertAlarmRuleJobEventHandler.cs | 3 +- .../AlarmRules/Aggregates/AlarmRule.cs | 37 +------------------ .../AddAlarmRuleRecordEventHandler.cs | 14 ++----- .../IAlarmRuleRecordRepository.cs | 9 +++++ .../Services/AlarmRuleDomainService.cs | 34 +++++++++++++++-- .../AlarmRuleConfiguration.cs | 1 - .../Repositories/AlarmRuleRecordRepository.cs | 18 +++++++++ .../Properties/launchSettings.json | 4 +- .../appsettings.Development.json | 2 +- 10 files changed, 73 insertions(+), 60 deletions(-) create mode 100644 src/Domain/Masa.Alert.Domain/AlarmRules/Repositories/IAlarmRuleRecordRepository.cs create mode 100644 src/Infrastructure/Masa.Alert.EntityFrameworkCore/Repositories/AlarmRuleRecordRepository.cs diff --git a/src/Application/Masa.Alert.Application/AlarmRules/Commands/CheckAlarmRuleCommandHandler.cs b/src/Application/Masa.Alert.Application/AlarmRules/Commands/CheckAlarmRuleCommandHandler.cs index 73fd1b3e..de553a03 100644 --- a/src/Application/Masa.Alert.Application/AlarmRules/Commands/CheckAlarmRuleCommandHandler.cs +++ b/src/Application/Masa.Alert.Application/AlarmRules/Commands/CheckAlarmRuleCommandHandler.cs @@ -46,12 +46,12 @@ public async Task QueryAggregationAsync(CheckAlarmRuleCommand command) { var alarmRule = command.AlarmRule; var checkTime = command.ExcuteTime ?? DateTimeOffset.Now; - var latest = alarmRule.GetLatest(); + var latest = await _domainService.GetLatest(alarmRule.Id); var startTime = alarmRule.GetStartCheckTime(checkTime, latest); if (startTime == null) { - alarmRule.SkipCheck(checkTime); + await _domainService.SkipCheck(alarmRule.Id, checkTime); command.IsStop = true; return; } @@ -77,8 +77,7 @@ public async Task ExecuteRulesAsync(CheckAlarmRuleCommand command) { if (command.IsStop) { - command.AlarmRule.AddAggregateResult(command.ExcuteTime ?? DateTimeOffset.Now, command.AggregateResult, false, 0, new List()); - await _repository.UpdateAsync(command.AlarmRule); + await _domainService.AddAggregateResult(command.AlarmRule.Id, command.ExcuteTime ?? DateTimeOffset.Now, command.AggregateResult, false, 0, new List()); return; } @@ -93,7 +92,7 @@ private async Task> QueryLogAggregationAsync( { if (item.IsOffset && item.OffsetPeriod > 0) { - var offsetResult = alarmRule.GetOffsetResult(item.OffsetPeriod, item.Alias); + var offsetResult = await _domainService.GetOffsetResult(alarmRule.Id, item.OffsetPeriod, item.Alias); if (offsetResult.HasValue) { aggregateResult.TryAdd(item.Alias, offsetResult.Value); @@ -132,7 +131,7 @@ private async Task> QueryMetricAggregationAsy { if (item.IsOffset && item.OffsetPeriod > 0) { - var offsetResult = alarmRule.GetOffsetResult(item.OffsetPeriod, item.Alias); + var offsetResult = await _domainService.GetOffsetResult(alarmRule.Id, item.OffsetPeriod, item.Alias); if (offsetResult.HasValue) { aggregateResult.TryAdd(item.Alias, offsetResult.Value); diff --git a/src/Application/Masa.Alert.Application/AlarmRules/EventHandler/UpsertAlarmRuleJobEventHandler.cs b/src/Application/Masa.Alert.Application/AlarmRules/EventHandler/UpsertAlarmRuleJobEventHandler.cs index dd1c7153..7a6835d1 100644 --- a/src/Application/Masa.Alert.Application/AlarmRules/EventHandler/UpsertAlarmRuleJobEventHandler.cs +++ b/src/Application/Masa.Alert.Application/AlarmRules/EventHandler/UpsertAlarmRuleJobEventHandler.cs @@ -41,7 +41,8 @@ public async Task HandleEventAsync(UpsertAlarmRuleJobEvent eto) { HttpMethod = HttpMethods.POST, RequestUrl = $"{alertUrl}/api/v1/AlarmRules/{alarmRule.Id}/check" - } + }, + ScheduleBlockStrategy = ScheduleBlockStrategyTypes.Cover }; if (alarmRule.SchedulerJobId == default) diff --git a/src/Domain/Masa.Alert.Domain/AlarmRules/Aggregates/AlarmRule.cs b/src/Domain/Masa.Alert.Domain/AlarmRules/Aggregates/AlarmRule.cs index cb0090be..cef90848 100644 --- a/src/Domain/Masa.Alert.Domain/AlarmRules/Aggregates/AlarmRule.cs +++ b/src/Domain/Masa.Alert.Domain/AlarmRules/Aggregates/AlarmRule.cs @@ -32,18 +32,9 @@ public class AlarmRule : FullAggregateRoot public ICollection Items { get; protected set; } = new Collection(); - public virtual IEnumerable AlarmRuleRecords => LazyLoader.Load(this, ref _alarmRuleRecords!, nameof(AlarmRuleRecords))!; - public Guid SchedulerJobId { get; protected set; } = default; - private List _alarmRuleRecords = default!; - - private Action LazyLoader { get; set; } = default!; - - private AlarmRule(Action lazyLoader) - { - LazyLoader = lazyLoader; - } + private AlarmRule() { } public AlarmRule(string displayName, AlarmRuleTypes type, string projectIdentity, string appIdentity, string chartYAxisUnit , bool isGetTotal, string totalVariable, string whereExpression, int continuousTriggerThreshold, SilenceCycle silenceCycle) @@ -58,22 +49,6 @@ public AlarmRule(string displayName, AlarmRuleTypes type, string projectIdentity SetChartConfig(chartYAxisUnit); SetAdvancedConfig(continuousTriggerThreshold, silenceCycle); - _alarmRuleRecords = new List(); - } - - public AlarmRuleRecord? GetLatest() - { - LazyLoader.Load(this, ref _alarmRuleRecords!, nameof(AlarmRuleRecords)); - return _alarmRuleRecords.Where(x => x.AlarmRuleId == Id).OrderByDescending(x => x.ExcuteTime).FirstOrDefault(); - } - - public long? GetOffsetResult(int offsetPeriod, string alias) - { - LazyLoader.Load(this, ref _alarmRuleRecords!, nameof(AlarmRuleRecords)); - - var offsetRecord = _alarmRuleRecords.Where(x => x.AlarmRuleId == Id).OrderByDescending(x => x.ExcuteTime).Skip(offsetPeriod - 1).FirstOrDefault(); - - return offsetRecord?.AggregateResult.FirstOrDefault(x => x.Key == alias).Value; } public string GetCronExpression() @@ -228,16 +203,6 @@ public bool IsRuleValid(List ruleResult) return ruleResult.Any(x => x.IsValid); } - public void SkipCheck(DateTimeOffset excuteTime) - { - _alarmRuleRecords.Add(new AlarmRuleRecord(Id, new ConcurrentDictionary(), false, 0, excuteTime, new List())); - } - - public void AddAggregateResult(DateTimeOffset excuteTime, ConcurrentDictionary aggregateResult, bool isTrigger, int consecutiveCount, List ruleResultItems, Guid AlarmHistoryId = default) - { - _alarmRuleRecords.Add(new AlarmRuleRecord(Id, aggregateResult, isTrigger, consecutiveCount, excuteTime, ruleResultItems, AlarmHistoryId)); - } - public bool CheckIsNotification() { return Items.Any(x => x.IsNotification); diff --git a/src/Domain/Masa.Alert.Domain/AlarmRules/EventHandler/AddAlarmRuleRecordEventHandler.cs b/src/Domain/Masa.Alert.Domain/AlarmRules/EventHandler/AddAlarmRuleRecordEventHandler.cs index a75c28fc..3d5f79a1 100644 --- a/src/Domain/Masa.Alert.Domain/AlarmRules/EventHandler/AddAlarmRuleRecordEventHandler.cs +++ b/src/Domain/Masa.Alert.Domain/AlarmRules/EventHandler/AddAlarmRuleRecordEventHandler.cs @@ -5,24 +5,18 @@ namespace Masa.Alert.Domain.AlarmRules.EventHandler; public class AddAlarmRuleRecordEventHandler { - private readonly IAlarmRuleRepository _repository; - private readonly IEventBus _eventBus; + private readonly IAlarmRuleRecordRepository _repository; - public AddAlarmRuleRecordEventHandler(IAlarmRuleRepository repository - , IEventBus eventBus) + public AddAlarmRuleRecordEventHandler(IAlarmRuleRecordRepository repository) { _repository = repository; - _eventBus = eventBus; } [EventHandler] public async Task HandleEventAsync(AddAlarmRuleRecordEvent eto) { - var alarm = await _repository.FindAsync(x => x.Id == eto.AlarmRuleId); - if (alarm == null) return; + var alarm = new AlarmRuleRecord(eto.AlarmRuleId, eto.AggregateResult, eto.IsTrigger, eto.ConsecutiveCount, eto.ExcuteTime, eto.RuleResultItems, eto.AlarmHistoryId); - alarm.AddAggregateResult(eto.ExcuteTime, eto.AggregateResult, eto.IsTrigger, eto.ConsecutiveCount, eto.RuleResultItems, eto.AlarmHistoryId); - - await _repository.UpdateAsync(alarm); + await _repository.AddAsync(alarm); } } diff --git a/src/Domain/Masa.Alert.Domain/AlarmRules/Repositories/IAlarmRuleRecordRepository.cs b/src/Domain/Masa.Alert.Domain/AlarmRules/Repositories/IAlarmRuleRecordRepository.cs new file mode 100644 index 00000000..f1df2840 --- /dev/null +++ b/src/Domain/Masa.Alert.Domain/AlarmRules/Repositories/IAlarmRuleRecordRepository.cs @@ -0,0 +1,9 @@ +// Copyright (c) MASA Stack All rights reserved. +// Licensed under the Apache License. See LICENSE.txt in the project root for license information. + +namespace Masa.Alert.Domain.AlarmRules.Repositories; + +public interface IAlarmRuleRecordRepository : IRepository +{ + Task> GetQueryableAsync(); +} diff --git a/src/Domain/Masa.Alert.Domain/AlarmRules/Services/AlarmRuleDomainService.cs b/src/Domain/Masa.Alert.Domain/AlarmRules/Services/AlarmRuleDomainService.cs index f9ec031e..da152d64 100644 --- a/src/Domain/Masa.Alert.Domain/AlarmRules/Services/AlarmRuleDomainService.cs +++ b/src/Domain/Masa.Alert.Domain/AlarmRules/Services/AlarmRuleDomainService.cs @@ -6,15 +6,18 @@ namespace Masa.Alert.Domain.AlarmRules.Services; public class AlarmRuleDomainService : DomainService { private readonly IAlarmRuleRepository _repository; + private readonly IAlarmRuleRecordRepository _alarmRuleRecordRepository; private readonly IRulesEngineClient _rulesEngineClient; private readonly IDistributedCacheClient _cacheClient; public AlarmRuleDomainService(IDomainEventBus eventBus , IAlarmRuleRepository repository + , IAlarmRuleRecordRepository alarmRuleRecordRepository , IRulesEngineClient rulesEngineClient , IDistributedCacheClient cacheClient) : base(eventBus) { _repository = repository; + _alarmRuleRecordRepository = alarmRuleRecordRepository; _rulesEngineClient = rulesEngineClient; _cacheClient = cacheClient; } @@ -44,7 +47,7 @@ public async Task CheckRuleAsync(DateTimeOffset excuteTime, AlarmRule alarmRule, ruleResult.Add(ruleResultItem); } - var latestRecord = alarmRule.GetLatest(); + var latestRecord = await GetLatest(alarmRule.Id); var cacheKey = $"{AlarmCacheKeys.ALARM_CONSECUTIVE_COUNT}_{alarmRule.Id}"; var consecutiveCount = Convert.ToInt32(await _cacheClient.HashIncrementAsync(cacheKey)); @@ -67,8 +70,9 @@ public async Task CheckRuleAsync(DateTimeOffset excuteTime, AlarmRule alarmRule, consecutiveCount = 0; await _cacheClient.RemoveAsync(cacheKey); } - - alarmRule.AddAggregateResult(excuteTime, aggregateResult, false, consecutiveCount, ruleResult); + + var alarm = new AlarmRuleRecord(alarmRule.Id, aggregateResult, false, consecutiveCount, excuteTime, ruleResult, default); + await _alarmRuleRecordRepository.AddAsync(alarm); } await _repository.UpdateAsync(alarmRule); @@ -91,4 +95,28 @@ public async Task UpdateAsync(AlarmRule alarmRule, bool isEnabled, CheckFrequenc await _repository.UpdateAsync(alarmRule); } + + public async Task GetLatest(Guid alarmRuleId) + { + var query = await _alarmRuleRecordRepository.GetQueryableAsync(); + return query.Where(x => x.AlarmRuleId == alarmRuleId).OrderByDescending(x => x.ExcuteTime).FirstOrDefault(); + } + + public async Task GetOffsetResult(Guid alarmRuleId, int offsetPeriod, string alias) + { + var query = await _alarmRuleRecordRepository.GetQueryableAsync(); + var offsetRecord = query.Where(x => x.AlarmRuleId == alarmRuleId).OrderByDescending(x => x.ExcuteTime).Skip(offsetPeriod - 1).FirstOrDefault(); + + return offsetRecord?.AggregateResult.FirstOrDefault(x => x.Key == alias).Value; + } + + public async Task SkipCheck(Guid alarmRuleId, DateTimeOffset excuteTime) + { + await _alarmRuleRecordRepository.AddAsync(new AlarmRuleRecord(alarmRuleId, new ConcurrentDictionary(), false, 0, excuteTime, new List())); + } + + public async Task AddAggregateResult(Guid alarmRuleId, DateTimeOffset excuteTime, ConcurrentDictionary aggregateResult, bool isTrigger, int consecutiveCount, List ruleResultItems, Guid AlarmHistoryId = default) + { + await _alarmRuleRecordRepository.AddAsync(new AlarmRuleRecord(alarmRuleId, aggregateResult, isTrigger, consecutiveCount, excuteTime, ruleResultItems, AlarmHistoryId)); + } } diff --git a/src/Infrastructure/Masa.Alert.EntityFrameworkCore/EntityTypeConfigurations/AlarmRuleConfiguration.cs b/src/Infrastructure/Masa.Alert.EntityFrameworkCore/EntityTypeConfigurations/AlarmRuleConfiguration.cs index 54942e7f..72045e2e 100644 --- a/src/Infrastructure/Masa.Alert.EntityFrameworkCore/EntityTypeConfigurations/AlarmRuleConfiguration.cs +++ b/src/Infrastructure/Masa.Alert.EntityFrameworkCore/EntityTypeConfigurations/AlarmRuleConfiguration.cs @@ -42,7 +42,6 @@ public void Configure(EntityTypeBuilder builder) b.Property(x => x.RecoveryNotificationConfig).HasConversion(new JsonValueConverter()); b.Property(x => x.NotificationConfig).HasConversion(new JsonValueConverter()); }); - builder.HasMany(x => x.AlarmRuleRecords).WithOne(); builder.OwnsOne(x => x.CheckFrequency, b => { b.OwnsOne(x => x.FixedInterval, b => diff --git a/src/Infrastructure/Masa.Alert.EntityFrameworkCore/Repositories/AlarmRuleRecordRepository.cs b/src/Infrastructure/Masa.Alert.EntityFrameworkCore/Repositories/AlarmRuleRecordRepository.cs new file mode 100644 index 00000000..3da19675 --- /dev/null +++ b/src/Infrastructure/Masa.Alert.EntityFrameworkCore/Repositories/AlarmRuleRecordRepository.cs @@ -0,0 +1,18 @@ +// Copyright (c) MASA Stack All rights reserved. +// Licensed under the Apache License. See LICENSE.txt in the project root for license information. + +namespace Masa.Alert.EntityFrameworkCore.Repositories; + +public class AlarmRuleRecordRepository : Repository, IAlarmRuleRecordRepository +{ + public AlarmRuleRecordRepository(AlertDbContext context, IUnitOfWork unitOfWork) + : base(context, unitOfWork) + { + + } + + public async Task> GetQueryableAsync() + { + return await Task.FromResult(Context.Set().AsQueryable()); + } +} diff --git a/src/Services/Masa.Alert.Service/Properties/launchSettings.json b/src/Services/Masa.Alert.Service/Properties/launchSettings.json index 7d66d618..4b48d176 100644 --- a/src/Services/Masa.Alert.Service/Properties/launchSettings.json +++ b/src/Services/Masa.Alert.Service/Properties/launchSettings.json @@ -24,8 +24,8 @@ "IS_DEMO": "false", "OTLP_URL": "http://otel-collector.masastack:9013", "ELASTIC": "{\"Nodes\": [\"http://es-ydy-new.lonsid.cn:9200\"],\"Index\": \"auth_user_development\"}", - "REDIS": "{\"RedisHost\": \"10.130.0.235\", \"RedisPort\": 24615, \"RedisDb\": 0,\"RedisPassword\": \"Hzss@123\"}", - "CONNECTIONSTRING": "{\"Server\": \"10.130.0.235\", \"Port\": 24878,\"Database\":\"\",\"UserId\": \"ss\",\"Password\":\"Hzss@123\"}", + "REDIS": "{\"RedisHost\": \"10.130.0.19\", \"RedisPort\": 2135, \"RedisDb\": 3,\"RedisPassword\": \"Hzss@123\"}", + "CONNECTIONSTRING": "{\"Server\": \"10.130.0.19\", \"Port\": 2415,\"Database\":\"\",\"UserId\": \"ss\",\"Password\":\"Hzss@123\"}", "MASA_STACK": "[{\"id\":\"pm\",\"service\":{\"id\":\"pm-service-dev\",\"domain\":\"http://pm-service-dev.masastack.com\"},\"web\":{\"id\":\"pm-web-dev\",\"domain\":\"https://pm-dev.masastack.com\"}},{\"id\":\"dcc\",\"service\":{\"id\":\"dcc-service-dev\",\"domain\":\"http://dcc-service-dev.masastack.com\"},\"web\":{\"id\":\"dcc-web-dev\",\"domain\":\"https://dcc-dev.masastack.com\"}},{\"id\":\"tsc\",\"service\":{\"id\":\"tsc-service-dev\",\"domain\":\"http://tsc-service-dev.masastack.com\"},\"web\":{\"id\":\"tsc-web-dev\",\"domain\":\"https://tsc-dev.masastack.com\"}},{\"id\":\"alert\",\"service\":{\"id\":\"alert-service-dev\",\"domain\":\"http://alert-service-dev.masastack.com\"},\"web\":{\"id\":\"alert-web-dev\",\"domain\":\"https://alert-dev.masastack.com\"}},{\"id\":\"scheduler\",\"service\":{\"id\":\"scheduler-service-dev\",\"domain\":\"http://scheduler-service-dev.masastack.com\"},\"worker\":{\"id\":\"scheduler-worker-dev\",\"domain\":\"http://scheduler-worker-dev.masastack.com\"},\"web\":{\"id\":\"scheduler-web-dev\",\"domain\":\"https://scheduler-dev.masastack.com\"}},{\"id\":\"mc\",\"service\":{\"id\":\"mc-service-dev\",\"domain\":\"http://mc-service-dev.masastack.com\"},\"web\":{\"id\":\"mc-web-dev\",\"domain\":\"https://mc-dev.masastack.com\"}},{\"id\":\"auth\",\"service\":{\"id\":\"auth-service-dev\",\"domain\":\"http://auth-service-dev.masastack.com\"},\"web\":{\"id\":\"auth-web-dev\",\"domain\":\"https://auth-dev.masastack.com\"},\"sso\":{\"id\":\"auth-sso-dev\",\"domain\":\"https://auth-sso-dev.masastack.com\"}}]", "MASA_ENVIRONMENT": "Development", "ADMIN_PWD": "admin_pwd", diff --git a/src/Services/Masa.Alert.Service/appsettings.Development.json b/src/Services/Masa.Alert.Service/appsettings.Development.json index 5d220276..393bc747 100644 --- a/src/Services/Masa.Alert.Service/appsettings.Development.json +++ b/src/Services/Masa.Alert.Service/appsettings.Development.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Server=10.130.0.235,24878;Database=alert_dev;User Id=ss;Password=Hzss@123;" + "DefaultConnection": "Server=10.130.0.19,2415;Database=alert_dev;User Id=ss;Password=Hzss@123;" }, "Logging": { "LogLevel": {