Snowpark Container Services: Überwachen von Diensten¶
Auf Containerprotokolle zugreifen¶
Snowflake sammelt alles, was Ihre Anwendungscontainer auf der Standardausgabe und den Standardfehlern ausgibt. Stellen Sie sicher, dass Ihr Code nützliche Informationen ausgibt, die Sie später zum Debuggen Ihres Service verwenden können.
Snowflake speichert Containerprotokolle in der Ereignistabelle für den späteren Zugriff, es sei denn, Sie entscheiden sich ausdrücklich dagegen. Weitere Informationen dazu finden Sie unter Protokollerfassung konfigurieren.. Das Speichern von Protokollen in Ereignistabellen ermöglicht eine rückblickende Analyse von Services und Jobs. Weitere Informationen dazu finden Sie unter Verwenden der Ereignistabelle.
Sie können derzeit mit den folgenden Optionen auf Containerprotokolle zugreifen:
Die Service-Hilfsmethode verwenden: Wir empfehlen, die Tabellenfunktion Verwenden der Funktion <service-name>!SPCS_GET_LOGS zum Abrufen von Containerprotokollen des angegebenen Service oder Jobs aufzurufen, die von Snowflake in der Ereignistabelle gesammelt werden.
Die Ereignistabelle direkt verwenden: Wenn Sie vollen Zugriff auf die Ereignistabelle haben, können Sie die Ereignistabelle direkt abfragen, um historische Protokolle zu erhalten.
Die Systemfunktion SYSTEM$GET_SERVICE_LOGS verwenden: Rufen Sie SYSTEM$GET_SERVICE_LOGS auf, um die Protokolle des aktuell ausgeführten Service- oder Jobcontainers abzurufen.
Verwenden der Funktion <service-name>!SPCS_GET_LOGS¶
Die Tabellenfunktion <service_name>!SPCS_GET_LOGS gibt Protokolle aus den Containern des angegebenen Jobs zurück. Diese Protokolle werden von Snowflake gesammelt und in der Ereignistabelle gespeichert.
Die folgende Liste erläutert die Vorteile der Verwendung dieser Tabellenfunktion:
Sie können Protokolle für einen bestimmten Service abrufen.
Sie können Protokolle innerhalb eines bestimmten Zeitbereichs abrufen.
Der Aufrufer benötigt keinen Zugriff auf die gesamte Ereignistabelle, was für Kunden mit strengen Anforderungen an die Informationssicherheit von Vorteil sein kann. Wenn die aktuelle Sitzung die Eigentümerrolle für den Service enthält, dann hat sie Zugriff auf diese Protokolle.
Für service_name
geben Sie den Namen des Service an. Die Funktion gibt Protokolle zurück, die Snowflake aus Containern dieses Service gesammelt hat (siehe Auf Containerprotokolle zugreifen).
Sie können optional einen Datumsbereich angeben. Standardmäßig gibt die Funktion Ein-Tages-Protokolle zurück. Die Abfrage hat beispielsweise Protokolle abgerufen, die Snowflake aus Containern des my_test_job
-Job über den letzten Tag gesammelt hat, was der Standard ist.
SELECT * FROM TABLE(my_test_job!SPCS_GET_LOGS());Beispielausgabe:
+-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+ | TIMESTAMP | INSTANCE_ID | CONTAINER_NAME | LOG | RECORD_ATTRIBUTES | |-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------| | 2025-06-26 00:23:40.281 | 0 | main | job-tutorial - INFO - Job finished | { | | | | | | "log.iostream": "stdout" | | | | | | } | | 2025-06-26 00:23:38.787 | 0 | main | job-tutorial - INFO - Executing query [select current_time() as time,'hello'] and writing result to table [results] | { | | | | | | "log.iostream": "stdout" | | | | | | } | | 2025-06-26 00:23:38.787 | 0 | main | job-tutorial - INFO - Connection succeeded. Current session context: database="TUTORIAL_DB", schema="DATA_SCHEMA", warehouse="TUTORIAL_WAREHOUSE", role="TEST_ROLE" | { | | | | | | "log.iostream": "stdout" | | | | | | } | | 2025-06-26 00:23:36.852 | 0 | main | job-tutorial - INFO - Job started | { | | | | | | "log.iostream": "stdout" | | | | | | } | +-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+
Weitere Informationen zum Aufrufen dieser Methode finden Sie unter <service_name>!SPCS_GET_LOGS.
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. Um die aktive Ereignistabelle für das Konto zu finden, verwenden Sie den Befehl SHOW PARAMETERS, um den Wert des Parameters EVENT_TABLE zu ermitteln:
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
Der Parameter gibt die aktive Ereignistabelle für das Konto an.
Als Nächstes fragen Sie diese Ereignistabelle ab. Die folgende SELECT-Anweisung ruft 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!']]}"
Verwenden von SYSTEM$GET_SERVICE_LOGS¶
Die Funktion SYSTEM$GET_SERVICE_LOGS gibt Protokolle des aktuell laufenden Service-Containers zurück. Nach dem Beenden eines Containers können Sie noch eine kurze Zeit lang mithilfe der Systemfunktion auf die Protokolle zugreifen. Systemfunktionen sind am nützlichsten während der Entwicklungs- und Testphase, wenn Sie einen neuen Dienst oder Job entwickeln.
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 Service 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 Service-Instanzen 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 aus einem früheren Container abrufen, der neu gestartet wurde, oder aus einem Container eines Service, der eingestellt oder gelöscht wurde.
Die Funktion gibt bis zu 100 KB an Daten zurück.
Auf Plattformmetriken zugreifen¶
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 (z. B. 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 diese Metriken auf folgende Weise lesen:
Die Service-Hilfsmethode verwenden: Die Tabellenfunktion <service_name>!SPCS_GET_METRICS gibt Metriken zurück, die Snowflake für den angegebenen Dienst gesammelt hat. Die folgende Liste erläutert die Vorteile der Verwendung dieser Tabellenfunktion:
Sie können Metriken für einen bestimmten Service abrufen.
Sie können Metriken innerhalb eines bestimmten Zeitbereichs abrufen.
Der Aufrufer benötigt keinen Zugriff auf die gesamte Ereignistabelle, was für Kunden mit strengen Anforderungen an die Informationssicherheit von Vorteil sein kann.
Die folgende SELECT-Anweisung verwendet die Tabellenfunktion, um Plattformereignisse für den angegebenen Service abzurufen, die in der letzten Stunde aufgezeichnet wurden:
SELECT * FROM TABLE(echo_service!SPCS_GET_METRICS(start_time => dateadd('hour', -1, current_timestamp())));
Die Ereignistabelle direkt abfragen: 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 EVENT_TABLE auf Kontoebene anzuzeigen:
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
Weitere Informationen zu Ereignistabellen finden Sie unter Verwenden der Ereignistabelle.
Beispiel
Um einen Beispielservice zu erstellen, der Metriken in der Ereignistabelle aufzeichnet, die für Ihr Konto konfiguriert ist, führen Sie die folgenden Schritte aus:
Erstellen Sie einen Service namens
echo_service
, indem Sie die Schritte im Tutorial 1 mit einer Änderung ausführen. In Schritt 3, in dem Sie einen Service erstellen, verwenden Sie den folgenden Befehl CREATE SERVICE, um das FeldplatformMonitor
in die geänderte Service-Spezifikation 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 Service läuft, beginnt Snowflake mit der Aufzeichnung der Metriken in den angegebenen Metrikgruppen in der Ereignistabelle.
Greifen Sie auf die Metriken durch Aufrufen der Funktion <service_name>!SPCS_GET_METRICS oder durch Abfrage der Ereignistabelle zu. Rufen Sie beispielsweise die in der letzten Stunde vom Dienst echo_service gemeldeten Metriken ab:
Die Hilfsfunktion <service_name>!SPCS_GET_METRICS verwenden:
SELECT * FROM TABLE(echo_service!SPCS_GET_METRICS(START_TIME => DATEADD(‚hour‘, -1, CURRENT_TIMESTAMP())));
Die Ereignistabelle direkt abfragen:
SELECT timestamp, value FROM my_events WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'ECHO_SERVICE' AND RECORD_TYPE = 'METRIC' AND RECORD:metric.name = 'container.cpu.usage' ORDER BY timestamp DESC LIMIT 100;
Auf Computepool-Metriken zugreifen¶
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.cp.spcs.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 . container.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. |
Veröffentlichung und Zugriff auf Anwendungsmetriken¶
Anwendungsmetriken und Ablaufverfolgungen werden von Ihrem Dienst generiert, im Gegensatz zu den Plattformmetriken, die Snowflake generiert. Ihre Dienstcontainer können OLTP- oder Prometheus-Metriken erzeugen und Snowflake veröffentlicht diese in der für Ihr Konto konfigurierten Ereignistabelle.
Beachten Sie, dass Sie sicherstellen sollten, dass Ihr Dienstcontainercode Metriken mit den richtigen Einheiten, Aggregations- und Instrumentierungstypen ausgibt, um Metriken zu erzeugen, die für Ihre Analyse aussagekräftig und effektiv sind.
Veröffentlichung von OTLP-Anwendungsmetriken und Ablaufverfolgungen¶
Snowflake führt einen OTel-Sammler aus, den Ihr Dienstcontainer verwenden kann, um OTLP-Anwendungsmetriken und Ablaufverfolgungen zu veröffentlichen. Das heißt, dass ein Dienstcontainer Metriken an die Endpunkte der OTel-Sammler senden kann, die Snowflake dann zusammen mit den Details des verursachenden Dienstes in die für Ihr Snowflake-Konto konfigurierte Ereignistabelle schreibt.
Dies funktioniert wie folgt:
Snowflake füllt automatisch die folgenden Umgebungsvariablen in Ihrem Dienstcontainer aus, die die Endpunkte des OTel-Sammlers bereitstellen, an denen Container Anwendungsmetriken und Ablaufverfolgungen veröffentlichen können.
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
Der Standard OTLP-Client sucht nach diesen Umgebungsvariablen, um den OTel-Sammler automatisch zu finden. Dies ermöglicht es Ihrem Dienstcontainer, Metriken und Ablaufverfolgungen über diesen Client zu veröffentlichen.
Konfigurieren der Ablaufverfolgungs-IDs der OTLP-Anwendung¶
Ablaufverfolgungen müssen das Snowflake Ablaufverfolgung-ID-Format verwenden, damit sie in Snowflake Trail angezeigt werden können und ein performantes Nachschlagen ermöglichen.
Snowflake bietet Python- und Java-Bibliotheken, um die Einrichtung des Generators Ablaufverfolgungs-ID zu vereinfachen. Die folgenden Beispiele zeigen, wie Sie den Standardgenerator OpenTelemetry Ablaufverfolgungs-ID mit diesen Bibliotheken außer Kraft setzen können.
from opentelemetry.sdk.trace import TracerProvider
from snowflake.telemetry.trace import SnowflakeTraceIdGenerator
trace_id_generator = SnowflakeTraceIdGenerator()
tracer_provider = TracerProvider(
resource=Resource.create({"service.name": SERVICE_NAME}),
id_generator=trace_id_generator
)
Weitere Informationen finden Sie unter snowflake-telemetry-python auf PyPI.
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import com.snowflake.telemetry.trace.SnowflakeTraceIdGenerator;
static OpenTelemetry initOpenTelemetry() {
return AutoConfiguredOpenTelemetrySdk.builder()
.addPropertiesSupplier(
() ->
Map.of(...config options...)
.addTracerProviderCustomizer(
(tracerProviderBuilder, configProperties) -> {
tracerProviderBuilder.setIdGenerator(SnowflakeTraceIdGenerator.INSTANCE);
return tracerProviderBuilder;
})
.build()
.getOpenTelemetrySdk();
Weitere Informationen zur Installation von com.snowflake.telemetry
finden Sie unter Einrichten Ihrer Java- und Scala-Umgebung für die Verwendung der Telemetrie-Klasse.
Ein Ablaufverfolgungs-ID-Generator kann auch für jede andere Programmiersprache implementiert werden. Die 16-Byte-Datei ID (Big Endian) muss in den vier höchstwertigen Bytes einen Zeitstempel enthalten. Die anderen Bytes sollten zufällige Bits enthalten. Weitere Informationen finden Sie unter Python Referenzimplementierung.
Veröffentlichung von Prometheus-Anwendungsmetriken¶
Snowflake unterstützt Prometheus-Metriken. Anstatt OTLP-Metriken zu pushen, kann Ihre Anwendung Prometheus-Metriken bereitstellen, die von einem von Snowflake bereitgestellten Sammler abgefragt werden. Damit Snowflake diese Anwendungsmetriken von Ihrem Dienst erfassen und in der Ereignistabelle veröffentlichen kann, führen Sie folgende Schritte aus:
Lassen Sie Ihren Dienst auf einem Port lauschen, der Ihre Prometheus-Metriken offenlegt.
Binden Sie in Ihren Dienst einen von Snowflake bereitgestellten Container (auch als „Sidecar“-Container bezeichnet) mit der notwendigen Konfiguration ein, um die Metriken aus Ihrem Dienstcontainer zu ziehen.
Der Prometheus-Sidecar holt die Anwendungsmetriken in einem geplanten Rhythmus aus dem Container, konvertiert das Prometheus-Format in das OTLP -Format und sendet die Metriken an den OTel-Sammler. Der OTel-Sammler veröffentlicht diese Metriken dann in der für Ihr Snowflake-Konto konfigurierten Ereignistabelle.
Bemerkung
Snowflake unterstützt den zusammenfassenden Prometheus Metrik-Typ nicht, da er durch OpenTelemetry veraltet ist. Verwenden Sie stattdessen den Typ Histogramm.
Sie fügen den Prometheus Sidecar-Container als weiteren Container zur Dienstspezifikation hinzu und fügen ein Argument hinzu, um den HTTP-Endpunkt anzugeben, der von Ihrem Container bereitgestellt wird, und zwar in folgendem Format:
localhost:{PORT}/{METRICS_PATH}, {SCRAPE_FREQUENCY}
Er gibt eine Port-Nummer, einen Pfad und die Häufigkeit an, mit der der Sidecar die Metriken abrufen soll.
Ein Beispiel für ein Fragment der Dienstspezifikation zeigt, dass der Sidecar-Container jede Minute Metriken von Ihrem Dienstcontainer von Port 8000 abruft und Metriken aus dem Pfad „/metrics“ zieht:
spec:
containers:
- name: <name>
image: <image-name>
.....
- name: prometheus
image: /snowflake/images/snowflake_images/monitoring-prometheus-sidecar:0.0.1
args:
- "-e"
- "localhost:8000/metrics,1m"
Erläuterungen zu dieser Spezifikation:
image
ist das von Snowflake zur Verfügung gestellte Sidecar-Container-Image.args
stellt die notwendige Konfiguration für den Prometheus-Container zum Scrapen von Metriken bereit:Ab Port 8000, der von Ihrem Container bereitgestellt wird. Der Port wird in dieser Prometheus Container-Konfiguration benötigt.
Verwenden Sie den Pfad „/metrics“. Er ist optional. Wenn nicht angegeben, ist „/metrics“ der Standardpfad.
Jede Minute. Er ist optional. Wenn nicht angegeben, ist „1m“ der Standardwert.
Wenn Sie die Standardeinstellungen verwenden, ist dies die entsprechende Konfiguration für das Scraping von Metriken:
spec: ... args: - "-e" - "localhost:8000"
Bemerkung
Der Prometheus Sidecar-Container wird nur für Dienste (nicht für Aufträge) unterstützt. Wenn Sie Anwendungsmetriken für einen Auftrag sammeln möchten, muss dieser die Metriken an den OTel-Sammler senden.
Zugriff auf Anwendungsmetriken und Ablaufverfolgungen in der Ereignistabelle¶
Sie können die Ereignistabelle abfragen, um Anwendungsmetriken abzurufen. Die folgende Abfrage ruft die Anwendungsmetriken ab, die in der letzten Stunde gesammelt wurden.
SELECT timestamp, record:metric.name, value
FROM <current_event_table_for_your_account>
WHERE timestamp > dateadd(hour, -1, CURRENT_TIMESTAMP())
AND resource_attributes:"snow.service.name" = <service_name>
AND scope:"name" != 'snow.spcs.platform'
AND record_type = 'METRIC'
ORDER BY timestamp DESC
LIMIT 10;
Weitere Informationen zu Ereignistabellen finden Sie unter Überblick über die Ereignisse. Sie können diese Metriken in Snowflake Dashboards visualisieren.
Sie können auch Ihre Ereignistabelle abfragen, um die Ablaufverfolgung der Anwendung einzusehen. Um beispielsweise Ablaufverfolgungen der letzten Stunde abzurufen, ersetzen Sie in der vorangegangenen Abfrage die Bedingung record_type
wie folgt:
AND record_type = 'SPAN' OR record_type = 'SPAN_EVENT'
Ablaufverfolgungen können im Snowflake Trail viewer visualisiert werden.
Metriken und Ablaufverfolgungen enthalten sowohl benutzerdefinierte als auch von Snowflake definierte Attribute als Ressourcen- und Datensatzattribute. Beachten Sie, dass das Präfix snow.
für von Snowflake generierte Attribute reserviert ist. Snowflake ignoriert benutzerdefinierte Attribute, die dieses Präfix verwenden. Eine Liste der von Snowflake definierten Attribute finden Sie unter Verfügbare Plattformmetriken.
Der Beispielcode ist sowohl in Python als auch in Java verfügbar und demonstriert die Instrumentierung einer Anwendung mit benutzerdefinierten Metriken und Ablaufverfolgungen unter Verwendung des OTLP SDK. Die Beispiele zeigen, wie Sie die Generierung von Snowflake Ablaufverfolgungs-ID für die Kompatibilität mit dem Snowflake Trail Viewer für Ablaufverfolgung konfigurieren.
Auf Plattformereignisse zugreifen¶
Snowflake zeichnet Ereignisse auf, die einen Einblick in den Status und die Historie von Services geben. Diese von Snowflake bereitgestellten Ereignisse werden als Plattformereignisse bezeichnet.
Wenn Ihr Service-Container z. B. gerade ausgeführt wird, aber einen Tag zuvor aufgrund eines schwerwiegenden Fehlers (z. B. fehlender Arbeitsspeicher) neu gestartet wurde, können Sie Plattformereignisse verwenden, um dieses historische Ereignis anzuzeigen.
Snowflake protokolliert diese Plattformereignisse in der Ereignistabelle in Ihrem Konto. Plattformereignisse werden standardmäßig nicht protokolliert. Um die Protokollierung von Plattformereignissen zu aktivieren, legen Sie den Parameter LOG_LEVEL beim Erstellen von Ressourcen (z. B. bei Ausführung von CREATE SERVICE) fest oder verwenden Sie ALTER-Anweisungen zum Aktualisieren des Protokolliergrads für vorhandene Ressourcen.
Bemerkung
Wenn der Parameter LOG_LEVEL nicht auf Ressourcenebene festgelegt ist, kann Snowflake den Wert des Parameters übernehmen, der auf einer höheren Ebene festgelegt ist. Für einen Service kann Snowflake den Wert des Parameters LOG_LEVEL übernehmen, der für das Schema, die Datenbank oder das Konto des Service festgelegt ist. Weitere Informationen dazu finden Sie unter Wie Snowflake den effektiven Grad bestimmt.
Sie können den aktuell für einen Service eingestellten Protokolliergrad überprüfen, indem Sie SHOW PARAMETERS … IN SERVICE ausführen:
SHOW PARAMETERS LIKE 'LOG_LEVEL' IN SERVICE mydb.myschema.myservice;
Der Wert des Parameters LOG_LEVEL bestimmt den Schweregrad der Ereignisse, die in der Ereignistabelle erfasst werden sollen. In der aktuellen Implementierung sind die von LOG_LEVEL unterstützten Werte: INFO
und ERROR
.
Wenn Sie nur ERROR-Ereignisse in der Ereignistabelle aufzeichnen möchten, stellen Sie LOG_LEVEL auf
ERROR
ein.Wenn Sie möchten, dass
INFO
- undERROR
-Ereignisse in der Ereignistabelle erfasst werden, stellen Sie LOG_LEVEL aufINFO
ein.Wenn Sie die Aufzeichnung von Plattformereignissen in der Ereignistabelle beenden möchten, stellen Sie LOG_LEVEL auf
OFF
.
Weitere Informationen dazu finden Sie unter Einstellen der Telemetriegrade.
Plattformereignisse abfragen¶
Nachdem Sie den Protokolliergrad für Ihre Ressource konfiguriert haben, zeichnet Snowflake die Plattformereignisse in der aktiven Ereignistabelle in Ihrem Snowflake-Konto auf. Sie können auf diese Ereignisse auf folgende Weise zugreifen:
Die Service-Hilfsmethode verwenden: Die Tabellenfunktion <service_name>!SPCS_GET_EVENTS gibt Ereignisse zurück, die Snowflake aus den Containern des angegebenen Service gesammelt hat.
Die folgende Liste erläutert die Vorteile der Verwendung dieser Tabellenfunktion:
Sie können Ereignisse für einen bestimmten Service abrufen.
Sie können Ereignisse innerhalb eines bestimmten Zeitbereichs abrufen.
Der Aufrufer benötigt keinen Zugriff auf die gesamte Ereignistabelle, was für Kunden mit strengen Anforderungen an die Informationssicherheit von Vorteil sein kann.
Die folgende SELECT-Anweisung verwendet die Tabellenfunktion, um Plattformereignisse für den angegebenen Service abzurufen, die in der letzten Stunde aufgezeichnet wurden:
SELECT * FROM TABLE(echo_service!SPCS_GET_EVENTS(START_TIME => DATEADD('hour', -1, CURRENT_TIMESTAMP())));
Die Ereignistabelle direkt verwenden: Sie können die Ereignistabelle direkt abfragen. Um die aktive Ereignistabelle für das Konto zu finden, verwenden Sie den Befehl SHOW PARAMETERS, um den Wert des Parameters EVENT_TABLE zu ermitteln:
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
Der Parameter gibt die aktive Ereignistabelle für das Konto an.
Als Nächstes fragen Sie diese Ereignistabelle ab. Die folgende SELECT-Anweisung ruft Plattformereignisse für den angegebenen Service ab, die in der letzten Stunde aufgezeichnet wurden:
SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD, VALUE FROM <your_event_table> WHERE TIMESTAMP > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = '<your_service_name>' AND RECORD_TYPE = 'EVENT' AND SCOPE:"name" = 'snow.spcs.platform' ORDER BY TIMESTAMP DESC LIMIT 10;
Weitere Informationen zu Ereignistabellen finden Sie unter Verwenden der Ereignistabelle.
Die folgenden Spalten der Ereignistabelle enthalten nützliche Informationen zu den Plattformereignissen:
TIMESTAMP: Zeigt an, wann das Ereignis erfasst wurde.
RESOURCE_ATTRIBUTES: Stellt ein JSON-Objekt mit Metadaten zur Quelle des Ereignisses bereit, z. B. ein Service, ein Container oder ein Computepool. Das folgende Beispiel für einen -Wert in der
resource_attribute
-Spalte identifiziert einen bestimmten Service, für den das Ereignis erfasst wird.{ "snow.compute_pool.name": "TUTORIAL_COMPUTE_POOL", "snow.compute_pool.id": 123, "snow.database.name": "TUTORIAL_DB", "snow.database.id": 456, "snow.schema.name": "DATA_SCHEMA", "snow.schema.id": 789, "snow.service.container.name": "echo", "snow.service.name": "ECHO_SERVICE2", "snow.service.id": 212, "snow.service.type": "Service" }
SCOPE: Gibt den Ursprung des Ereignisses an. Bei Plattformereignissen lautet der Name des Bereichs
snow.spcs.platform
, wie im folgenden Beispiel gezeigt:{ "name": "snow.spcs.platform" }
RECORD_TYPE: Für Plattformereignisse ist EVENT der RECORD_TYPE.
RECORD: Stellt Metadaten zu dem jeweiligen Ereignis bereit. Die folgenden Metadaten zeigen den Namen und den Schweregrad des Plattformereignisses:
{ "name": "CONTAINER.STATUS_CHANGE", "severity_text": "INFO" }
VALUE: Liefert die Details zum Ereignis. Das folgende Beispiel zeigt den Status und eine Nachricht über den Status des Containers:
{ "message": "Running", "status": "READY" }
Unterstützte Ereignisse¶
Derzeit unterstützt Snowflake nur die Ereignisse zur Änderung des Containerstatus.
In der folgenden Tabelle sind die Plattformereignisse aufgeführt, die Snowflake aufzeichnet. RECORD
und VALUE
in den Spaltennamen beziehen sich auf die Spalten in der Ereignistabelle (im vorangegangenen Abschnitt erläutert).
RECORD:name |
RECORD:severity_text |
VALUE:message |
VALUE:status |
---|---|---|---|
CONTAINER.STATUS_CHANGE |
INFO |
In Ausführung |
READY |
CONTAINER.STATUS_CHANGE |
INFO |
Der Bereitschaftstest schlägt fehl bei Pfad: <path>, Port: <port> |
PENDING |
CONTAINER.STATUS_CHANGE |
INFO |
Warten auf Start |
PENDING |
CONTAINER.STATUS_CHANGE |
INFO |
Computepool-Knoten werden bereitgestellt |
PENDING |
CONTAINER.STATUS_CHANGE |
ERROR |
Abrufen von Bild fehlgeschlagen |
PENDING |
CONTAINER.STATUS_CHANGE |
ERROR |
Der angegebene Bildname verwendet ein ungültiges Format |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Schwerwiegender Fehler, erneuter Versuch |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Schwerwiegender Fehler |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Schwerwiegender Fehler während der Ausführung, Containerprotokolle überprüfen |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Container war OOMKilled aufgrund der Ressourcennutzung |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Fehler in der Benutzeranwendung, Containerprotokolle überprüfen |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Schwerwiegender Fehler beim Starten des Containers |
FAILED |
CONTAINER.STATUS_CHANGE |
INFO |
Erfolgreich abgeschlossen |
DONE |
Richtlinien und Einschränkungen¶
Der maximale Durchsatz für Protokolle, die in die Ereignistabelle pro Knoten aufgenommen werden, beträgt 1 MB/Sekunde für Snowflake-Konten auf AWS und Azure.
Der maximale kombinierte Durchsatz für Metriken und Ablaufverfolgungen, die in die Ereignistabelle aufgenommen werden, beträgt 1 MB/Sekunde pro Knoten sowohl für Azure als auch für AWS.
Die maximale Datensatzgröße für Protokolle, die in die Ereignistabelle aufgenommen werden, beträgt 16 KiB.