Snowpark Container Services: Überwachen von Diensten

Zugriff auf Containerprotokolle

Snowflake sammelt alles, was Ihre Anwendungscontainer auf der Standardausgabe und den Standardfehlern ausgibt. Sie müssen sicherstellen, dass Ihr Code nützliche Informationen zur Fehlersuche in einem Dienst ausgibt.

Snowflake bietet zwei Möglichkeiten, auf diese Containerprotokolle der Dienste (einschließlich Jobdienste) zuzugreifen:

  • Systemfunktion SYSTEM$GET_SERVICE_LOGS: Ermöglicht den Zugriff auf Protokolle eines bestimmten Containers. Nach dem Beenden eines Containers können Sie noch eine kurze Zeit lang mithilfe der Systemfunktion auf die Protokolleinträge zugreifen. Systemfunktionen sind am nützlichsten während der Entwicklungs- und Testphase, wenn Sie einen neuen Dienst oder Job entwickeln. Weitere Informationen dazu finden Sie unter SYSTEM$GET_SERVICE_LOGS.

  • Verwendung einer Ereignistabelle: Die Ereignistabelle des Kontos ermöglicht Ihnen den Zugriff auf die Protokolle mehrerer Container für Dienste, die in ihrer Spezifikation die Protokollerfassung aktivieren. Snowflake speichert die Protokolleinträge in der Ereignistabelle für den späteren Zugriff. Ereignistabellen eignen sich am besten für die rückblickende Analyse von Diensten und Jobs. Weitere Informationen dazu finden Sie unter Verwenden der Ereignistabelle.

Verwenden von SYSTEM$GET_SERVICE_LOGS

Sie geben den Dienstnamen, die Instanz-ID, den Containernamen und optional die Anzahl der letzten Protokollzeilen an, die abgerufen werden sollen. Wenn nur eine Dienstinstanz ausgeführt wird, ist die Dienstinstanz-ID 0. Der folgende Befehl ruft beispielsweise die nachstehenden 10 Zeilen aus dem Protokoll eines Containers namens echo ab, der zur Instanz 0 eines Dienstes namens echo_service gehört:

SELECT SYSTEM$GET_SERVICE_LOGS('echo_service', '0', 'echo', 10);
Copy

Beispielausgabe:

+--------------------------------------------------------------------------+
| SYSTEM$GET_SERVICE_LOGS                                                  |
|--------------------------------------------------------------------------|
| 10.16.6.163 - - [11/Apr/2023 21:44:03] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:08] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:13] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:18] "GET /healthcheck HTTP/1.1" 200 - |
+--------------------------------------------------------------------------+
1 Row(s) produced. Time Elapsed: 0.878s

Wenn Sie nicht über die Informationen über den Dienst verfügen, die Sie zum Aufrufen der Funktion benötigen (wie z. B. die Instanz ID oder den Containernamen), können Sie zunächst den SHOW SERVICE CONTAINERS IN SERVICE-Befehl ausführen, um Informationen über die Dienstinstanzen und Container zu erhalten, die in jeder Instanz laufen.

Die Funktion SYSTEM$GET_SERVICE_LOGS hat die folgenden Beschränkungen:

  • Es führt die Standardausgabe und die Standardfehlerstreams zusammen. Die Funktion gibt keinen Hinweis darauf, von welchem Stream die Ausgabe stammt.

  • Sie berichtet die erfassten Daten für einen bestimmten Container in einer einzigen Dienstinstanz.

  • Sie werden nur Protokolle für einen in Ausführung befindlichen Container berichtet. Die Funktion kann keine Protokolle von einem früheren Container abrufen, der neu gestartet wurde, oder von einem Container eines Dienstes, der angehalten oder gelöscht wurde.

  • Die Funktion gibt bis zu 100 KB an Daten zurück.

Verwenden der Ereignistabelle

Snowflake kann Protokolle, die von Containern an die Standardausgabe und die Standardfehlerstreams gesendet werden, in der für Ihr Konto konfigurierten Ereignistabelle erfassen. Weitere Informationen zur Konfiguration einer Ereignistabelle finden Sie unter Protokollierung, Ablaufverfolgung und Metriken.

Über das Feld spec.logExporters in der Datei der Dienstspezifikation steuern Sie, welche Datenstreams gesammelt werden (alle, nur Standardfehler oder keine), die Sie in einer Ereignistabelle speichern möchten.

Sie können dann die Ereignistabelle nach Ereignissen abfragen. Die folgende SELECT-Anweisung ruft beispielsweise Snowflake Dienst- und Jobereignisse ab, die in der letzten Stunde aufgezeichnet wurden:

SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD_ATTRIBUTES, VALUE
FROM <current-event-table-for-your-account>
WHERE timestamp > dateadd(hour, -1, current_timestamp())
AND RESOURCE_ATTRIBUTES:"snow.service.name" = <service-name>
AND RECORD_TYPE = 'LOG'
ORDER BY timestamp DESC
LIMIT 10;
Copy

Snowflake empfiehlt, einen Zeitstempel in die WHERE-Klausel von Ereignistabellenabfragen aufzunehmen, wie in diesem Beispiel gezeigt. Dies ist besonders wichtig wegen der potenziellen Datenmenge, die von verschiedenen Snowflake-Komponenten generiert wird. Durch die Anwendung von Filtern können Sie eine kleinere Teilmenge von Daten abrufen, was die Abfrageleistung verbessert.

Die Ereignistabelle enthält die folgenden Spalten, die nützliche Informationen zu den von Snowflake erfassten Protokolleinträgen zu Ihrem Container bereitstellen:

  • TIMESTAMP: Zeigt an, wann Snowflake das Protokoll erfasst hat.

  • RESOURCE_ATTRIBUTES: Stellt ein JSON-Objekt zur Verfügung, das den Snowflake-Dienst und den Container im Dienst, der die Meldung erzeugt hat, bezeichnet. Er gibt beispielsweise Details wie den Dienstnamen, den Containernamen und den Namen des Computepools an, die bei Ausführung des Dienstes angegeben wurden.

    {
      "snow.account.name": "SPCSDOCS1",
      "snow.compute_pool.id": 20,
      "snow.compute_pool.name": "TUTORIAL_COMPUTE_POOL",
      "snow.compute_pool.node.id": "a17e8157",
      "snow.compute_pool.node.instance_family": "CPU_X64_XS",
      "snow.database.id": 26,
      "snow.database.name": "TUTORIAL_DB",
      "snow.schema.id": 212,
      "snow.schema.name": "DATA_SCHEMA",
      "snow.service.container.instance": "0",
      "snow.service.container.name": "echo",
      "snow.service.container.run.id": "b30566",
       "snow.service.id": 114,
      "snow.service.name": "ECHO_SERVICE2",
      "snow.service.type": "Service"
    }
    
    Copy
  • RECORD_ATTRIBUTES: Gibt für einen Snowflake-Dienst die Fehlerquelle an (Standardausgabe oder Standardfehler).

    { "log.iostream": "stdout" }
    
    Copy
  • VALUE: Standardausgabe und Standardfehler sind in Zeilen unterteilt, und jede Zeile generiert einen Datensatz in der Ereignistabelle.

    "echo-service [2023-10-23 17:52:27,429] [DEBUG] Sending response: {'data': [[0, 'Joe said hello!']]}"
    

Zugriff auf Metriken

Snowflake liefert Metriken für Computepools in Ihrem Konto und Diensten, die auf diesen Computepools laufen. Diese von Snowflake bereitgestellten Metriken werden auch als Plattform-Metriken bezeichnet.

  • Ereignistabelle für Dienstmetriken: Einzelne Dienste veröffentlichen Metriken. Diese sind eine Untergruppe der Computepool-Metriken, die Informationen speziell für den Dienst liefern. Das Ziel ist es, die Auslastung der Ressourcen eines bestimmten Dienstes zu beobachten. In der Dienstspezifikation legen Sie fest, welche Metriken Snowflake in der Ereignistabelle aufzeichnen soll, während der Service ausgeführt wird.

  • Computepool-Metriken: Jeder Computepool veröffentlicht auch Metriken, die Informationen darüber liefern, was in diesem Computepool geschieht. Das Ziel ist es, die Auslastung des Computepools zu beobachten. Um auf Ihre Computepool-Metriken zuzugreifen, müssen Sie einen Dienst schreiben, der Prometheus-kompatible API verwendet, um die Metriken abzufragen, die der Computepool veröffentlicht.

Zugriff auf Ereignistabelle für Dienstmetriken

Um Metriken aus einem Service in der für Ihr Konto konfigurierten Ereignistabelle zu protokollieren, nehmen Sie den folgenden Abschnitt in Ihre Dienstspezifikation auf:

platformMonitor:
  metricConfig:
    groups:
    - <group 1>
    - <group 2>
    - ...
Copy

Dabei verweist jedes group N auf eine vordefinierte Metrikgruppe, an der Sie interessiert sind (zum Beispiel system, network oder storage). Weitere Informationen finden Sie im Abschnitt spec.platformMonitor field in der Dokumentation zur Dienstspezifikation.

Während der Dienst ausgeführt wird, protokolliert Snowflake diese Metriken in der Ereignistabelle in Ihrem Konto. Sie können Ihre Ereignistabelle abfragen, um die Metriken zu lesen. Die folgende Abfrage ruft die Dienstmetriken ab, die in der letzten Stunde für den my_service-Service aufgezeichnet wurden:

SELECT timestamp, value
  FROM my_event_table_db.my_event_table_schema.my_event_table
  WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP())
    AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'MY_SERVICE'
    AND RECORD_TYPE = 'METRIC'
    ORDER BY timestamp DESC
    LIMIT 10;
Copy

Wenn Sie den Namen der aktiven Ereignistabelle für das Konto nicht kennen, führen Sie den SHOW PARAMETERS-Befehl aus, um den Wert des Parameters auf Kontoebene EVENT_TABLE anzuzeigen:

SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
Copy

Weitere Informationen zu Ereignistabellen finden Sie unter Verwenden der Ereignistabelle.

Beispiel

Befolgen Sie diese Schritte, um einen Beispieldienst zu erstellen, der Metriken in der für Ihr Konto konfigurierten Ereignistabelle aufzeichnet.

  1. Folgen Sie Tutorial 1, um einen Dienst mit dem Namen echo_service zu erstellen, und zwar mit einer Änderung. In Schritt 3, in dem Sie einen Dienst erstellen, verwenden Sie den folgenden CREATE SERVICE-Befehl, um das Feld platformMonitor in die geänderte Dienstspezifikation einzufügen.

    CREATE SERVICE echo_service
      IN COMPUTE POOL tutorial_compute_pool
      FROM SPECIFICATION $$
        spec:
          containers:
          - name: echo
            image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest
            env:
              SERVER_PORT: 8000
              CHARACTER_NAME: Bob
            readinessProbe:
              port: 8000
              path: /healthcheck
          endpoints:
          - name: echoendpoint
            port: 8000
            public: true
          platformMonitor:
            metricConfig:
              groups:
              - system
              - system_limits
          $$
        MIN_INSTANCES=1
        MAX_INSTANCES=1;
    
    Copy
  2. Nachdem der Dienst läuft, beginnt Snowflake mit der Aufzeichnung der Metriken in den angegebenen Metrikgruppen in der Ereignistabelle, die Sie dann abfragen können. Die folgende Abfrage ruft die in der letzten Stunde vom Echo-Dienst gemeldeten Metriken ab.

    SELECT timestamp, value
      ROM my_events
      WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP())
        AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'ECHO_SERVICE'
        AND RECORD_TYPE = 'METRIC'
        ORDER BY timestamp, group DESC
        LIMIT 10;
    
    Copy

Zugriff auf Computepool-Metriken

Computepool-Metriken bieten Einblicke in die Knoten im Computepool und die darauf laufenden Dienste. Jeder Knoten meldet knotenspezifische Metriken, wie z. B. die Menge an verfügbarem Speicher für Container, sowie Dienstmetriken, wie z. B. die Speichernutzung durch einzelne Container. Die Computepool-Metriken liefern Informationen aus der Sicht eines Knotens.

Jeder Knoten hat einen Metrik-Verleger, der TCP-Port 9001 überwacht. Andere Dienste können eine HTTP GET-Anfrage mit dem Pfad /metrics an Port 9001 auf dem Knoten stellen. Um die IP-Adresse des Knotens zu ermitteln, rufen Sie SRV-Datensätze (oder A-Datensätze) von DNS für den Hostnamen discover.monitor.compute_pool_name.snowflakecomputing.internal ab. Dann erstellen Sie einen weiteren Dienst in Ihrem Konto, der jeden Knoten aktiv abfragt, um die Metriken abzurufen.

Der Hauptteil (Body) der Antwort liefert die Metriken unter Verwendung des Prometheus-Formats wie in den folgenden Beispielmetriken gezeigt:

# HELP node_memory_capacity Defines SPCS compute pool resource capacity on the node
# TYPE node_memory_capacity gauge
node_memory_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 1
node_cpu_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 7.21397383168e+09

Beachten Sie Folgendes:

  • Der Body der Antwort beginnt mit # HELP und # TYPE, die eine kurze Beschreibung und den Typ der Metrik enthalten. In diesem Beispiel ist die node_memory_capacity-Metrik vom Typ gauge.

  • Danach folgen der Name der Kennzahl, eine Liste von Bezeichnungen (Labels), die eine bestimmte Ressource (Datenpunkt) beschreiben, sowie ihr Wert. In diesem Beispiel liefert die Metrik (mit dem Namen node_memory_capacity) Informationen zum Arbeitsspeicher und zeigt an, dass der Knoten über 7,2 GB verfügbaren Arbeitsspeicher verfügt. Die Metrik enthält auch Metadaten in Form von Beschriftungen, wie gezeigt:

    snow_compute_pool_name="MY_POOL",
    snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"
    

Sie können diese Metriken auf jede beliebige Weise verarbeiten. Sie können die Metriken beispielsweise in einer Datenbank speichern und ein UI (wie ein Grafana Dashboard) verwenden, um die Informationen anzuzeigen.

Bemerkung

  • Snowflake bietet keine Aggregation von Metriken an. Um zum Beispiel Metriken für einen bestimmten Dienst zu erhalten, müssen Sie alle Knoten abfragen, auf denen Instanzen dieses Dienstes ausgeführt werden.

  • Der Computepool muss einen DNS-kompatiblen Namen haben, damit Sie auf die Metriken zugreifen können.

  • Auf den von einem Computepool bereitgestellten Endpunkt kann ein Service mit einer Rolle zugreifen, die über die Berechtigung OWNERSHIP oder MONITOR für den Computepool verfügt.

Eine Liste der verfügbaren Computepool-Metriken finden Sie unter Verfügbare Plattformmetriken.

Beispiel

Ein Beispiel für die Konfiguration von Prometheus zur Abfrage von Metriken in Ihrem Computepool finden Sie in den Tutorials zu Computepool-Metriken.

Verfügbare Plattformmetriken

Im Folgenden finden Sie eine Auflistung der verfügbaren Gruppen von Plattformmetriken und der Metriken innerhalb jeder Gruppe. Beachten Sie, dass die Speicher Metriken derzeit nur von Blockspeicher-Volumes erfasst werden.

Metric group . Metric name

Einheit

Typ

Beschreibung

system . container.cpu.usage

CPU-Kerne

Gauges

Durchschnittliche Anzahl der CPU-Kerne, die seit der letzten Messung verwendet wurden. 1.0 bedeutet volle Auslastung von 1 CPU-Kern. Der Maximalwert ist die Anzahl der für den Container verfügbaren CPU-Kerne.

system . container.memory.usage

bytes

gauge

Verwendeter Arbeitsspeicher, in Bytes.

system . container.gpu.memory.usage

bytes

gauge

Pro genutzterGPU-Speicher, in Bytes. Die Quelle GPU wird im Attribut ‚gpu‘ angegeben.

system . container.gpu.utilization

Verhältnis

gauge

Verhältnis zwischen der GPU-Nutzung und der Kapazität. Die Quelle GPU wird im Attribut ‚gpu‘ angegeben.

system_limits . container.cpu.limit

CPU-Kerne

gauge

CPU-Ressouercengrenze aus der Dienstspezifikation. Wenn keine Beschränkung definiert ist, wird standardmäßig die Kapazität des Knotens verwendet.

system_limits . container.gpu.limit

gpus

gauge

GPU-Zählgrenze aus der Dienstspezifikation. Wenn keine Beschränkung definiert ist, wird die Metrik nicht ausgegeben.

system_limits . container.memory.limit

bytes

gauge

Arbeitspeicherlimit aus der Dienstspezifikation. Wenn keine Beschränkung definiert ist, wird standardmäßig die Kapazität des Knotens verwendet.

system_limits . container.cpu.requested

CPU-Kerne

gauge

CPU-Ressourcenanfrage aus der Dienstspezifikation. Wenn keine Beschränkung definiert ist, wird standardmäßig ein von Snowflake gewählter Wert verwendet.

system_limits . container.gpu.requested

gpus

gauge

GPU-Zählung aus der Dienstspezifikation. Wenn keine Beschränkung definiert ist, wird die Metrik nicht ausgegeben.

system_limits . container.memory.requested

bytes

gauge

Arbeitsspeicheranfrage aus der Dienstspezifikation. Wenn keine Beschränkung definiert ist, wird standardmäßig ein von Snowflake gewählter Wert verwendet.

system_limits . container.gpu.memory.capacity

bytes

gauge

Pro GPU-Speicherplatz. Die Quelle GPU wird im Attribut ‚gpu‘ angegeben.

status . container.restarts

startet neu

gauge

Häufigkeit, mit der Snowflake den Container neu gestartet hat.

status . container.state.finished

boolean

gauge

Wenn sich der Container im Status ‚fertig‘ befindet, wird diese Metrik mit dem Wert 1 ausgegeben.

status . container.state.last.finished.reason

boolean

gauge

Wenn der Container zuvor neu gestartet wurde, wird diese Metrik mit dem Wert 1 ausgegeben. Die Beschriftung ‚reason‘ beschreibt, warum der Container zuletzt beendet wurde.

status . ontainer.state.last.finished.exitcode

Ganzzahl

gauge

Wenn ein Container zuvor neu gestartet wurde, enthält diese Metrik den Exitcode der vorherigen Ausführung.

status . container.state.pending

boolean

gauge

Wenn sich ein Container im Status ‚ausstehend‘ befindet, wird diese Metrik mit dem Wert 1 ausgegeben.

status . container.state.pending.reason

boolean

gauge

Wenn sich ein Container im Status ‚ausstehend‘ befindet, wird diese Metrik mit dem Wert 1 ausgegeben. Die Beschriftung ‚reason‘ beschreibt, warum sich der Container zuletzt im ausstehenden Status befand.

status . container.state.running

boolean

gauge

Wenn sich ein Container im Stauts ‚wird ausgeführt‘ befindet, wird diese Metrik mit dem Wert 1 ausgegeben.

status . container.state.started

boolean

gauge

Wenn sich ein Container im Status ‚gestartet‘ befindet, wird diese Metrik mit dem Wert 1 ausgegeben.

network . network.egress.denied.packets

Pakete

gauge

Gesamtzahl der verweigerten Pakete beim Netzwerk-Egress aufgrund von Fehlern bei der Richtlinienüberprüfung.

network . network.egress.received.bytes

bytes

gauge

Gesamtzahl der durch Egress-Netzwerk von Remote-Zielen empfangenen Bytes.

network . network.egress.received.packets

Pakete

gauge

Gesamtzahl der von Remote-Zielen empfangenen Netzwerk-Egress-Pakete.

network . network.egress.transmitted.bytes

Byte

gauge

Gesamtzahl der von Egress-Netzwerk an Remote-Ziele übertragene Bytes.

network . network.egress.transmitted.packets

Pakete

gauge

Netzwerk-Egress Gesamtanzahl der Pakete, die an Remote-Ziele übertragen werden.

storage . volume.capacity

bytes

gauge

Größe des Dateisystems.

storage . volume.io.inflight

operationen

gauge

Anzahl der aktiven I/O-Operationen des Dateisystems.

storage . volume.read.throughput

Bytes/Sekunde

gauge

Dateisystem-Lesedurchsatz in Bytes pro Sekunde.

storage . volume.read.iops

Operationen/Sekunde

gauge

Dateisystem-Leseoperationen pro Sekunde.

storage . volume.usage

bytes

gauge

Gesamtzahl der im Dateisystem verwendeten Bytes.

storage . volume.write.throughput

Bytes/Sekunde

gauge

Schreibdurchsatz des Dateisystems in Bytes pro Sekunde.

storage . volume.write.iops

Operationen/Sekunde

gauge

Dateisystem-Schreiboperationen pro Sekunde.