Używam Sentry (w projekcie django) i chciałbym wiedzieć, w jaki sposób mogę uzyskać poprawne zagregowanie błędów. Rejestruję określone działania użytkowników jako błędy, więc nie ma żadnego wyjątku systemowego i używam atrybutu culprit
do ustawienia przyjaznej nazwy błędu. Wiadomość jest szablonem i zawiera wspólny komunikat ("Użytkownik x" nie mógł wykonać akcji z powodu "y"), ale nigdy nie jest dokładnie taki sam (różni użytkownicy, różne warunki).W jaki sposób Sentry agreguje błędy?
Sentry wyraźnie używa jakiś zestaw atrybutów pod maską, aby określić, czy łączyć błędy jak samego wyjątku, ale mimo przejrzałem kodu, nie mogę dowiedzieć się, jak.
Może ktoś krótko obciąć konieczności kopać dalej do kodu i powiedz mi, jakie właściwości muszę ustawić w celu zarządzania agregację jak pragnę?
[UPDATE 1: grupowanie zdarzeń]
Linia ta pojawia się w sentry.models.Group:
class Group(MessageBase):
"""
Aggregated message which summarizes a set of Events.
"""
...
class Meta:
unique_together = (('project', 'logger', 'culprit', 'checksum'),)
...
Jaki sens - projekt, rejestrator i sprawcę ja ustawiania w tej chwili - problem to checksum
. Zbadam dalej, jednak "suma kontrolna" sugeruje równoważność binarną, która nigdy nie zadziała - musi być możliwe grupowanie wystąpień tego samego wyjątku, z atrybutami różnicowania?
[Aktualizacja 2: kontrolne event]
kontrolna zdarzenie pochodzi od sposobu sentry.manager.get_checksum_from_event
:
def get_checksum_from_event(event):
for interface in event.interfaces.itervalues():
result = interface.get_hash()
if result:
hash = hashlib.md5()
for r in result:
hash.update(to_string(r))
return hash.hexdigest()
return hashlib.md5(to_string(event.message)).hexdigest()
Następny przystanek - gdzie zrobić imprezę interfaces
pochodzi?
[3 UPDATE: interfejsy event]
Pracowałem że interfaces odnoszą się do standardowego mechanizmu opisujące dane przekazane do posterunku wydarzeń, a że używam standardowe sentry.interfaces.Message
i sentry.interfaces.User
interfejsów.
Oba te elementy zawierają różne dane w zależności od wystąpienia wyjątku - i dlatego suma kontrolna nigdy nie będzie zgodna. Czy jest jakiś sposób, że mogę je wykluczyć z obliczania sumy kontrolnej? (Lub przynajmniej wartość User
interfejs, a który musi być różny - wartość Message
interfejs mogę standaryzacji).
[Aktualizacja 4: Roztwór]
Oto dwa get_hash
funkcji do Message
i User
interfejsy odpowiednio:
# sentry.interfaces.Message
def get_hash(self):
return [self.message]
# sentry.interfaces.User
def get_hash(self):
return []
patrząc na te dwa, tylko interfejs Message.get_hash
powróci do wartości, które są odbierane przez sposobu get_checksum_for_event
, a więc jest to taki, który jest zwrócony (słupek itd.), H Skutkiem tego jest to, że suma kontrolna jest oceniana tylko na samym komunikacie - co teoretycznie oznacza, że mogę standaryzować wiadomość i zachować unikalną definicję użytkownika.
Odpowiedziałem na własne pytanie tutaj, ale mam nadzieję, że moje dochodzenie jest przydatne dla innych mających ten sam problem.(Na marginesie, wysłałem również żądanie ściągnięcia przeciwko dokumentacji Sentry jako część tego ;-))
(Uwaga dla każdego, kto używa/rozszerza Sentry z niestandardowymi interfejsami - jeśli chcesz uniknąć interfejsu użyj do zgrupowania wyjątków, zwróć pustą listę.)
Ostrzeżenie! Zastąpienie get_hash może być przesadą. 'Sentry inteligentnie pogrupuje wiadomości, jeśli użyjesz odpowiedniego formatowania napisów. Więc może to być twój przypadek tylko po to, aby poprawnie formatować błędy https://docs.getsentry.com/hosted/clients/python/integrations/logging/ – andi