Hinzufügen von benutzerdefinierten Bereichen zu einer Ablaufverfolgung¶
Sie können Ihre eigenen benutzerdefinierten Bereiche (Spans) zu Ablaufverfolgungen hinzufügen, um eine feinere Ablaufverfolgung innerhalb des Handlers für eine Prozedur oder Funktion zu ermöglichen.
Wenn Sie die Ablaufverfolgung aktiviert haben, startet Snowflake standardmäßig einen Bereich (Span) für Sie (wie in Darstellung von Ablaufverfolgungsereignissen in Snowflake beschrieben) und fügt diesem Bereich alle Ereignisse der Ablaufverfolgung hinzu. (Dieser ist intern als „auto_instrumented“ Bereich bekannt.) Mit OpenTelemetry APIs können Sie Ihre eigenen Bereiche (Spans) erstellen. Zu, neuen Bereich (Span) können Sie Ereignisse und Attribute hinzufügen, indem Sie entweder die OpenTelemetry API oder die Snowflake-API für Ihre Sprache verwenden.
Vielleicht möchten Sie Ihre eigene Spanne erstellen, wenn Sie z. B. die Ablaufverfolgungsdaten für rechenintensive Aktionen innerhalb einer Prozedur isolieren möchten, z. B. wenn Sie den Code zum Trainieren eines ML-Modells verwenden.
Die von Ihnen erstellten benutzerdefinierten Bereiche (Spans) entsprechen den standardmäßigen Verhaltensweise von Bereiche (Spans), die durch OpenTelemetry erstellt wurden.
Unterstützte Sprachen¶
Sie können benutzerdefinierte Bereiche (Spans) aus Code hinzufügen, der in den folgenden Sprachen geschrieben wurde, auch wenn der Handler-Code mit Snowpark APIs geschrieben wurde.
Sprache/Typ |
Java |
Python |
JavaScript |
Scala |
Snowflake Scripting |
---|---|---|---|---|---|
Handler in gespeicherter Prozedur |
✔ |
✔ |
✔ |
✔ [1] |
|
Streamlit-App |
✔ |
||||
UDF-Handler (Skalarfunktion) |
✔ |
✔ |
✔ |
✔ [1] |
|
UDTF-Handler (Tabellenfunktion) |
✔ |
✔ |
✔ |
Erstellen eines benutzerdefinierten Bereichs (Span)¶
Um einen benutzerdefinierten Bereich (Span) mit Handler-Code hinzuzufügen, verwenden Sie die OpenTelemetry API für Ihre Handler-Sprache innerhalb der bestehenden Snowflake-Telemetrieumgebung, um einen neuen Bereich (Span) zu erstellen, Ereignisse und Attribute nach Bedarf hinzuzufügen und den Bereich (Span) dann zu schließen.
Verwenden Sie die OpenTelemetry API, um eine Ablaufverfolgung zu erstellen, die den Kontext für den Bereich (Span) verwaltet.
Ausgehend von dieser Ablaufverfolgung, die aus der bestehenden Snowflake-Telemetrieumgebung erstellt wurde, können Sie benutzerdefinierte Bereiche (Spans) erstellen, die die bestehende Infrastruktur nutzen, in der die Ablaufverfolgungsdaten von der Ereignistabelle erfasst werden.
Erstellen Sie in der neuen Ablaufverfolgung den benutzerdefinierten Bereich (Span) mit einer API, die sicherstellt, dass der neue Bereich der aktuelle Bereich ist.
Indem Sie den neuen Bereich in dem bestehenden, von Snowflake verwalteten Kontext erstellen, stellen Sie sicher, dass Informationen aus dem Kontext — einschließlich der Werte trace_id und parent_span_id — vom Snowflake-Standardbereich an andere Bereiche (Spans) weitergegeben werden.
Wenn Ihr Code den benutzerdefinierte Bereich (Span) beendet, muss er den Bereich schließen, bevor der Handler die Ausführung abschließt, damit die Ablaufverfolgungsdaten in der Ereignistabelle erfasst werden kann.
Diese Verhaltensweise der benutzerdefinierten Bereiche (Spans) entspricht dem Standardverhalten von OpenTelemetry.
Informationen zum Hinzufügen eines benutzerdefinierten Bereichs (Spans) mit einer unterstützten Sprache finden Sie in den folgenden Themen:
Python-Beispiel¶
Der Code im folgenden Beispiel verwendet die OpenTelemetry Python API, um den my.span
Bereich (Span) als aktuellen Bereich mit start_as_current_span
zu erstellen. Anschließend wird dem neuen Bereich (Span) unter Vetrwendung der OpenTelemetry Python API ein Ereignis mit Attributen hinzugefügt.
Ereignisdaten werden nur dann von der Ereignistabelle erfasst, wenn der Bereich (Span) endet, bevor Ihr Handler die Ausführung abgeschlossen hat. In diesem Beispiel wird der Bereich (Span) automatisch geschlossen, wenn die with
-Anweisung beendet ist.
CREATE OR REPLACE FUNCTION customSpansPythonExample() RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES = ('snowflake-telemetry-python', 'opentelemetry-api')
HANDLER = 'custom_spans_function'
AS $$
from snowflake import telemetry
from opentelemetry import trace
def custom_spans_function():
tracer = trace.get_tracer("my.tracer")
with tracer.start_as_current_span("my.span") as span:
span.add_event("Event2 in custom span", {"key1": "value1", "key2": "value2"})
return "success"
$$;