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);
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;
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" }
RECORD_ATTRIBUTES: Gibt für einen Snowflake-Dienst die Fehlerquelle an (Standardausgabe oder Standardfehler).
{ "log.iostream": "stdout" }
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>
- ...
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;
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;
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.
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 FeldplatformMonitor
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;
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;
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 dienode_memory_capacity
-Metrik vom Typgauge
.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. |