From 90865a73b5d11236605bbcdee84097110a4f68a5 Mon Sep 17 00:00:00 2001 From: Flaminel Date: Fri, 4 Jul 2025 21:14:27 +0300 Subject: [PATCH] Add failed import messages to logs (#230) --- .../Features/ContentBlocker/ContentBlocker.cs | 1 - .../DownloadCleaner/DownloadCleaner.cs | 1 - .../Features/QueueCleaner/QueueCleaner.cs | 1 - .../Entities/Arr/Queue/QueueListResponse.cs | 4 +-- .../Entities/Arr/Queue/QueueRecord.cs | 2 -- .../Arr/Queue/TrackedDownloadStatusMessage.cs | 2 +- .../Events/EventPublisher.cs | 35 +++++++++++++++++-- .../Features/Arr/ArrClient.cs | 9 +++-- .../Features/Arr/ArrQueueIterator.cs | 1 - .../Features/Arr/Interfaces/IArrClient.cs | 1 - .../Features/Arr/LidarrClient.cs | 1 - .../Features/Arr/RadarrClient.cs | 1 - .../Features/Arr/ReadarrClient.cs | 1 - .../Features/Arr/SonarrClient.cs | 1 - .../Models/QueueItemRemoveRequest.cs | 1 - .../DownloadRemover/QueueItemRemover.cs | 1 - .../Features/Jobs/GenericHandler.cs | 1 - .../Notifications/NotificationPublisher.cs | 1 - 18 files changed, 42 insertions(+), 23 deletions(-) diff --git a/code/backend/Cleanuparr.Application/Features/ContentBlocker/ContentBlocker.cs b/code/backend/Cleanuparr.Application/Features/ContentBlocker/ContentBlocker.cs index 32c03f20..1394dd09 100644 --- a/code/backend/Cleanuparr.Application/Features/ContentBlocker/ContentBlocker.cs +++ b/code/backend/Cleanuparr.Application/Features/ContentBlocker/ContentBlocker.cs @@ -13,7 +13,6 @@ using Cleanuparr.Persistence.Models.Configuration; using Cleanuparr.Persistence.Models.Configuration.Arr; using Cleanuparr.Persistence.Models.Configuration.ContentBlocker; using Cleanuparr.Persistence.Models.Configuration.General; -using Data.Models.Arr.Queue; using MassTransit; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; diff --git a/code/backend/Cleanuparr.Application/Features/DownloadCleaner/DownloadCleaner.cs b/code/backend/Cleanuparr.Application/Features/DownloadCleaner/DownloadCleaner.cs index 4608d463..2c3c6b48 100644 --- a/code/backend/Cleanuparr.Application/Features/DownloadCleaner/DownloadCleaner.cs +++ b/code/backend/Cleanuparr.Application/Features/DownloadCleaner/DownloadCleaner.cs @@ -11,7 +11,6 @@ using Cleanuparr.Persistence; using Cleanuparr.Persistence.Models.Configuration.Arr; using Cleanuparr.Persistence.Models.Configuration.DownloadCleaner; using Cleanuparr.Persistence.Models.Configuration.General; -using Data.Models.Arr.Queue; using MassTransit; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; diff --git a/code/backend/Cleanuparr.Application/Features/QueueCleaner/QueueCleaner.cs b/code/backend/Cleanuparr.Application/Features/QueueCleaner/QueueCleaner.cs index 3824302d..03dd5b46 100644 --- a/code/backend/Cleanuparr.Application/Features/QueueCleaner/QueueCleaner.cs +++ b/code/backend/Cleanuparr.Application/Features/QueueCleaner/QueueCleaner.cs @@ -12,7 +12,6 @@ using Cleanuparr.Persistence.Models.Configuration; using Cleanuparr.Persistence.Models.Configuration.Arr; using Cleanuparr.Persistence.Models.Configuration.General; using Cleanuparr.Persistence.Models.Configuration.QueueCleaner; -using Data.Models.Arr.Queue; using MassTransit; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; diff --git a/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueListResponse.cs b/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueListResponse.cs index 31e5732d..e2f52a90 100644 --- a/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueListResponse.cs +++ b/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueListResponse.cs @@ -1,6 +1,4 @@ -using Data.Models.Arr.Queue; - -namespace Cleanuparr.Domain.Entities.Arr.Queue; +namespace Cleanuparr.Domain.Entities.Arr.Queue; public record QueueListResponse { diff --git a/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueRecord.cs b/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueRecord.cs index ca76a78c..0fc35eff 100644 --- a/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueRecord.cs +++ b/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/QueueRecord.cs @@ -1,5 +1,3 @@ -using Data.Models.Arr.Queue; - namespace Cleanuparr.Domain.Entities.Arr.Queue; public sealed record QueueRecord diff --git a/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/TrackedDownloadStatusMessage.cs b/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/TrackedDownloadStatusMessage.cs index c8a6bff2..541ece35 100644 --- a/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/TrackedDownloadStatusMessage.cs +++ b/code/backend/Cleanuparr.Domain/Entities/Arr/Queue/TrackedDownloadStatusMessage.cs @@ -1,4 +1,4 @@ -namespace Data.Models.Arr.Queue; +namespace Cleanuparr.Domain.Entities.Arr.Queue; public sealed record TrackedDownloadStatusMessage { diff --git a/code/backend/Cleanuparr.Infrastructure/Events/EventPublisher.cs b/code/backend/Cleanuparr.Infrastructure/Events/EventPublisher.cs index fb75535a..c59b5f09 100644 --- a/code/backend/Cleanuparr.Infrastructure/Events/EventPublisher.cs +++ b/code/backend/Cleanuparr.Infrastructure/Events/EventPublisher.cs @@ -1,4 +1,7 @@ +using System.Dynamic; using System.Text.Json; +using System.Text.Json.Serialization; +using Cleanuparr.Domain.Entities.Arr.Queue; using Cleanuparr.Domain.Enums; using Cleanuparr.Infrastructure.Features.Context; using Cleanuparr.Infrastructure.Features.Notifications; @@ -47,7 +50,10 @@ public class EventPublisher EventType = eventType, Message = message, Severity = severity, - Data = data != null ? JsonSerializer.Serialize(data) : null, + Data = data != null ? JsonSerializer.Serialize(data, new JsonSerializerOptions + { + Converters = { new JsonStringEnumConverter() } + }) : null, TrackingId = trackingId }; @@ -75,12 +81,37 @@ public class EventPublisher StrikeType.SlowTime => EventType.SlowTimeStrike, }; + dynamic data; + + if (strikeType is StrikeType.FailedImport) + { + QueueRecord record = ContextProvider.Get(nameof(QueueRecord)); + data = new + { + hash, + itemName, + strikeCount, + strikeType, + failedImportReasons = record.StatusMessages ?? [], + }; + } + else + { + data = new + { + hash, + itemName, + strikeCount, + strikeType, + }; + } + // Publish the event await PublishAsync( eventType, $"Item '{itemName}' has been struck {strikeCount} times for reason '{strikeType}'", EventSeverity.Important, - data: new { hash, itemName, strikeCount, strikeType }); + data: data); // Send notification (uses ContextProvider internally) await _notificationPublisher.NotifyStrike(strikeType, strikeCount); diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs index 71241753..ee837e3f 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs @@ -7,7 +7,6 @@ using Cleanuparr.Persistence.Models.Configuration.Arr; using Cleanuparr.Persistence.Models.Configuration.QueueCleaner; using Cleanuparr.Shared.Helpers; using Data.Models.Arr; -using Data.Models.Arr.Queue; using Infrastructure.Interceptors; using Microsoft.Extensions.Logging; using Newtonsoft.Json; @@ -106,6 +105,12 @@ public abstract class ArrClient : IArrClient ushort maxStrikes = arrMaxStrikes > 0 ? (ushort)arrMaxStrikes : queueCleanerConfig.FailedImport.MaxStrikes; + _logger.LogInformation( + "Item {title} has failed import status with the following reason(s):\n{messages}", + record.Title, + string.Join("\n", record.StatusMessages?.Select(JsonConvert.SerializeObject) ?? []) + ); + return await _striker.StrikeAndCheckLimit( record.DownloadId, record.Title, @@ -207,7 +212,7 @@ public abstract class ArrClient : IArrClient return response; } - private bool HasIgnoredPatterns(QueueRecord record) + private static bool HasIgnoredPatterns(QueueRecord record) { var queueCleanerConfig = ContextProvider.Get(); diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrQueueIterator.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrQueueIterator.cs index ee282bc0..9a9cfcf8 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrQueueIterator.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrQueueIterator.cs @@ -1,7 +1,6 @@ using Cleanuparr.Domain.Entities.Arr.Queue; using Cleanuparr.Infrastructure.Features.Arr.Interfaces; using Cleanuparr.Persistence.Models.Configuration.Arr; -using Data.Models.Arr.Queue; using Microsoft.Extensions.Logging; namespace Cleanuparr.Infrastructure.Features.Arr; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/Interfaces/IArrClient.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/Interfaces/IArrClient.cs index 5a16ee6a..e981e730 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/Interfaces/IArrClient.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/Interfaces/IArrClient.cs @@ -2,7 +2,6 @@ using Cleanuparr.Domain.Enums; using Cleanuparr.Persistence.Models.Configuration.Arr; using Data.Models.Arr; -using Data.Models.Arr.Queue; namespace Cleanuparr.Infrastructure.Features.Arr.Interfaces; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/LidarrClient.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/LidarrClient.cs index 1bf06f70..5bd606b3 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/LidarrClient.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/LidarrClient.cs @@ -5,7 +5,6 @@ using Cleanuparr.Infrastructure.Features.Arr.Interfaces; using Cleanuparr.Infrastructure.Features.ItemStriker; using Cleanuparr.Persistence.Models.Configuration.Arr; using Data.Models.Arr; -using Data.Models.Arr.Queue; using Infrastructure.Interceptors; using Microsoft.Extensions.Logging; using Newtonsoft.Json; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/RadarrClient.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/RadarrClient.cs index 09e547d7..6f881dcf 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/RadarrClient.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/RadarrClient.cs @@ -5,7 +5,6 @@ using Cleanuparr.Infrastructure.Features.Arr.Interfaces; using Cleanuparr.Infrastructure.Features.ItemStriker; using Cleanuparr.Persistence.Models.Configuration.Arr; using Data.Models.Arr; -using Data.Models.Arr.Queue; using Infrastructure.Interceptors; using Microsoft.Extensions.Logging; using Newtonsoft.Json; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ReadarrClient.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ReadarrClient.cs index 91b23c0e..e6daadb4 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ReadarrClient.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ReadarrClient.cs @@ -5,7 +5,6 @@ using Cleanuparr.Infrastructure.Features.Arr.Interfaces; using Cleanuparr.Infrastructure.Features.ItemStriker; using Cleanuparr.Persistence.Models.Configuration.Arr; using Data.Models.Arr; -using Data.Models.Arr.Queue; using Infrastructure.Interceptors; using Microsoft.Extensions.Logging; using Newtonsoft.Json; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/SonarrClient.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/SonarrClient.cs index 70be33b8..5297c21f 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/SonarrClient.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/SonarrClient.cs @@ -6,7 +6,6 @@ using Cleanuparr.Infrastructure.Features.Arr.Interfaces; using Cleanuparr.Infrastructure.Features.ItemStriker; using Cleanuparr.Persistence.Models.Configuration.Arr; using Data.Models.Arr; -using Data.Models.Arr.Queue; using Infrastructure.Interceptors; using Microsoft.Extensions.Logging; using Newtonsoft.Json; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/Models/QueueItemRemoveRequest.cs b/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/Models/QueueItemRemoveRequest.cs index 2860ff12..8b1cb7ca 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/Models/QueueItemRemoveRequest.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/Models/QueueItemRemoveRequest.cs @@ -2,7 +2,6 @@ using Cleanuparr.Domain.Enums; using Cleanuparr.Persistence.Models.Configuration.Arr; using Data.Models.Arr; -using Data.Models.Arr.Queue; namespace Cleanuparr.Infrastructure.Features.DownloadRemover.Models; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/QueueItemRemover.cs b/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/QueueItemRemover.cs index a3b93614..4fba9789 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/QueueItemRemover.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/DownloadRemover/QueueItemRemover.cs @@ -9,7 +9,6 @@ using Cleanuparr.Infrastructure.Helpers; using Cleanuparr.Persistence; using Cleanuparr.Persistence.Models.Configuration.Arr; using Data.Models.Arr; -using Data.Models.Arr.Queue; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Jobs/GenericHandler.cs b/code/backend/Cleanuparr.Infrastructure/Features/Jobs/GenericHandler.cs index 4a427ba0..5e742ffd 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Jobs/GenericHandler.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Jobs/GenericHandler.cs @@ -13,7 +13,6 @@ using Cleanuparr.Persistence.Models.Configuration.DownloadCleaner; using Cleanuparr.Persistence.Models.Configuration.General; using Cleanuparr.Persistence.Models.Configuration.QueueCleaner; using Data.Models.Arr; -using Data.Models.Arr.Queue; using MassTransit; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Notifications/NotificationPublisher.cs b/code/backend/Cleanuparr.Infrastructure/Features/Notifications/NotificationPublisher.cs index 86a86448..1ed8e226 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Notifications/NotificationPublisher.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Notifications/NotificationPublisher.cs @@ -4,7 +4,6 @@ using Cleanuparr.Domain.Enums; using Cleanuparr.Infrastructure.Features.Context; using Cleanuparr.Infrastructure.Features.Notifications.Models; using Cleanuparr.Persistence.Models.Configuration.Arr; -using Data.Models.Arr.Queue; using Infrastructure.Interceptors; using Mapster; using MassTransit;