paint-brush
Monolith überwachen mit Datadog: So vermeiden Sie den Bystander-Effektvon@feddena
386 Lesungen
386 Lesungen

Monolith überwachen mit Datadog: So vermeiden Sie den Bystander-Effekt

von Fedor Denisov7m2024/07/08
Read on Terminal Reader

Zu lang; Lesen

In großen monolithischen Anwendungen werden Fehlerverfolgung und -überwachung oft ineffektiv, da es keine eindeutige Zuständigkeit gibt. Dieser Leitfaden befasst sich mit diesem Problem, indem er einen strukturierten Ansatz zur Zuweisung der Verantwortlichkeit durch Domänenanmerkungen vorschlägt, die in der Monolith-Domain-Splitter-Bibliothek eingeführt wurden.
featured image - Monolith überwachen mit Datadog: So vermeiden Sie den Bystander-Effekt
Fedor Denisov HackerNoon profile picture
0-item

In großen monolithischen Anwendungen sind Fehlerverfolgung und -überwachung aufgrund fehlender klarer Verantwortlichkeiten oft ineffektiv. Dieser Leitfaden behebt das Problem, indem er einen strukturierten Ansatz zur Zuweisung von Verantwortlichkeiten durch Domänenanmerkungen vorschlägt.


Das Einrichten einer effektiven Überwachung für große monolithische Systeme mit mehreren Teams kann eine Herausforderung sein. Ohne klare Zuständigkeit wird die Fehlerverfolgung generisch und oft ignoriert. Eine Lösung besteht darin, dass Bereitschaftstechniker bestimmen, welches Team auf Überwachungsalarme reagieren soll. Ein effizienterer Ansatz besteht jedoch darin, Domänen- und Teaminformationen in jedes Protokoll und jeden Datadog-Span aufzunehmen.


Domänenanmerkungen verstehen

Um den Überblick darüber zu behalten, welches Team für welche Teile unserer Anwendung verantwortlich ist, verwenden wir ein System namens Domain Annotations. Domain Annotations kennzeichnen jeden Teil des Codes Ihrer Anwendung und geben deutlich an, wer für was verantwortlich ist. Dies sorgt für klare Organisation und Verantwortlichkeit bei der Verwaltung von Verantwortlichkeiten.

Die Vorteile der Verwendung von Domänenanmerkungen

Domänenanmerkungen bieten eine klare und organisierte Methode, um Teamverantwortlichkeiten innerhalb einer monolithischen Anwendung zu verfolgen. Indem Sie Teile Ihres Codes mit Domänenanmerkungen kennzeichnen, können Sie:

  • Vereinfachen Sie die Protokoll- und Ablaufverfolgungsverwaltung : Filtern Sie Protokolle und Ablaufverfolgungen anhand bestimmter Kriterien, z. B. der Teamverantwortung, und ermöglichen Sie so eine schnelle Identifizierung und Lösung von Problemen.
  • Sorgen Sie für eine genaue Nachverfolgung : Passen Sie sich nahtlos an Änderungen in den Teamverantwortlichkeiten an, da Anmerkungen an die Domäne und nicht an Teamnamen gebunden sind.
  • Verbessern Sie die Verantwortlichkeit : Definieren Sie klar, welches Team für welchen Bereich verantwortlich ist, und verbessern Sie so die Organisation und die gezielte Überwachung.
  • Verbessern Sie die Überwachungseffizienz : Ermöglichen Sie bessere Überwachungspraktiken, indem Sie für präzise Rechenschaftspflicht sorgen und die Gesamteffizienz verbessern.

Verarbeitung von Domänenanmerkungen

Um eine effiziente Überwachung und Nachverfolgbarkeit zu gewährleisten, wird jede Webanforderung mit den entsprechenden Domäneninformationen versehen. Dies wird durch die Zusammenarbeit mehrerer Komponenten erreicht: DomainProvider , DomainSpanService , DomainMdcProvider und DomainHandlerInterceptor .

Hier ist eine allgemeine Übersicht über den im folgenden Diagramm dargestellten Prozess:

Diagramm zur Verarbeitung von Domänenanmerkungen

Erklärung der Hauptkomponenten

  • DomainProvider : Identifiziert die Domäne, die mit bestimmten Handlermethoden oder Beans verknüpft ist. Es hilft beim Auffinden von Domänenanmerkungen in AOP- (Aspect-Oriented Programming) und MVC- (Model-View-Controller) Aufrufen.
  • DomainSpanService : Fügt Domänen-Tags zu Spans hinzu, die Arbeitseinheiten in Tracing-Systemen sind. Dieser Dienst stellt sicher, dass jeder Span mit den entsprechenden Domäneninformationen gekennzeichnet ist.
  • DomainMdcProvider : Verwaltet Domänen-Tags innerhalb des MDC (Mapped Diagnostic Context), einer Funktion von Protokollierungsframeworks, die das Markieren von Protokolleinträgen mit Kontextinformationen ermöglicht.
  • DomainHandlerInterceptor : Fängt Webanforderungen ab und stellt sicher, dass jede Anforderung zur besseren Überwachung und Rückverfolgbarkeit mit den entsprechenden Domäneninformationen gekennzeichnet ist.

Die detaillierte Implementierung dieser Komponenten wird in einer gemeinsam genutzten Bibliothek gekapselt und bietet eine wiederverwendbare Lösung zum Markieren und Überwachen von Webanforderungen in großen monolithischen Anwendungen.

Herausfinden, wem welcher Code gehört

Die Definition des Eigentums auf Klassenebene ist mit Domänenanmerkungen unkompliziert. Durch die Anwendung von Anmerkungen der obersten Ebene auf Hauptklassen wird das Eigentum auf alle detaillierten Ressourcen innerhalb dieser Klassen übertragen. Jedes Team kann Klassen, die ihm gehören, mit den entsprechenden Domänenanmerkungen kennzeichnen und so für Klarheit und Verantwortlichkeit sorgen, ohne dass jede einzelne Methode markiert werden muss.


In Fällen, in denen mehrere Teams Code in einer Klasse besitzen und eine sofortige Umgestaltung nicht angebracht ist, können Sie einzelne Methoden mit unterschiedlichen Domänenanmerkungen markieren, die Vorrang vor Anmerkungen auf Klassenebene haben. Dadurch können bestimmte Methoden verschiedenen Teams zugewiesen werden, was Flexibilität bietet, ohne die Gesamtstruktur zu verkomplizieren.

Überwinden von Fällen, die durch Anmerkungen nicht unterstützt werden

Obwohl Domänenanmerkungen unglaublich nützlich sind, gibt es seltene Fälle, in denen sie nicht verwendet werden können. Beispielsweise traten bei der Joberstellung von Quartz Probleme auf, die aufgrund eines Konflikts zwischen der AOP-Logik von Quartz und der für Domänenanmerkungen verwendeten AOP-Logik nicht reibungslos mit Domänenanmerkungen funktionierten.

Für Jobs und Prozesse, die nicht direkt annotiert werden können, haben wir den DomainTagsService direkt in den Jobimplementierungen verwendet. Mit diesem Ansatz konnten wir Domänen-Tags manuell in die Ausführungslogik des Jobs einfügen.

Hier ist ein Beispiel, wie wir DomainTagsService in einen Quartz-Job integriert haben:

 final override fun execute(context: JobExecutionContext) { domainTagsService.invoke(domain) { withLoggedExecutionDetails(context, ::doExecute) } }

Verbessern Sie die Überwachung und Sichtbarkeit mit künstlichen Diensten

Während separate Dienste für jedes Team erhebliche Vorteile bei der Überwachung und dem Besitz bieten, ist die Aufteilung des Monolithen mit hohen Kosten und Aufwand verbunden und kann zusätzliche Entwicklungskosten verursachen. Angesichts der Möglichkeit, die Build-Zeiten mit Gradle zu verbessern, wenn der Monolith in Module aufgeteilt wird, ist die Pflege eines Monorepo in vielen Fällen möglicherweise die effizienteste Lösung.

Einführung künstlicher Dienste

Um die Überwachung der Aktivitäten jedes Teams in Datadog zu vereinfachen, können Sie künstliche Dienstnamen für Bereiche verschiedener Teams zuweisen. Dieser Ansatz stellt sicher, dass jedes Team seinen eigenen Bereich in den Überwachungstools von Datadog hat. Die Verwendung künstlicher Dienstnamen kann zwar verwirrend sein, wenn Sie viele Dienste verwalten müssen, aber bei einer begrenzten Anzahl von Backend-Diensten ist sie überschaubar. Das Hinzufügen von Präfixen zu diesen künstlichen Dienstnamen trägt dazu bei, die Organisation und Übersichtlichkeit Ihres Datadog-Setups aufrechtzuerhalten und erleichtert die Unterscheidung zwischen verschiedenen Teams und ihren Verantwortlichkeiten.


Diagramm statt Screenshot verwenden?? Worker/Webapp zu haben macht hier keinen Sinn

Künstliche Dienste in Datadog APM, die tatsächlich eine einzige App sind

Warum keine künstlichen Dienste für Protokolle verwenden?

Die Verwendung künstlicher Dienstnamen für Protokolle kann zu Verwirrung führen, da derselbe Protokolleintrag unter verschiedenen Diensten erscheinen kann.


Betrachten wir beispielsweise zwei Endpunkte, die denselben Authentifizierungsdienst verwenden. Wenn diese Endpunkte mit unterschiedlichen Domänen annotiert sind, erzeugt die Authentifizierungslogik Protokolle unter unterschiedlichen künstlichen Diensten. Dies kann bei der Untersuchung von Protokollen zu Verwirrung führen, da sie unter mehreren Dienstnamen erscheinen. Um dieses Problem zu vermeiden, ist es besser, künstliche Dienstnamen nur auf Bereiche anzuwenden, die in Spuren zusammengefasst sind, damit es weniger Verwirrung gibt.


Macht das irgendeinen Sinn? Ich glaube nicht


Hier ist eine visuelle Darstellung dieses Problems:

Gründe für den Verzicht auf die Verwendung künstlicher Dienste für Protokolle

Künstliche Dienste im Monitoring und auf Dashboards nutzen

Durch die Verwendung künstlicher Dienste können Sie nicht nur mit APM-Traces arbeiten, sondern auch nach Diensten in Datadog-Metriken filtern, die über einen längeren Zeitraum gespeichert werden, sodass Änderungen über einen längeren Zeitraum verfolgt werden können.

Beispiel für Monitor

Unten sehen Sie einen Screenshot eines Monitors in Datadog, der in der Abfrage den künstlichen Dienstnamen konsus-assets verwendet:

Monitor, der den künstlichen Dienst „Konsus-Assets“ in der Abfrage verwendet

Beispiel für ein Dashboard

Unten sehen Sie einen Screenshot eines Dashboards in Datadog, das im Filter den künstlichen Servicenamen konsus-assets verwendet:

Dashboard, das im Filter den gefälschten Dienst „Konsus-Assets“ verwendet

Durch die Verwendung von Fake-Services in Ihrer Überwachungsstrategie können Sie die Sichtbarkeit und Verantwortlichkeit der Aktivitäten jedes Teams innerhalb einer monolithischen Anwendung verbessern. Dieser Ansatz vereinfacht die Erstellung und Pflege teamspezifischer Monitore und Dashboards und führt zu einer effektiveren und organisierteren Überwachung in Datadog.


Einpacken

Domänenanmerkungen bieten einen unkomplizierten Ansatz zur Vereinfachung der Überwachung monolithischer Anwendungen in Datadog. Durch die Implementierung dieser Strategie können Sie die Verwaltbarkeit von Protokollen, Spannen und Metriken verbessern und Ihr Überwachungs-Setup in ein auf bestimmte Teams zugeschnittenes Tool verwandeln. Dies verbessert die Verantwortlichkeit und Organisation und ermöglicht eine effektivere und effizientere Fehlerbehebung und Leistungsanalyse in Ihrer gesamten Anwendung.

Die zentralen Thesen

  1. Verbesserte Eigentümerschaft und Verantwortlichkeit : Indem Sie Teile Ihres Codes mit Domänenanmerkungen versehen, können Sie klar definieren, welches Team für welche Domäne verantwortlich ist. Dies ermöglicht eine bessere Organisation und gezielte Überwachung.
  2. Verbessertes Protokoll- und Ablaufverfolgungsmanagement : Domänenanmerkungen ermöglichen Ihnen das Filtern von Protokollen und Ablaufverfolgungen nach bestimmten Kriterien, wie z. B. der Teamverantwortung. Dies ermöglicht eine schnelle Identifizierung und Lösung von Problemen.
  3. Flexibilität mit künstlichen Diensten : Die Verwendung künstlicher Dienstnamen für Bereiche (nicht für Protokolle) stellt sicher, dass Protokolle eindeutig bleiben und auf ihren wahren Ursprung zurückgeführt werden können, wodurch Verwirrung vermieden wird.
  4. Überwinden von Integrationsherausforderungen : In Fällen, in denen Anmerkungen nicht direkt angewendet werden können, z. B. bei bestimmten Jobausführungs-Frameworks wie Quartz, stellt die Verwendung von Diensten wie DomainTagsService direkt in den Jobimplementierungen sicher, dass die domänenspezifische Überwachung weiterhin aufrechterhalten werden kann.

Schritt-für-Schritt-Anleitung zur Verwendung von Domänenanmerkungen:

  1. Definieren Sie Domänen und Teams

    Das wird sich mit der Lib ändern!!!

    Erstellen Sie Enumerationen, die verschiedene Domänen und Teams in Ihrer Anwendung darstellen:

    • @Domain ist eine Annotation, die auf Klassen oder Funktionen angewendet werden kann und sie mit einem bestimmten Domänenwert kennzeichnet.
    • DomainValue ist eine Aufzählung, die verschiedene Domänen darstellt, die jeweils einem Team zugeordnet sind.
    • Team ist eine Aufzählung, die die verschiedenen Teams darstellt, die an der Anwendung arbeiten.
     @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class Domain(val value: DomainValue) enum class DomainValue(val team: Team) { USER_MANAGEMENT(Team.TEAM_A), PAYMENT_PROCESSING(Team.TEAM_B), NOTIFICATIONS(Team.TEAM_C) } enum class Team { TEAM_A, TEAM_B, TEAM_C }
  2. Kommentieren Sie Klassen (und Methoden, falls erforderlich)

     @Domain(DomainValue.USER_MANAGEMENT) class UserService { @Domain(DomainValue.PAYMENT_PROCESSING) fun processPayment() { ... } }
  3. Behandeln nicht unterstützter Fälle

    In Fällen, die nicht direkt kommentiert werden können, verwenden Sie DomainTagsService direkt, um die Logik zu umschließen

     fun executeNotSupportedByAnnotationsLogic() { domainTagsService.invoke(domain) { executeLogic() } }
  4. Überwachen mit Datadog

    Verwenden Sie künstliche Servicefilter für Monitore, Dashboards und APM-Traces-Filterung


Wenn Sie diese Schritte befolgen, können Sie Domänenanmerkungen effektiv in Ihrer monolithischen Anwendung implementieren und so eine verbesserte Überwachung, Verantwortlichkeit und Gesamteffizienz sicherstellen.


Danke, dass Sie den Beitrag gelesen haben!