Überwachung von Ereignistabellen und Warnmeldungen für dynamische Tabellen

Unter diesem Thema wird beschrieben, wie Sie eine Ereignistabelle abfragen, die Informationen über Ihren Aktualisierungsstatus liefert, und wie Sie Benachrichtigungen über neue Daten in einer Ereignistabelle einrichten.

Ereignistabelle zur Überwachung von Aktualisierungen abfragen

Wenn eine dynamische Tabelle aktualisiert wird, können Sie Snowflake so konfigurieren, dass ein Ereignis aufgezeichnet wird, das Informationen über den Status der Aktualisierungsoperation liefert. Das Ereignis wird in der aktiven Ereignistabelle aufgezeichnet, die mit der dynamischen Tabelle verbunden ist.

Nehmen Sie zum Beispiel an, dass Sie eine Ereignistabelle mit einer Datenbank verknüpft haben. Wenn eine dynamische Tabelle in dieser Datenbank aktualisiert wird, zeichnet Snowflake ein Ereignis in dieser Ereignistabelle auf.

Sie können die in dieser aktiven Ereignistabelle protokollierten Ereignisse abfragen, um die Aktualisierung Ihrer dynamischen Tabellen zu überwachen.

Um beispielsweise den Zeitstempel, den Namen der dynamischen Tabelle, die Abfrage-ID und die Fehlermeldung bei Fehlern mit dynamischen Tabellen in der Datenbank my_db zu erhalten, gehen Sie wie folgt vor:

SELECT
    timestamp,
    resource_attributes:"snow.executable.name"::VARCHAR AS dt_name,
    resource_attributes:"snow.query.id"::VARCHAR AS query_id,
    value:message::VARCHAR AS error
  FROM my_event_table
  WHERE
    resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE' AND
    resource_attributes:"snow.database.name" = 'MY_DB' AND
    value:state = 'FAILED'
  ORDER BY timestamp DESC;
+-------------------------+------------------+--------------------------------------+---------------------------------------------------------------------------------+
| TIMESTAMP               | DT_NAME          | QUERY_ID                             | ERROR                                                                           |
|-------------------------+------------------+--------------------------------------+---------------------------------------------------------------------------------|
| 2025-02-17 21:40:45.444 | MY_DYNAMIC_TABLE | 01ba7614-0107-e56c-0000-a995024f304a | SQL compilation error:                                                          |
|                         |                  |                                      | Failure during expansion of view 'MY_DYNAMIC_TABLE': SQL compilation error:     |
|                         |                  |                                      | Object 'MY_DB.MY_SCHEMA.MY_BASE_TABLE' does not exist or not authorized.        |
+-------------------------+------------------+--------------------------------------+---------------------------------------------------------------------------------+

Im folgenden Beispiel werden alle Spalten für Upstream-Fehler mit dynamischen Tabellen im Schema my_schema abgerufen:

SELECT *
  FROM my_event_table
  WHERE
    resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE' AND
    resource_attributes:"snow.schema.name" = 'MY_SCHEMA' AND
    value:state = 'UPSTREAM_FAILURE'
  ORDER BY timestamp DESC;
+-------------------------+-----------------+-------------------------+-------+----------+-------------------------------------------------+-------+------------------+-------------+-----------------------------+-------------------+-------------------------------+-----------+
| TIMESTAMP               | START_TIMESTAMP | OBSERVED_TIMESTAMP      | TRACE | RESOURCE | RESOURCE_ATTRIBUTES                             | SCOPE | SCOPE_ATTRIBUTES | RECORD_TYPE | RECORD                      | RECORD_ATTRIBUTES | VALUE                         | EXEMPLARS |
|-------------------------+-----------------+-------------------------+-------+----------+-------------------------------------------------+-------+------------------+-------------+-----------------------------+-------------------+-------------------------------+-----------|
| 2025-02-17 21:40:45.486 | NULL            | 2025-02-17 21:40:45.486 | NULL  | NULL     | {                                               | NULL  | NULL             | EVENT       | {                           | NULL              | {                             | NULL      |
|                         |                 |                         |       |          |   "snow.database.id": 49,                       |       |                  |             |   "name": "refresh.status", |                   |   "state": "UPSTREAM_FAILURE" |           |
|                         |                 |                         |       |          |   "snow.database.name": "MY_DB",                |       |                  |             |   "severity_text": "WARN"   |                   | }                             |           |
|                         |                 |                         |       |          |   "snow.executable.id": 487426,                 |       |                  |             | }                           |                   |                               |           |
|                         |                 |                         |       |          |   "snow.executable.name": "MY_DYNAMIC_TABLE_2", |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          |   "snow.executable.type": "DYNAMIC_TABLE",      |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          |   "snow.owner.id": 2601,                        |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          |   "snow.owner.name": "DATA_ADMIN",              |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          |   "snow.owner.type": "ROLE",                    |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          |   "snow.schema.id": 411,                        |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          |   "snow.schema.name": "MY_SCHEMA"               |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          | }                                               |       |                  |             |                             |                   |                               |           |
+-------------------------+-----------------+-------------------------+-------+----------+-------------------------------------------------+-------+------------------+-------------+-----------------------------+-------------------+-------------------------------+-----------+

Informationen über die Rolle, die Sie für die Abfrage der Ereignistabelle verwenden müssen, und die Bedingungen, die Sie zum Filtern der Ergebnisse verwenden können, finden Sie unter Benachrichtigung über neue Daten einrichten.

Benachrichtigungen für neue Daten einrichten, um Aktualisierungen zu überwachen

Wie bereits erwähnt, wird bei der Aktualisierung einer dynamischen Tabelle ein Ereignis in der Ereignistabelle protokolliert, um anzuzeigen, ob die Aktualisierung erfolgreich war oder nicht. Sie können eine Benachrichtigung über neue Daten einrichten, um die Ereignistabelle zu überwachen. Sie können die Benachrichtigung so konfigurieren, dass eine Benachrichtigung gesendet wird, wenn eine Aktualisierung fehlschlägt.

In den nächsten Abschnitten erfahren Sie, wie Sie die Ereignisprotokollierung einrichten, um die Ereignisse zu erfassen, wie Sie die Benachrichtigung einrichten und wie Sie die in der Ereignistabelle aufgezeichneten Ereignisse interpretieren:

Bemerkung

Die Protokollierung von Ereignissen für dynamische Tabellen ist mit Kosten verbunden. Siehe Kosten der Telemetriedatenerfassung.

Schweregrad der zu erfassenden Ereignisse festlegen

Bemerkung

Wenn Sie den Schweregrad nicht festlegen, werden keine Ereignisse erfasst.

Um Ereignisse für dynamische Tabellen einzurichten, die in der Ereignistabelle aufgezeichnet werden sollen, legen Sie den Schweregrad der Ereignisse fest, die in der Ereignistabelle erfasst werden sollen. Ereignisse werden auf den folgenden Ebenen erfasst:

  • ERROR: Ereignisse für Aktualisierungsfehler.

  • WARN: Fehler bei der Aktualisierung von vorgelagerten dynamischen Tabellen und Ereignisse für Aktualisierungsfehler.

  • INFO: Ereignisse für erfolgreiche Aktualisierung, Fehler bei der Aktualisierung von vorgelagerten dynamischen Tabellen und Ereignisse für Aktualisierungsfehler.

Um den Grad einzustellen,legen Sie den LOG_EVENT_LEVEL-Parameter für das Konto oder Objekt fest. Sie können den Grad für Folgendes festlegen:

  • Alle Objekte im Konto

  • Alle Objekte in einer Datenbank oder einem Schema

  • Eine bestimmte dynamische Tabelle

Beispiel:

  • Um dynamische Tabellenereignisse auf ERROR-Level für alle unterstützten Objekte im Konto zu erfassen, führen Sie ALTER ACCOUNT SET LOG_EVENT_LEVEL aus:

    ALTER ACCOUNT SET LOG_EVENT_LEVEL = ERROR;
    

    Das Festlegen von LOG_EVENT_LEVEL auf Account-Ebene gilt für Log-Ereignisse (Record-Typ EVENT) für unterstützte Workloads im Account, einschließlich dynamischer Tabellen. Es ersetzt nicht LOG_LEVEL für Logmeldungen beim Loggen von APIs. Weitere Informationen dazu finden Sie unter Parameter.

  • Um INFO-Level-Ereignisse für alle unterstützten Objekte in der Datenbank my_db zu erfassen, führen Sie ALTER DATABASE … SET LOG_EVENT_LEVEL aus:

    ALTER DATABASE my_db SET LOG_EVENT_LEVEL = INFO;
    

    Ähnlich wie beim Festlegen des Levels auf Account-Ebene wirkt sich das Festlegen des Levels auf Datenbankebene auf Log-Ereignisse für unterstützte Objekttypen in der Datenbank aus.

  • Um WARN-Level-Ereignisse für die dynamische Tabelle my_dynamic_table zu erfassen, führen Sie ALTER DYNAMIC … TABLE SET LOG_EVENT_LEVEL aus:

    ALTER DYNAMIC TABLE my_dynamic_table SET LOG_EVENT_LEVEL = WARN;
    

Benachrichtigung über neue Daten einrichten

Nachdem Sie den Schweregrad für Protokollierereignisse festgelegt haben, können Sie eine Benachrichtigung über neue Daten einrichten, um die Ereignistabelle auf neue Ereignisse zu überwachen, die auf einen Fehler bei einer dynamischen Tabellenaktualisierung hinweisen. Eine Benachrichtigung über neue Daten wird ausgelöst, wenn neue Zeilen in die Ereignistabelle eingefügt werden, die die in der Benachrichtigung angegebene Bedingung erfüllen.

Bemerkung

Um die Benachrichtigung über neue Daten zu erstellen, müssen Sie eine Rolle verwenden, die über die erforderlichen Berechtigungen zur Abfrage der Ereignistabelle verfügt.

Um nach Ereignissen in dynamischen Tabellen abzufragen, wählen Sie in der Bedingung der Benachrichtigung Zeilen aus, in denen resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE' ist. Um die Liste der Ereignisse einzugrenzen, können Sie nach folgenden Spalten filtern:

  • Um die Ergebnisse auf dynamische Tabellen in einer bestimmten Datenbank zu beschränken, verwenden Sie resource_attributes:"snow.database.name".

  • Um Ereignisse zurückzugeben, bei denen die Aktualisierung aufgrund eines Fehlers in der dynamischen Tabelle fehlgeschlagen ist, verwenden Sie value:state = 'FAILED'.

  • Um Ereignisse zurückzugeben, bei denen die Aktualisierung aufgrund eines Fehlers mit einer vorgelagerten dynamischen Tabelle fehlgeschlagen ist, verwenden Sie value:state = 'UPSTREAM_FAILURE'.

Informationen zu den Werten, die für ein Ereignis in einer dynamischen Tabelle protokolliert werden, finden Sie unter Für Ereignisse in dynamischen Tabellen protokollierte Informationen.

Bemerkung

Die Spalte timestamp in der Ereignistabelle speichert Werte in UTC. Wenn Sie einen geplanten Alert mit einem Zeitstempelfilter verwenden (z. B. timestamp > DATEADD('minute', -5, CURRENT_TIMESTAMP())), konvertieren Sie den aktuellen Zeitstempel in UTC, damit genaue Vergleiche möglich sind:

timestamp > DATEADD('minute', -5, CONVERT_TIMEZONE('UTC', CURRENT_TIMESTAMP()))

Die folgende Anweisung erstellt beispielsweise einen Alert für neue Daten, der eine Aktion ausführt, wenn Aktualisierungen von dynamischen Tabellen in der Datenbank my_db fehlschlagen. Das Beispiel nimmt Folgendes an:

CREATE ALERT my_alert_on_dt_refreshes
  IF( EXISTS(
    SELECT * FROM SNOWFLAKE.TELEMETRY.EVENT_TABLE
      WHERE resource_attributes:"snow.executable.type" = 'dynamic_table'
        AND resource_attributes:"snow.database.name" = 'my_db'
        AND record:"name" = 'refresh.status'
        AND record:"severity_text" = 'ERROR'
        AND value:"state" = 'FAILED'))
  THEN
    BEGIN
      LET result_str VARCHAR;
      (SELECT ARRAY_TO_STRING(ARRAY_AGG(name)::ARRAY, ',') INTO :result_str
         FROM (
           SELECT resource_attributes:"snow.executable.name"::VARCHAR name
             FROM TABLE(RESULT_SCAN(SNOWFLAKE.ALERT.GET_CONDITION_QUERY_UUID()))
             LIMIT 10
         )
      );
      CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION(
        SNOWFLAKE.NOTIFICATION.TEXT_PLAIN(:result_str),
        '{"my_slack_integration": {}}'
      );
    END;

Für Ereignisse in dynamischen Tabellen protokollierte Informationen

Wenn eine dynamische Tabelle aktualisiert wird, wird ein Ereignis in der Ereignistabelle protokolliert. Die folgenden Abschnitte beschreiben die Zeile der Ereignistabelle, die das Ereignis darstellt:

Spaltenwerte der Ereignistabelle

Wenn eine dynamische Tabelle aktualisiert wird, wird eine Zeile mit den folgenden Werten in die Ereignistabelle eingefügt.

Bemerkung

Wenn eine Spalte unten nicht aufgeführt ist, ist der Spaltenwert für das Ereignis NULL.

Spalte

Datentyp

Beschreibung

timestamp

TIMESTAMP_NTZ

UTC-Zeitstempel für den Zeitpunkt, an dem das Ereignis erstellt wurde.

observed_timestamp

TIMESTAMP_NTZ

UTC-Zeit, die für Protokolle verwendet wird. Derzeit ist dies derselbe Wert, der in der Spalte timestamp steht.

resource_attributes

OBJECT

Attribute, die die aktualisierte dynamische Tabelle identifizieren.

record_type

STRING

Der Ereignistyp, der EVENT für Aktualisierungen von dynamischen Tabellen ist.

record

OBJECT

Details über den Status der Aktualisierung der dynamischen Tabelle.

value

VARIANT

Der Status der Aktualisierung der dynamischen Tabelle und, falls die Aktualisierung fehlgeschlagen ist, die Fehlermeldung für den Fehler.

Schlüssel-Wert-Paare in der Spalte resource_attributes

Die Spalte resource_attributes enthält einen Wert OBJECT mit den folgenden Schlüssel-Wert-Paaren:

Attributname

Attributtyp

Beschreibung

Beispiel

snow.database.id

INTEGER

Der interne/systemgenerierte Bezeichner der Datenbank, die die dynamische Tabelle enthält.

12345

snow.database.name

VARCHAR

Der Name der Datenbank, die die dynamische Tabelle enthält.

MY_DATABASE

snow.executable.id

INTEGER

Der interne/systemgenerierte Bezeichner der dynamischen Tabelle, die aktualisiert wurde.

12345

snow.executable.name

VARCHAR

Der Name der dynamischen Tabelle, die aktualisiert wurde.

MY_DYNAMIC_TABLE

snow.executable.type

VARCHAR

Der Typ des Objekts. Der Wert ist DYNAMIC_TABLE für Ereignisse in dynamischen Tabellen.

DYNAMIC_TABLE

snow.owner.id

INTEGER

Der interne/systemgenerierte Bezeichner der Rolle mit der Berechtigung OWNERSHIP für die dynamische Tabelle.

12345

snow.owner.name

VARCHAR

Der Name der Rolle mit der Berechtigung OWNERSHIP für die dynamische Tabelle.

MY_ROLE

snow.owner.type

VARCHAR

Der Typ der Rolle, die Eigentümer des Objekts ist, zum Beispiel ROLE. . Wenn eine Snowflake Native App Eigentümer des Objekts ist, ist der Wert APPLICATION. . Wenn Sie das Objekt löschen, gibt Snowflake den Wert NULL zurück, da ein gelöschtes Objekt keine Eigentümerrolle hat.

ROLE

snow.query.id

VARCHAR

ID der Abfrage, mit der die dynamische Tabelle aktualisiert wurde.

01ba7614-0107-e56c-0000-a995024f304a

snow.schema.id

INTEGER

Der interne/systemgenerierte Bezeichner des Schemas, das die dynamische Tabelle enthält.

12345

snow.schema.name

VARCHAR

Der Name des Schemas, das die dynamische Tabelle enthält.

MY_SCHEMA

snow.warehouse.id

INTEGER

Der interne/systemgenerierte Bezeichner des Warehouse, das zur Aktualisierung der dynamischen Tabelle verwendet wird.

12345

snow.warehouse.name

VARCHAR

Der Name des Warehouse, das zur Aktualisierung der dynamischen Tabelle verwendet wird.

MY_WAREHOUSE

Schlüssel-Wert-Paare in der Spalte record

Die Spalte record enthält einen Wert OBJECT mit den folgenden Schlüssel-Wert-Paaren:

Schlüssel

Typ

Beschreibung

Beispiel

name

VARCHAR

Der Name des Ereignisses. Der Wert ist refresh.status für Aktualisierungen dynamischer Tabellen.

refresh.status

severity_text

VARCHAR

Der Schweregrad des Ereignisses, der einen der folgenden Werte annehmen kann:

  • INFO: Die Aktualisierung war erfolgreich.

  • ERROR: Die Aktualisierung ist fehlgeschlagen.

  • WARN: Die Aktualisierung einer vorgelagerten dynamischen Tabelle ist fehlgeschlagen.

INFO

Schlüssel-Wert-Paare in der Spalte value

Die Spalte value enthält einen Wert VARIANT mit den folgenden Schlüssel-Wert-Paaren:

Schlüssel

Typ

Beschreibung

Beispiel

state

VARCHAR

Der Status der Aktualisierung, der die folgenden Werte annehmen kann:

  • SUCCEEDED: Die Aktualisierung war erfolgreich.

  • FAILED: Die Aktualisierung ist fehlgeschlagen.

  • UPSTREAM_FAILURE: Die Aktualisierung ist fehlgeschlagen, weil eine dynamische Tabelle nicht aktualisiert werden konnte, von der diese dynamische Tabelle abhängt.

SUCCEEDED

message

VARCHAR

Wenn der Wert für state als FAILED angegeben wurde, enthält diese Spalte eine Fehlermeldung.

SQL compilation error:\nFailure during expansion of view 'MY_DYNAMIC_TABLE': SQL compilation error:\nObject 'MY_DB.MY_SCHEMA.MY_BASE_TABLE' does not exist or not authorized.

Abfragen von Pipeline-Bereichen (Spans), um Aktualisierungen zu verfolgen

Zusätzlich zu:ref:` Ereignissen<label-dynamic_tables_monitoring_sql_events>` kann Snowflake Pipeline-Bereiche (Spans) für Aktualisierungen dynamischer Tabellen aufzeichnen. Ereignisse und Bereiche (Spans) sind zwei separate Beobachtbarkeitsmechanismen:

  • Ereignisse (gesteuert durch LOG_LEVEL) liefern Protokolle pro Aktualisierung einer dynamischen Tabelle und geben an, ob jede Aktualisierung erfolgreich war oder fehlgeschlagen ist.

  • Bereiche (gesteuert durch:ref:TRACE_LEVEL<label-trace_level>) bieten eine umfassendere Beobachtbarkeit auf Pipeline-Ebene, einschließlich korrelierter Ablaufverfolgungs-IDs über eine Pipeline, Gründe für Überspringen und Abhängigkeitstopologie.

Spans erfassen zusätzliche Zustände, für die keine Ereignisse ausgegeben werden, darunter SKIPPED-Aktualisierungen aufgrund von Überspringen in vorgelagerten Abhängigkeiten sowie Aktualisierungszyklen, bei denen der Scheduler eine Aktualisierung übersprungen hat, um die Verzögerung der dynamischen Tabelle und ihrer Konsumenten zu minimieren.

Bemerkung

Die Aufzeichnung von Bereichen (Spans) für dynamische Tabellen verursacht Kosten. Siehe Kosten der Telemetriedatenerfassung.

Aktivieren Sie Pipeline-Bereiche (Spans).

Um Pipeline-Bereiche (Spans) für Aktualisierungen dynamischer Tabellen zu aktivieren, stellen Sie den TRACE_LEVEL-Parameter auf Datenbank- oder Schemaebene auf ALWAYS:

ALTER SCHEMA my_db.my_schema SET TRACE_LEVEL = 'ALWAYS';

Sie können dies auch auf Datenbankebene einstellen, um Bereiche (Spans) für alle dynamischen Tabellen in der Datenbank zu erfassen:

ALTER DATABASE my_db SET TRACE_LEVEL = 'ALWAYS';

Abfragen von Bereichsdaten

Um Pipeline-Spans für Aktualisierungen dynamischer Tabellen abzufragen, filtern Sie nach Zeilen, mit record_type = 'SPAN' und record:"name" = 'table_refresh':

SELECT
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    record_attributes:"snow.dynamic_table.data_timestamp"::STRING AS data_timestamp,
    trace:"trace_id"::STRING AS trace_id,
    trace:"span_id"::STRING AS span_id,
    record:"status":"code"::STRING AS status_code
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
  ORDER BY start_timestamp ASC;

Bereichsattribute (record_attributes)

Jede Bereichszeile enthält in der record_attributes-Spalte die folgenden Attribute, die spezifisch für Aktualisierungen dynamischer Tabellen sind:

Attributname

Typ

Beschreibung

snow.dynamic_table.state

STRING

Status der Aktualisierung:SUCCEEDED, FAILED oder SKIPPED.

snow.dynamic_table.state_reason

STRING

Warum die dynamische Tabelle übersprungen wurde oder fehlgeschlagen ist. NULL bei Erfolg. Mögliche Werte:

  • QUERY_FAILURE: Die Aktualisierungsabfrage ist fehlgeschlagen.

  • UPSTREAM_FAILURE: Eine vorgelagerte dynamische Tabelle wurde nicht aktualisiert.

  • UPSTREAM_SKIP: Eine vorgelagerte dynamische Tabelle wurde übersprungen.

  • NOT_EFFECTIVE_TICK_TO_REFRESH: Die Pipeline hängt bereits hinter dem Zeitplan zurück und überspringt diese Aktualisierungsoperation, um die Verzögerung dieser dynamischen Tabelle und ihrer Verbraucher zu minimieren.

snow.dynamic_table.data_timestamp

STRING

Zeitstempel der Transaktion zum Zeitpunkt, als die Aktualisierung ausgewertet wurde. (Dies kann einen Moment vor dem tatsächlichen Zeitpunkt der Aktualisierung liegen.) Alle Daten in Basisobjekten, die vor diesem Zeitstempel eingegangen sind, sind in der dynamischen Tabelle enthalten.

Bemerkung

Bereiche (Spans) decken SKIPPED-Status (mit Gründen UPSTREAM_SKIP und``NOT_EFFECTIVE_TICK_TO_REFRESH`` ) ab, für die Ereignisse nicht ausgegeben werden. Wenn Sie Einblick in übersprungene Aktualisierungen benötigen, verwenden Sie Bereiche (Spans) anstelle von Ereignissen.

Tracking der Aktualisierung einer Pipeline

Dieser Abschnitt zeigt Schritt für Schritt, wie Sie Pipeline-Bereiche nutzen, um einen Aktualisierungszyklus von Anfang bis Ende nachzuvollziehen: vom Auffinden der relevanten Bereiche über das Abrufen der vollständigen Pipeline bis hin zur Diagnose von Fehlern oder übersprungenen Ausführungen.

Beispiel-Pipeline-Szenario

Betrachten Sie eine lineare Pipeline mit vier dynamischen Tabellen:

DT1 --> DT2 --> DT3 --> DT4

In diesem Beispiel werden DT1 und DT2 erfolgreich aktualisiert, während DT3 aufgrund eines Abfragefehlers fehlschlägt. Weil DT3 fehlschlägt, wird DT4 automatisch mit dem Grund UPSTREAM_FAILURE übersprungen.

Die folgenden Schritte zeigen, wie Sie die Pipeline-Bereiche (Spans) für dieses Szenario abrufen und interpretieren.

Schritt 1: Ermitteln des Bereichs für eine dynamische Tabelle

Um die Aktualisierung einer bestimmten dynamischen Tabelle zu untersuchen, fragen Sie die Ereignistabelle nach dem letzten Bereich (Span) ab. Filtern Sie nach Datenbank, Schema und Name der dynamischen Tabelle, um sicherzustellen, dass Sie das richtige Objekt finden:

SELECT
    trace:"span_id"::STRING AS span_id,
    trace:"trace_id"::STRING AS trace_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.data_timestamp"::STRING AS data_timestamp,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    resource_attributes:"snow.query.id"::STRING AS query_id,
    start_timestamp,
    timestamp AS end_timestamp
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND resource_attributes:"snow.database.name" = 'MY_DB'
    AND resource_attributes:"snow.schema.name" = 'MY_SCHEMA'
    AND resource_attributes:"snow.executable.name" = 'DT3'
  ORDER BY start_timestamp DESC
  LIMIT 5;
+----------+------------------+---------+-------------------------+-----------+--------------+--------------------------------------+-------------------------+-------------------------+
| SPAN_ID  | TRACE_ID         | DT_NAME | DATA_TIMESTAMP          | STATE     | STATE_REASON | QUERY_ID                             | START_TIMESTAMP          | END_TIMESTAMP           |
|----------+------------------+---------+-------------------------+-----------+--------------+--------------------------------------+-------------------------+-------------------------|
| a1b2c3d4 | 4f3e2d1c0b9a8877 | DT3     | 2026-02-13T10:00:00.000 | FAILED    | QUERY_FAILURE| 01ba7614-0107-e56c-0000-a995024f304a | 2026-02-13 10:02:01.000 | 2026-02-13 10:02:20.000 |
| e5f6a7b8 | 7a8b9c0d1e2f3344 | DT3     | 2026-02-13T09:55:00.000 | SUCCEEDED | NULL         | 01ba7614-0107-e56c-0000-a995024f2f9b | 2026-02-13 09:57:01.000 | 2026-02-13 09:57:18.000 |
+----------+------------------+---------+-------------------------+-----------+--------------+--------------------------------------+-------------------------+-------------------------+

Der trace_id-Wert kennzeichnet den Aktualisierungszyklus. Alle dynamischen Tabellenbereiche (Spans) innerhalb einer einzelnen Pipeline-Aktualisierung haben dieselbe``trace_id``. Verwenden Sie diesen Wert im nächsten Schritt, um alle Bereiche (Spans) aus demselben Aktualisierungszyklus abzurufen.

Schritt 2: Abrufen der vollständigen Pipeline

Alle Bereiche (Spans) abfragen, die dieselbe trace_id haben, um jede dynamische Tabelle im Aktualisierungszyklus anzuzeigen. Schließen Sie record:"links" ein, um das Abhängigkeitsdiagramm zu erfassen, und DATEDIFF, um die Dauer jeder Aktualisierungsoperation zu berechnen:

SELECT
    trace:"span_id"::STRING AS span_id,
    trace:"trace_id"::STRING AS trace_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    resource_attributes:"snow.query.id"::STRING AS query_id,
    start_timestamp,
    timestamp AS end_timestamp,
    DATEDIFF('second', start_timestamp, timestamp) AS duration_sec,
    record:"links" AS upstream_links
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND trace:"trace_id" = '4f3e2d1c0b9a8877'
  ORDER BY start_timestamp ASC;
+----------+------------------+---------+-----------+-----------------+--------------------------------------+-------------------------+-------------------------+--------------+---------------------------------------------+
| SPAN_ID  | TRACE_ID         | DT_NAME | STATE     | STATE_REASON    | QUERY_ID                             | START_TIMESTAMP          | END_TIMESTAMP           | DURATION_SEC | UPSTREAM_LINKS                              |
|----------+------------------+---------+-----------+-----------------+--------------------------------------+-------------------------+-------------------------+--------------+---------------------------------------------|
| f1e2d3c4 | 4f3e2d1c0b9a8877 | DT1     | SUCCEEDED | NULL            | 01ba7614-0107-e56c-0000-a995024f3001 | 2026-02-13 10:01:00.000 | 2026-02-13 10:01:30.000 |           30 | []                                          |
| b5a6c7d8 | 4f3e2d1c0b9a8877 | DT2     | SUCCEEDED | NULL            | 01ba7614-0107-e56c-0000-a995024f3002 | 2026-02-13 10:01:31.000 | 2026-02-13 10:02:00.000 |           29 | [{"span_id": "f1e2d3c4", ...}]              |
| a1b2c3d4 | 4f3e2d1c0b9a8877 | DT3     | FAILED    | QUERY_FAILURE   | 01ba7614-0107-e56c-0000-a995024f304a | 2026-02-13 10:02:01.000 | 2026-02-13 10:02:20.000 |           19 | [{"span_id": "b5a6c7d8", ...}]              |
| c9d0e1f2 | 4f3e2d1c0b9a8877 | DT4     | SKIPPED   | UPSTREAM_FAILURE| NULL                                 | 2026-02-13 10:02:20.000 | 2026-02-13 10:02:20.000 |            0 | [{"span_id": "a1b2c3d4", ...}]              |
+----------+------------------+---------+-----------+-----------------+--------------------------------------+-------------------------+-------------------------+--------------+---------------------------------------------+

Aus diesem Ergebnis können Sie das vollständige Bild des Aktualisierungszyklus ableiten:

  • DT1 und DT2 erfolgreich (30 bzw. 29 Sekunden).

  • DT3 schlug nach 19 Sekunden aufgrund eines Abfragefehlers fehl.

  • DT4 wurde sofort übersprungen (dargestellt durch einen Null-Zeitbereich), da seine Upstream-Abhängigkeit fehlgeschlagen ist.

  • Die UPSTREAM_LINKS-Spalte zeigt die direkten Abhängigkeiten jeder dynamischen Tabelle nach span_id ab.

Schritt 3: Identifizieren der Ursache eines Fehlers oder Überspringens

Wenn eine dynamische Tabelle übersprungen wird oder fehlschlägt, können Sie deren Upstream-Abhängigkeiten über die Bereichslinks verfolgen, um die Ursache zu finden. Diese Abfrage löst die Bereichsverknüpfungen einer bestimmten dynamischen Tabelle wieder zu den anderen Bereichen (Spans) in der Pipeline auf:

WITH pipeline AS (
  SELECT
    trace:"span_id"::STRING AS span_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    resource_attributes:"snow.query.id"::STRING AS query_id,
    record:"links" AS upstream_links
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND record_attributes:"snow.dynamic_table.data_timestamp" = '2026-02-13T10:00:00.000'
),
target_links AS (
  SELECT f.value:"span_id"::STRING AS upstream_span_id
  FROM pipeline,
  LATERAL FLATTEN(input => upstream_links) f
  WHERE dt_name = 'DT4'
)
SELECT
  p.dt_name AS upstream_dt,
  p.state AS upstream_state,
  p.state_reason AS upstream_reason,
  p.query_id AS upstream_query_id
FROM target_links tl
JOIN pipeline p ON tl.upstream_span_id = p.span_id;
+-------------+----------------+-----------------+--------------------------------------+
| UPSTREAM_DT | UPSTREAM_STATE | UPSTREAM_REASON | UPSTREAM_QUERY_ID                    |
|-------------+----------------+-----------------+--------------------------------------|
| DT3         | FAILED         | QUERY_FAILURE   | 01ba7614-0107-e56c-0000-a995024f304a |
+-------------+----------------+-----------------+--------------------------------------+

In diesem Beispiel wurde DT4 übersprungen, da die vorgelagerte Abhängigkeit DT3 mit QUERY_FAILURE fehlgeschlagen ist. Sie können die query_id verwenden, um die fehlgeschlagene Abfrage weiter zu untersuchen (z. B. durch Aufrufen von GET_QUERY_OPERATOR_STATS oder Überprüfen des Abfrageverlaufs).

Für längere Abhängigkeitsketten wiederholen Sie dasselbe Vorgehen: Ersetzen Sie den Namen der Ziel-dynamischen Tabelle, um weiter stromaufwärts zu gehen, bis Sie einen Bereich mit state = 'FAILED' und state_reason = 'QUERY_FAILURE' erreichen – das ist die eigentliche Ursache.

Nachgelagerte Auswirkungen eines Fehlers ermitteln

Um herauszufinden, welche dynamischen Tabellen von einem bestimmten Fehler betroffen waren, führen Sie die Suche nach dem Bereichslink aus. Diese Abfrage findet alle dynamischen Tabellen, deren record:"links" auf die span_id der fehlgeschlagenen dynamischen Tabelle verweisen:

WITH pipeline AS (
  SELECT
    trace:"span_id"::STRING AS span_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    record:"links" AS upstream_links
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND record_attributes:"snow.dynamic_table.data_timestamp" = '2026-02-13T10:00:00.000'
)
SELECT p.dt_name, p.state, p.state_reason
FROM pipeline p,
LATERAL FLATTEN(input => p.upstream_links) f
WHERE f.value:"span_id"::STRING = 'a1b2c3d4';
+---------+---------+-----------------+
| DT_NAME | STATE   | STATE_REASON    |
|---------+---------+-----------------|
| DT4     | SKIPPED | UPSTREAM_FAILURE|
+---------+---------+-----------------+

Gibt die direkten Abhängigen der fehlgeschlagenen dynamischen Tabelle zurück. Um alle transitiv betroffenen dynamischen Tabellen zu finden, wiederholen Sie die Abfrage mit jeder abhängigen``span_id``, um weiter stromabwärts zu gehen.

Verwenden Sie kompatible OpenTelemetry-Tools

Pipeline-Bereiche dynamischer Tabellen folgen dem OpenTelemetry-Standard-Datenmodell. Da alle Bereiche in einem Aktualisierungszyklus dieselbe trace:"trace_id" gemeinsam nutzen, können Sie diese aus der Ereignistabelle in OpenTelemetry-kompatible Tools zur Visualisierung exportieren.

Diese Tools können die Pipeline als Ablaufverfolgungszeitleiste darstellen und die Dauer und den Status der Aktualisierungsoperation jeder dynamischen Tabelle sowie die in den Bereichslinks kodierten Abhängigkeitsbeziehungen anzeigen.