add performance logging on demand, fix minion issues

This commit is contained in:
rootdarkarchon
2023-02-19 16:11:40 +01:00
parent 6cf0ecdef1
commit 44450b24b4
29 changed files with 580 additions and 294 deletions

View File

@@ -1,4 +1,6 @@
using Microsoft.Extensions.Logging;
using MareSynchronos.Utils;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
namespace MareSynchronos.Mediator;
@@ -8,10 +10,12 @@ public class MareMediator : IDisposable
private readonly Dictionary<Type, HashSet<MediatorSubscriber>> _subscriberDict = new();
private readonly ILogger<MareMediator> _logger;
private readonly PerformanceCollector _performanceCollector;
public MareMediator(ILogger<MareMediator> logger)
public MareMediator(ILogger<MareMediator> logger, PerformanceCollector performanceCollector)
{
_logger = logger;
_performanceCollector = performanceCollector;
}
public void Subscribe<T>(IMediatorSubscriber subscriber, Action<IMessage> action) where T : IMessage
@@ -36,18 +40,22 @@ public class MareMediator : IDisposable
{
if (_subscriberDict.TryGetValue(message.GetType(), out var subscribers))
{
foreach (var subscriber in subscribers.ToList())
Stopwatch globalStopwatch = Stopwatch.StartNew();
_performanceCollector.LogPerformance(this, $"Publish>{message.GetType().Name}", () =>
{
try
foreach (var subscriber in subscribers.ToList())
{
subscriber.Action.Invoke(message);
try
{
_performanceCollector.LogPerformance(this, $"Publish>{message.GetType().Name}+{subscriber.Subscriber.GetType().Name}", () => subscriber.Action.Invoke(message));
}
catch (Exception ex)
{
_logger.LogCritical(ex, "Error executing {type} for subscriber {subscriber}, removing from Mediator", message.GetType(), subscriber);
subscribers.RemoveWhere(s => s == subscriber);
}
}
catch (Exception ex)
{
_logger.LogCritical("Error executing " + message.GetType() + " for subscriber " + subscriber + ", removing from Mediator", ex);
subscribers.RemoveWhere(s => s == subscriber);
}
}
});
}
}
@@ -57,13 +65,13 @@ public class MareMediator : IDisposable
{
var unSubbed = kvp.Value.RemoveWhere(p => p.Subscriber == subscriber);
if (unSubbed > 0)
_logger.LogTrace(subscriber + " unsubscribed from " + kvp.Key.Name);
_logger.LogDebug("{sub} unsubscribed from {msg}", subscriber, kvp.Key.Name);
}
}
public void Dispose()
{
_logger.LogTrace($"Disposing {GetType()}");
_logger.LogTrace("Disposing {type}", GetType());
_subscriberDict.Clear();
}
}