Beobachtbarkeit in Snowflake-Apps

Durch die in Snowflake integrierte Observability (Beobachtbarkeit) können Sie sicherstellen, dass Ihre Anwendungen so effizient wie möglich ausgeführt werden. Mit den in diesem Thema beschriebenen Praktiken und Features können Sie die Observability-Features optimal nutzen, die Ihnen zeigen, wo Sie Ihren Code verbessern können.

Was ist Beobachtbarkeit?

In einem beobachtbaren System können Sie anhand von externen, vom System generierten Nachweisen verstehen, was intern geschieht. Zu diesen Nachweisen gehören Telemetriedaten, Alerts und Benachrichtigungen.

Durch den Nachweis der internen Funktionsweise erleichtert Beobachtbarkeit die Fehlerbehebung bei schwer verständlichen Verhaltensweisen in einem Produktionssystem. Dies gilt insbesondere in einem verteilten System, in dem die aus der Beobachtung gewonnenen Erkenntnisse einen Überblick über das Verhalten mehrerer Komponenten geben. Anstatt eine Produktionsumgebung zu unterbrechen, um Probleme zu diagnostizieren, können Sie die gesammelten Daten analysieren.

Mit einem beobachtbaren System können Fragen wie die folgenden beantwortet werden

  • Wie gut ist die Leistung des Systems?

  • Wo gibt es Latenz und was ist die Ursache dafür?

  • Warum funktioniert eine bestimmte Komponente oder ein Prozess nicht so, wie er sollte?

  • Welche Verbesserungen können vorgenommen werden?

Beobachtbarkeit in Snowflake

Snowflake unterstützt ein Modell, das integrierte beobachtbare Daten liefert und Ihnen gleichzeitig die Möglichkeit bietet, bei Bedarf weitere Instrumente hinzuzufügen. Snowflake bietet zwar Unterstützung für Telemetriedaten wie Protokolle, Metriken und Ablaufverfolgungen (die typisch für Beobachtbarkeit sind), enthält aber auch andere Features, mit denen Sie die Systemnutzung und -leistung verfolgen können.

Im Folgenden finden Sie eine Liste von Features, mit denen Sie die Systemleistung und -nutzung empfangen und analysieren können.

Gesammelte Telemetriedaten

Wenn Ihre Anwendung Protokolle, Metriken und Ablaufverfolgungen erzeugt, sammelt Snowflake diese Telemetriedaten in einer Ereignistabelle. Über die Snowsight können Sie die Daten untersuchen und nach Mustern suchen.

Sie können benutzerdefinierte Telemetriedaten in die Ereignistabelle eingeben, um kontextbezogene, domänenspezifische Informationen bereitzustellen und die Fehlersuche zu beschleunigen.

Verlaufstabellen

Verwenden Sie die folgenden Ansichten und die dazugehörigen Tabellen, um die gesamte Nutzung Ihres Kontos zu überwachen.

Alerts und Benachrichtigungen

Alerts ermöglichen anpassbare Auslösebedingungen, Aktionen und Zeitpläne in Kombination mit einer Benachrichtigungsintegration für proaktive Überwachung.

Erweiterbarkeit mit Drittanbietertools

Die Snowflake Ereignistabelle übernimmt die Standards von OpenTelemetry, sodass Ihre Snowflake-Telemetrie problemlos von anderen Tools im Ökosystem genutzt werden kann.

Für die Analyse gesammelte Telemetriedaten

Während der Code in Ihrer Anwendung ausgeführt wird, können Sie Snowflake Daten aus dem Code sammeln lassen, die Ihnen Informationen über den internen Zustand der Anwendung geben. Mithilfe dieser Telemetriedaten, die in einer Snowflake-Ereignistabelle gesammelt werden (Ihr Konto verfügt standardmäßig über eine solche Tabelle), können Sie nach Engpässen und anderen Optimierungsmöglichkeiten suchen.

Telemetriedaten müssen ausgegeben werden, während Ihr Code ausgeführt wird. Snowflake gibt einige dieser Daten im Namen Ihres Codes aus, ohne dass Sie Ihren Code instrumentieren müssen. Sie können auch die in Snowflake enthaltenen APIs verwenden, um Telemetriedaten aus bestimmten Teilen Ihres Codes auszugeben.

Wie unten beschrieben, können Sie die gesammelten Daten analysieren, indem Sie die Ereignistabelle abfragen oder die Visualisierungen verwenden, die die Daten in der Snowsight erfassen.

Arten von Telemetriedaten

Um sicherzustellen, dass die von Ihnen erfassten Telemetriedaten umfassend nutzbar sind, basiert die Snowflake-Telemetrie auf dem Standard-Framework OpenTelemetry (manchmal auch OTel genannt), einem Inkubationsprojekt der Cloud Native Compute Foundation. Durch dieses Framework (und APIs und die dafür entwickelten Tools) können Sie die gesammelten Daten mit Tools außerhalb von Snowflake verwenden. Über OpenTelemetry können Sie den Anwendungscode instrumentieren, um die Beobachtbarkeit dort hinzuzufügen, wo Sie sie wünschen.

Snowflake-Ereignistabellen sammeln Protokoll-, (Bereichs-) Span- und Metrikdaten im OpenTelemetry-Datenmodell. Im Folgenden werden die einzelnen Arten von Telemetriedaten beschrieben, die in einer Ereignistabelle gesammelt werden.

Protokolle

Protokolle zeichnen einzelne vom Code ausgeführte Operationen auf. Jede Protokollmeldung wird zu einem bestimmten Zeitpunkt während der Ausführung des Codes generiert.

Instrumentieren von Code Sie können Ihren Code mit Hilfe von Standardbibliotheken für die von Ihnen verwendete Sprache protokollieren, wie unter Protokollierung von Handler-Code aufgeführt.

Anzeige von Daten Sie können Protokollmeldungen zur Analyse anzeigen, indem Sie entweder die Ereignistabelle abfragen oder sich die Visualisierungen über die Snowsight ansehen.

Das folgende Bild der Snowsight zeigt eine Liste der gesammelten Protokollmeldungen für einen Zeitraum von zwei Stunden in einer einzelnen Datenbank.

Screenshot der Registerkarte „Protokolle“ der Seite „Ablaufverfolgung & Protokolle“ mit einer Liste von Protokollmeldungen, die während der Ausführung einer benutzerdefinierten Funktion gesammelt wurden.

Metriken

Metriken sind Messwerte, die über einen bestimmten Zeitraum berechnet werden. Diese Werte umfassen CPU- und Speichermessungen.

Instrumentieren von Code Snowflake gibt automatisch Metrikdaten aus, wenn Ihr Code ausgeführt wird, sodass Sie Ihren Code nicht instrumentieren müssen.

Anzeige von Daten Sie können Metrikdaten zur Analyse anzeigen, indem Sie entweder die Ereignistabelle abfragen oder sich die über die Snowsight bereitgestellten Visualisierungen ansehen.

Das folgende Bild der Snowsight zeigt die Änderungen in den gesammelten Metrikdaten für die Ausführung einer benutzerdefinierten Funktion.

Screenshot eines Diagramms mit Speicher- und CPU-Messungen, die während der Ausführung einer benutzerdefinierten Funktion gesammelt wurden.

Ablaufverfolgungen

Ablaufverfolgungen zeigen verteilte Ereignisse, während Daten durch ein System fließen. In einer Ablaufverfolgung können Sie sehen, wie die Zeit verbraucht wird, während die Verarbeitung von Komponente zu Komponente fließt.

Sie können Ablaufverfolgungsereignisse – sowohl innerhalb des von Snowflake erstellten Standardbereichs (Standard-Span) als auch aus einem von Ihnen erstellten benutzerdefinierten Bereiche (Span) ausgeben – mithilfe von für Ihre verwendete Sprache standardmäßigen Bibliotheken, wie unter Protokollierung von Handler-Code aufgeführt.

Instrumentieren von Code Sie können Ablaufverfolgungsereignisse von Ihrem Code ausgeben – mithilfe von für Ihre verwendete Sprache standardmäßigen Bibliotheken, wie unter Ereignisablaufverfolgung aus Handler-Code aufgeführt.

Anzeige von Daten Sie können Ablaufverfolgungsereignisse zur Analyse anzeigen, indem Sie entweder die Ereignistabelle abfragen oder sich die über die Snowsight bereitgestellten Visualisierungen ansehen.

Das folgende Bild der Snowsight zeigt die Bereiche (Spans), die sich ergeben, wenn eine UDF ausgeführt wird.

Screenshot der Registerkarte „Abfrage-Telemetrie“, die Bereiche (Spans) der Ausführung einer benutzerdefinierten Funktion anzeigt.

Best Practices der Telemetrie

Verwenden Sie die folgenden Best Practices, um die Beobachtbarkeit in Snowflake optimal zu nutzen.

Richten Sie Ihre Umgebung so ein, dass Telemetriedaten erfasst werden, bevor Sie sie benötigen

Sie können keine Daten analysieren, die Sie nicht erfasst haben. Daher ist es am besten, mit der Erfassung von Telemetriedaten zu beginnen, damit Sie sie haben, wenn Sie sie brauchen. Je größer Ihre Bereitstellung wird, desto wichtiger wird es, die Leistung Ihres Codes zu verstehen.

Befolgen Sie die folgenden Best Practices:

  • Aktivieren Sie die Telemetriedatenerfassung für Ihre Snowflake-Umgebung.

    Um die benötigten Daten zu erfassen, stellen Sie sicher, dass Sie eine aktive Ereignistabelle haben.

  • Um sicherzustellen, dass Sie die gewünschten Telemetriedaten erfassen, stellen Sie die Telemetriestufen auf nützliche Schwellenwerte ein.

    Zunächst sollten Sie diese Werte einstellen, um sicherzustellen, dass Sie Daten sammeln. Setzen Sie z. B. den Protokolliergrad für alle produktions- oder geschäftskritischen Jobs mindestens auf WARN. Im Laufe der Zeit können Sie diese Werte an die sich ändernden Bedürfnisse anpassen.

    Organisieren Sie Ihre gespeicherten Prozeduren, UDFs und andere Objekte in einer Datenbank oder einem Schema, damit Sie einfach Warnprotokolle für diese Datenbank oder dieses Schema aktivieren können. Dies erspart die Mühe, Einstellungen für separate Objekte zu verwalten.

  • Um Daten für die Problembehandlung zu generieren, fügen Sie Protokollanweisungen oder Ablaufverfolgungsereignisse zu Ihren Produktionsjobs hinzu.

    Wenn Sie Standard-Logging-Bibliotheken wie z. B. SLF4J von Java oder die Logging-Bibliotheken von Python verwenden, routet Snowflake Protokolle aus diesen Paketen automatisch in Ihre Ereignistabelle.

    Für die Ablaufverfolgung können Sie die Telemetriebibliotheken verwenden, die in Snowflake enthalten sind.

  • Um Teile der Verarbeitung des Handlers, die Sie messen möchten, in die Ablaufverfolgung einzubeziehen, fügen Sie benutzerdefinierte Bereiche (Spans) zu Ihrem gespeicherte Prozedur-Handler-Code hinzu.

    Neben den integrierten Bereiche (Spans) von Snowflake-Objekten stellt Snowflake auch benutzerdefinierte Bereiche (Spans) dar, die Sie im Ablaufdiagramm erstellen. Mit benutzerdefinierten Bereichen (Spans) können Sie Daten über beliebige Teile der Verarbeitung Ihres Codes erfassen, um zu sehen, wie lange diese Teile für die Ausführung benötigen. Sie können auch beliebige Metadaten an benutzerdefinierte Zeiträume anhängen, um den Daten Beschreibungen zur Problembehandlung und Optimierung hinzuzufügen.

Prozeduren mit Abfragetelemetrie optimieren

Im Abfragetelemetrie-Ablaufverfolgungsdiagramm finden Sie Daten über alle von einer Abfrage ausgegebenen Bereiche (Spans).

  • Die horizontale Achse zeigt die Dauer an. Ein Bereich (Span), der horizontal länger aussieht, hat mehr Zeit benötigt, um abgeschlossen zu werden, als ein kürzerer Bereich (Span).

  • Die vertikale Achse zeigt die Aufrufhierarchie an. In dieser Hierarchie ist jeder Bereich (Span), der sich direkt unter einem anderen Bereich (Span) befindet, ein „untergeordneter“ Bereich (Span) des darüber liegenden „übergeordneten“ Bereichs (Spans).

Screenshot der Registerkarte „Abfragetelemetrie“ der Seite „Abfrageverlauf“ mit einem Bereich (Span) für einen Aufruf einer Prozedur.

Sie können dieses Diagramm verwenden, um Optimierungsmöglichkeiten in gespeicherten Prozeduren zu finden. Ausgehend von dem, was Sie in dem Diagramm sehen, können Sie Schritte zur Optimierung Ihres Codes unternehmen.

Sie können beispielsweise sequenzielle Operationen so organisieren, dass sie mithilfe von Bibliotheken wie Joblib parallel ausgeführt werden. Joblib ist eine Sammlung von Tools zum Hinzufügen von Pipelining zu Python-Code. Damit können Sie leichter parallelen Code schreiben.

Redundante DataFrame-Operationen zwischenspeichern

Wenn Sie eine Kette von DataFrame-Operationen haben, die mehrfach verwendet wird, sehen Sie diese im Ablaufdiagramm als einen Span für jede DataFrame-Aktion. Je nach Komplexität der Abfrage kann dieser Span recht lang sein.

Im folgenden Code wird beispielsweise dieselbe DataFrame-Kette in mehreren Kontexten aufgerufen:

count = session.table(...).select().filter().join().count()

if count > 0:
  session.table(...).select().filter().join().write.save_as_table(...) # same query as the count, this will execute again
else:
  session.table(...).select().filter('other criteria').join() # nearly same query as the count
Copy

Die Verwendung von Caching verbessert die Leistung, indem der Zwischen-DataFrame als temporäre Tabelle zwischengespeichert werden, wodurch redundante Abfragen reduziert werden:

cached_df = session.table(...).select().filter().join().cache_result()
count = df.count()

if count > 0:
  cached_df.write.save_as_table() # reuses the cached DF
else:
  cached_df
Copy

Die Menge der empfangenen Telemetriedaten für UDFs verwalten

Wenn Sie Code zum Erfassen von Telemetriedaten mit UDFs hinzufügen, denken Sie daran, dass das UDF-Ausführungsmodell viel mehr Zeilen in der Ereignistabelle bedeuten kann als bei einer Prozedur.

Wenn eine UDF für jede Eingabezeile aufgerufen wird, gibt Ihr Handler-Code für jede Zeile des Eingabe-Datensets Protokollierungsanweisungen oder Bereichs- (Span)-Ereignisse aus. Ein Datenset mit 10 Millionen Zeilen, der an eine UDF übergeben wird, würde zum Beispiel 10 Millionen Protokolleinträge erzeugen.

Ziehen Sie die Verwendung der folgenden Muster in Betracht, wenn Sie Protokolle und Span-Ereignisse zu UDFs hinzufügen:

  • Verwenden Sie zunächst Protokolliergrade, um die Anzahl der aufgezeichneten Einträge zu reduzieren.

    Verwenden Sie die Protokollieranweisungen DEBUG- oder INFO-Grad und setzen Sie den Protokolliergrad in der Produktion auf WARN. Wenn ein Problem gefunden wird, können Sie den Protokolliergrad für die Dauer der Debugging-Sitzung auf DEBUG oder INFO senken.

  • Verwenden Sie try/catch-Blöcke, um den Code zu isolieren, aus dem Sie Protokolldaten ausgeben möchten.

    Die Verwendung von try/catch kann nützlich sein, um unerwartete UDF-Eingaben abzufangen, sie als WARN-Grad zu protokollieren und einen Standardwert zurückzugeben.

  • Verwenden Sie Bedingungsanweisungen, um nur für Szenarios zu protokollieren, die für Sie von Bedeutung sind.

    Mit if/else-Anweisungen oder anderen Einschränkungen können Sie den Umfang der Protokollierungsausgabe steuern.

Benutzerdefinierte Funktionen mit Abfragetelemetrie optimieren

Wenn eine UDF aufgerufen wird, führt Snowflake sie parallel aus, indem für jede Eingabezeile eine Instanz des Handler-Codes erstellt wird. Jede dieser Instanzen wird in einem Ablaufverfolgungsdiagramm als eigener Span dargestellt.

Sie können diese Spans nutzen, um langsame Abfragen zu beheben und Möglichkeiten zur Leistungsoptimierung zu finden. Sie können zum Beispiel Szenarios wie das folgende sehen:

  • Eine oder mehrere Instanzen Ihres UDF-Codes könnten eine Zeile mit Daten erhalten, die deutlich größer ist oder sich anderweitig vom Rest Ihrer Daten unterscheiden. Wenn dies geschieht, kann es sein, dass diese Instanz viel länger braucht, um abzuschließen, und daher ist ihr Span viel länger.

  • Abhängig von der Partitionierung der Eingaben in Ihrer Abfrage und den vorangestellten Klauseln kann es sein, dass eine Minderheit der Instanzen eine übergroße Menge an Eingabedaten erhält.

Das folgende Bild zeigt einen Span für jede Zeile, die an UDF übergeben wird. Die längere Dauer einer Spans deutet darauf hin, dass die Zeile möglicherweise größere Daten enthält als die anderen.

Screenshot der Registerkarte „Abfragetelemetrie“ des Abfrageverlaufs, der einen Span für jede an eine UDF übergebene Zeile anzeigt.

Warnhinweise und Benachrichtigungen für zeitkritische Reaktionen

Sie können Snowflake-Alerts und -Benachrichtigungen verwenden, um Ihr System anzeigen zu lassen, was im Inneren vor sich geht, und dann Maßnahmen zu ergreifen oder Informationen über den Systemzustand zu senden. Im Gegensatz zu Telemetriedaten, die Sie erfassen und später analysieren, sind Alert und Benachrichtigungen nützlich, wenn Sie eine sofortige Reaktion auf das Geschehen im System wünschen.

  • Mit einem Alert können Sie eine Bedingung, eine Aktion und einen Zeitplan angeben und dann festlegen, dass die Aktion ausgeführt werden soll, wenn die Bedingung und die Zeitplandetails erfüllt sind.

    Sie könnten zum Beispiel einen Alert verwenden, um komplexe Bedingungen zu überwachen, die Sie in SQL angeben. Die häufigste Aktion, nachdem eine Bedingung eines Alerts erfüllt ist, ist das Senden einer Benachrichtigung. Snowflake unterstützt das Senden von Benachrichtigungen an E-Mail-Adressen, Warteschlangen von Cloudanbietern, Slack, PagerDuty und Microsoft Teams.

  • Mit einer Benachrichtigung können Sie gespeicherte Prozeduren verwenden, um Meldungen an Ziele wie E-Mail-Adressen, Webhooks (für Client-Tool-Integrationen wie z. B. ein Chat-Tool) oder an eine von einem Clouddienst gehostete Warteschlange zu senden.

Best Practices für Alerts und Benachrichtigungen

Verwenden Sie die folgenden Praktiken, um die Beobachtbarkeit zu verbessern, indem Sie die Menge der Informationen, die Sie vom System erhalten, verfeinern und erhöhen.

  • Vermeiden Sie die doppelte Auswertung von Ereignissen.

    Sie können eine doppelte Auswertung von Ereignissen vermeiden, indem Sie die Latenzzeit zwischen dem Zeitplan für den Alert und der Ausführung berücksichtigen. Geben Sie dazu die Zeitstempel für Alert mit SCHEDULED_TIME und LAST_SUCCESSFUL_SCHEDULED_TIME anstelle von CURRENT_TIMESTAMP an.

    Weitere Informationen dazu finden Sie unter Angeben von Zeitstempeln auf Grundlage von Alert-Zeitplänen.

  • Eine Alert-Aktion oder Benachrichtigung mit Abfrageergebnissen anreichern

    Sie können die Ergebnisse der SQL-Anweisung überprüfen, die durch eine Alert-Bedingung angegeben wurde. Um die Ergebnisse der Abfrage zu erhalten, gehen Sie wie folgt vor:

    1. Rufen Sie die Abfrage-ID für die SQL-Anweisung der Alert-Bedingung ab, indem Sie GET_CONDITION_QUERY_UUID aufrufen.

    2. Übergeben Sie die Abfrage-ID an RESULT_SCAN, um die Abfrageergebnisse zu erhalten.

  • Protokollieren Sie ein Ergebnis oder führen Sie zusätzlich zum Senden einer Benachrichtigung eine automatische Aktion durch.

    Sie können festlegen, dass eine Alert-Aktion eine Aufgabe ausführt oder eine neue Zeile in einer Tabelle protokolliert, wenn eine Alert-Bedingung erfüllt ist. Das können Sie zum Beispiel tun, wenn Sie in Snowflake jedes Mal eine Aktion ausführen, wenn die Alert-Bedingung erfüllt ist.

    Wenn Sie beabsichtigen, eine komplexe Aktion durchzuführen, nachdem eine Bedingung erfüllt ist, stellen Sie sicher, dass Ihr Warehouse eine angemessene Größe hat.

Tools für Analyse und Visualisierung

Sie können die in Ihrer Ereignistabelle gesammelten Telemetriedaten mit anderen Tools verwenden, die das OpenTelemetry-Datenmodell unterstützen.

Durch die Snowflake-Unterstützung von OpenTelemetry können Sie APIs, SDKs und andere Tools verwenden, um Telemetriedaten zu instrumentieren, zu generieren, zu erfassen und zu exportieren. Mit diesen Tools können Sie die Leistung und das Verhalten von Software gründlicher analysieren. Da eine Snowflake-Ereignistabelle diesen weit verbreiteten Standard verwendet, können Sie möglicherweise auch die Beobachtbarkeitstools Ihres Unternehmens ohne großen Aufwand in Ereignistabellen integrieren.

Ziehen Sie die Integration Ihrer externen Tools auf eine der folgenden Arten in Betracht:

  • Wenn Ihre Beobachtbarkeitstools aus externen Quellen lesen können, verweisen Sie sie auf die Ereignistabelle.

  • Wenn Ihre Tools ein Push-Modell verwenden – bei dem Telemetriedaten an das Tool gesendet werden müssen –, sollten Sie eine gespeicherte Prozedur mit externem Zugriff verwenden, um regelmäßig Telemetriedaten aus der Ereignistabelle zu lesen und an Ihr Tool zu senden.

Im Folgenden finden Sie eine Liste von Tools, die Sie in Snowflake-Ereignistabellen integrieren können: