2013-04-17 20 views
5

Urządzenie current advice on handling exceptions in NServiceBus służy do korzystania z wbudowanych urządzeń. Skorygowane komunikaty przechodzą do kolejki komunikatów o błędach, a dziennik jest zapisywany na dysku.Czy istnieje globalny program obsługi wyjątków dla NServiceBus?

Ale co jeśli chcę wysłać swoje błędy do usługi takiej jak AirBrake, która ma lepszą funkcjonalność grupowania podobnych wyjątków, danych i innych dobrych rzeczy? Czy istnieje globalny program obsługi wyjątków, z którego mogę skorzystać?

Odpowiedz

4

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.

1

Istnieje interfejs w NServiceBus nazywa IManageMessageFailures, ale nie wierzę, można go używać w conjucntion z drugiego poziomu RETRIES tak byś prawdopodobnie stracić, że jeśli nie iść na własną rękę.

Można napisać błędy do SQL Server z log4net i stamtąd można przekazać je do AirBrake za pomocą ich API oznaczania każdego błędu w tabeli błędów, jak może później?

+0

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! –

1

Sugerowałbym utworzenie niestandardowego punktu końcowego, który zasila kolejkę błędów i przesyła dane do AirBrake.

Nota boczna: v4.0 | 4.1 będzie dostarczany z ładną funkcją Rest-Api, która zapewnia dobre możliwości zarządzania/sprawdzania błędów. Narzędzia takie jak Profiler i Ops wykorzystują ten api do przedstawiania danych na różne sposoby.

http://particular.net/service-platform

+0

To pytanie/odpowiedź jest trochę stara, ale od tego czasu dowiedziałem się, że przyczyną tego nie jest globalny program obsługi, ponieważ każda awaria powinna być rozpatrywana w kontekście wymagań biznesowych. –

1

Przełączyliśmy się na Serilog, ma doskonałe funkcje rejestrowania i śledzenia dla NServiceBus. Utworzenie niestandardowego zlewu Serilog, który będzie wysyłać zdarzenia dziennika, gdziekolwiek chcesz, jest dość łatwe.

Powiązane problemy