Jak wspomniano w oryginalnym poście zalecanego rozwiązania jest użycie ServicePulse za błędy monitoringu. Klient, na którym aktualnie pracuję, używa niestandardowego scentralizowanego programu rejestrującego i chcemy, aby NServiceBus logował się do tego magazynu dziennika, gdy wiadomości są przekazywane do kolejki błędów.
Mogliśmy to osiągnąć, edytując konfigurację log4net, jeśli wyjątek od NServiceBus zawiera oryginalny wyjątek, obecnie NServiceBus rejestruje ogólny komunikat o błędzie bez szczegółów dotyczących przyczyny niepowodzenia.
NServiceBus ma klasę o nazwie NServiceBus.Faults.ErrorsNotifications który zawiera następujące obserwable:
- MessageSentToErrorQueue
- MessageHasFailedAFirstLevelRetryAttempt
- MessageHasBeenSentToSecondLevelRetries
Możesz zapisać się do tych obserwabli gdy punkt końcowy uruchamia się, jak w poniższym przykładzie, który rejestruje błąd, gdy wiadomości są w se nt do kolejki o błędzie:
public class GlobalErrorHandler : IWantToRunWhenBusStartsAndStops
{
private readonly ILogger _logger;
private readonly BusNotifications _busNotifications;
readonly List<IDisposable> _notificationSubscriptions = new List<IDisposable>();
public GlobalErrorHandler(ILogger logger, BusNotifications busNotifications)
{
_logger = logger;
_busNotifications = busNotifications;
}
public void Start()
{
_notificationSubscriptions.Add(_busNotifications.Errors.MessageSentToErrorQueue.Subscribe(LogWhenMessageSentToErrorQueue));
}
public void Stop()
{
foreach (var subscription in _notificationSubscriptions)
{
subscription.Dispose();
}
}
private void LogWhenMessageSentToErrorQueue(FailedMessage message)
{
var properties = new
{
MessageType = message.Headers["NServiceBus.EnclosedMessageTypes"],
MessageId = message.Headers["NServiceBus.MessageId"],
OriginatingMachine = message.Headers["NServiceBus.OriginatingMachine"],
OriginatingEndpoint = message.Headers["NServiceBus.OriginatingEndpoint"],
ExceptionType = message.Headers["NServiceBus.ExceptionInfo.ExceptionType"],
ExceptionMessage = message.Headers["NServiceBus.ExceptionInfo.Message"],
ExceptionSource = message.Headers["NServiceBus.ExceptionInfo.Source"],
TimeSent = message.Headers["NServiceBus.TimeSent"]
};
_logger.Error("Message sent to error queue. " + properties, message.Exception);
}
}
Zauważalny jest realizowany za pomocą reaktywnych Extensions, więc trzeba będzie zainstalować pakiet Nuget Rx-Core to zadziałało.
To naprawdę jest do bani, jeśli nie można go użyć z ponownymi próbami drugiego poziomu. W każdym razie dzięki! –