Snowpark Container Services: Monitoring Services¶
コンテナーログへのアクセス¶
Snowflakeは、アプリケーションコンテナーが標準出力や標準エラーに出力するものをすべて収集します。コードがサービスのデバッグに有用な情報を出力するようにしてください。
Snowflakeは、これらのサービス(ジョブサービスを含む)のコンテナログにアクセスする2つの方法を提供します。
SYSTEM$GET_SERVICE_LOGS システム関数の使用: 特定のコンテナーからログにアクセスできます。コンテナーが終了した後も、しばらくはシステム関数を使用してログにアクセスできます。システム関数は、開発中やテスト中、サービスやジョブを最初に作成する場合に最も役に立ちます。詳細については、 SYSTEM$GET_SERVICE_LOGS をご参照ください。
イベント・テーブルの使用: アカウントのイベント・テーブルを使用すると、 その仕様でログ収集が有効になっているサービスの複数のコンテナーからログにアクセスできるようになります 。Snowflakeは、後でアクセスできるようにイベントテーブルにログを永続化します。イベントテーブルは、サービスやジョブのレトロスペクティブな分析に最適です。詳細については、 イベントテーブルの使用 をご参照ください。
SYSTEM$GET_SERVICE_LOGS の使用¶
ユーザーは、取得するサービス名、インスタンス ID、コンテナー名、またオプションで最新のログ行数を提供します。サービスインスタンスが1つしか実行されていない場合、サービスインスタンス ID は0になります。たとえば、次のステートメント コマンドは、 echo_service
という名前のサービスのインスタンス0に属する echo
という名前のコンテナーのログから、後続の10行を取得します。
SELECT SYSTEM$GET_SERVICE_LOGS('echo_service', '0', 'echo', 10);
出力例:
+--------------------------------------------------------------------------+
| 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
関数を呼び出すために必要なサービスに関する情報(インスタンス ID やコンテナー名など)を持っていない場合は、まず SHOW SERVICE CONTAINERS IN SERVICE コマンドを実行して、各インスタンスで実行されているサービス・インスタンスとコンテナーに関する情報を取得することができます。
The SYSTEM$GET_SERVICE_LOGS 関数には以下の制限があります。
標準出力と標準エラーのストリームをマージします。この関数は、出力がどのストリームから来たかを示すことはできません。
単一のサービスインスタンスで、特定のコンテナーのキャプチャデータを報告する。
実行中のコンテナーのログのみを報告する。関数は、再起動された以前のコンテナーや、停止または削除されたサービスのコンテナーからログをフェッチすることはできない。
関数は100 KB までのデータを返す。
イベントテーブルの使用¶
Snowflake は、コンテナーから標準出力および標準エラーストリームに送信されたログを、アカウント用に設定されたイベントテーブルに取り込むことができます。イベントテーブルの設定については、 ロギング、トレース、メトリクス をご参照ください。
サービス仕様ファイルの spec.logExporters field を使用して、イベントテーブルに収集するストリーム(すべて、標準エラーのみ、あるいはなし)を制御します。
そして、イベント・テーブルにイベントをクエリすることができます。たとえば、次の SELECT クエリは、過去1時間に記録されたSnowflakeサービスとジョブイベントを取得します。
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は、この例に示すように、イベントテーブルクエリの WHERE 句にタイムスタンプを含めることを推奨します。さまざまなSnowflakeコンポーネントによって生成される潜在的データ量のため、これは特に重要です。フィルターを適用すると、より小さなデータのサブセットを取得することができ、クエリのパフォーマンスが向上します。
イベントテーブルには以下の列があり、Snowflakeがコンテナーから収集したログに関する有用な情報を提供します。
TIMESTAMP: Snowflakeがいつログを収集したかを示します。
RESOURCE_ATTRIBUTES: ログメッセージを生成した Snowflake サービスとサービス内のコンテナーを識別する JSON オブジェクトを提供します。たとえば、サービスの実行時に指定されたサービス名、コンテナー名、コンピューティングプール名などの詳細を提供します。
{ "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: Snowflakeサービスの場合は、エラーソース(標準出力または標準エラー)を識別します。
{ "log.iostream": "stdout" }
VALUE: 標準出力と標準エラーは行に分割され、各行はイベントテーブルに記録を生成します。
"echo-service [2023-10-23 17:52:27,429] [DEBUG] Sending response: {'data': [[0, 'Joe said hello!']]}"
メトリクスへのアクセス¶
Snowflakeは、アカウント内の コンピューティングプール 、それらのコンピューティングプール上で実行されている サービス のメトリクスを提供します。Snowflakeが提供するこれらのメトリクスは、プラットフォーム・メトリクスとも呼ばれます。
イベント・テーブル・サービスのメトリクス: 個々のサービスがメトリクスを公開しています。これらは、サービスに固有の情報を提供するコンピューティング・プール・メトリクスのサブセットです。このユースケースのターゲットは、特定のサービスのリソース使用率を観察することです。サービス仕様では、サービス実行中にSnowflakeにイベントテーブルに記録させたいメトリクスを定義します。
コンピューティング・プールのメトリクス: 各コンピューティング・プールは、そのコンピューティング・プール内で何が起こっているかについての情報を提供するメトリクスも公開しています。このユースケースは、コンピューティングプールの使用率を観察することが目的です。コンピューティング・プールのメトリクスにアクセスするには、Prometheus互換の API 、コンピューティング・プールが公開しているメトリクスをポーリングするサービスを書く必要があります。
イベント・テーブル・サービスのメトリクスへのアクセス¶
サービスからのメトリクスをアカウント用に構成されたイベント・テーブルにログに記録するには、サービス仕様に以下のセクションを含めます。
platformMonitor:
metricConfig:
groups:
- <group 1>
- <group 2>
- ...
ここで、各 group N
は、 事前に定義された、関心のあるメトリクス・グループ を指します(例えば、 system
、 network
、 storage
)。詳細については、サービス仕様書の spec.platformMonitor field セクションをご参照ください。
サービスの実行中、Snowflakeはこれらのメトリクスをアカウントのイベントテーブルに記録します。イベント・テーブルをクエリして、メトリクスを読み取ることができます。次のクエリは、 my_service
サービスに対して過去 1 時間に記録されたサービス・メトリクスを検索します。
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;
アカウントのアクティブ・イベント・テーブルの名前がわからない場合は、 SHOW PARAMETERS コマンドを実行し、アカウント・レベル EVENT_TABLE パラメーターの値を表示します。
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
イベントテーブルの詳細については、 イベントテーブルの使用 をご参照ください。
例
以下の手順に従って、アカウント用に構成されたイベントテーブルにメトリクスを記録するサービス例を作成します。
チュートリアル1 に従って、
echo_service
という名前のサービスを作成します。サービスを作成するステップ3で、以下の CREATE SERVICE コマンドを使用し、変更したサービス仕様にplatformMonitor
フィールドを追加します。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;
サービスが実行されると、Snowflakeは指定されたメトリクスグループのメトリクスをイベントテーブルに記録し始め、クエリできるようになります。次のクエリは、Echo サービスによって過去 1 時間に報告されたメトリクスを取得します。
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;
コンピューティングプールメトリクスへのアクセス¶
コンピューティング・プール メトリクスは、コンピューティング・プール内のノードとその上で実行されているサービスに関する洞察を提供します。各ノードは、コンテナー用に利用可能なメモリ量などのノード固有のメトリクスや、個々のコンテナーによるメモリ使用量などのサービス・メトリクスを報告します。コンピューティング・プールのメトリクスは、ノードの視点からの情報を提供します。
各ノードには、 TCP ポート 9001 でリッスンするメトリクス・パブリッシャーがあります。他のサービスは、ノードのポート9001にパス /metrics
を使って HTTP GET リクエストを出すことができます。ノードの IP アドレスを発見するには、 discover.monitor.compute_pool_name.snowflakecomputing.internal
ホスト名について DNS から SRV 記録(またはA記録)を取得します。次に、各ノードをアクティブにポーリングしてメトリクスを取得する別のサービスをアカウントに作成します。
応答の本文では、以下のメトリクス例に示すように、 Prometheus形式 を使用してメトリクスを提供します。
# 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
次の点に注意してください。
各メトリクスは、
# HELP
と# TYPE
で始まり、短い説明とメトリクスの型を提供します。この例では、node_memory_capacity
メトリクスはgauge
型です。その後に、メトリクスの名前、特定のリソース(データポイント)を説明するラベルのリスト、およびその値が続きます。この例では、メトリクス(名前は
node_memory_capacity
)がメモリ情報を提供し、ノードには使用可能なメモリが7.2 GB あることを示しています。メトリクスには、図のようなラベル形式のメタデータも含まれます。snow_compute_pool_name="MY_POOL", snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"
これらのメトリクスは、どのような形で処理しても構いません。たとえば、メトリクスをデータベースに格納し、 UI (Grafana ダッシュボードのような)を使用して情報を表示することができます。
注釈
Snowflakeはメトリクスの集計を提供しません。例えば、あるサービスのメトリクスを取得するには、そのサービスのインスタンスを実行しているすべてのノードにクエリする必要があります。
コンピューティングプールメトリクスにアクセスするには、コンピューティングプールに DNSと互換性のある名前が必要です。
コンピューティングプールによって公開されるエンドポイントには、コンピューティングプールの OWNERSHIP または MONITOR 権限を持つロールのみがアクセスできます。
利用可能なコンピューティングプールメトリクスのリストについては、 利用可能なプラットフォーム・メトリクス をご参照ください。
例
Prometheusがコンピューティング・プールにメトリクスをポーリングするように設定する例については、 コンピューティングプール・メトリクス・チュートリアル をご参照ください。
利用可能なプラットフォーム・メトリクス¶
以下は、使用可能なプラットフォーム・メトリクス・グループと、各グループ内のメトリクスの一覧です。ストレージ
メトリクスは現在、ブロック・ストレージ・ボリュームからのみ収集されることにご注意ください。
メトリックグループ . メトリック名 |
単位 |
型 |
説明 |
---|---|---|---|
system . container.cpu.usage |
CPUコア |
gauges |
前回の測定以降に使用された CPU コアの平均数。1.0は、 CPU 1コアをフルに使用することを示しています。最大値はコンテナーで使用可能なCPUコア数です。 |
system . container.memory.usage |
bytes |
ゲージ |
バイト単位の使用メモリ。 |
system . container.gpu.memory.usage |
bytes |
ゲージ |
GPU ごとに使用されるメモリ。バイト単位。ソース GPU は「gpu」属性で示されます。 |
system . container.gpu.utilization |
比率 |
ゲージ |
GPU ごとの比率、容量に対する使用量の割合。ソース GPU は「gpu」属性で示されます。 |
system_limits . container.cpu.limit |
CPUコア |
ゲージ |
サービス仕様書からの CPU リソース制限。制限が定義されていない場合、デフォルトはノードの容量になります。 |
system_limits . container.gpu.limit |
gpus |
ゲージ |
サービス仕様書からの GPU カウント制限。リミットが定義されていない場合、メトリックは出力されません。 |
system_limits . container.memory.limit |
bytes |
ゲージ |
サービス仕様からのメモリ制限。制限が定義されていない場合、デフォルトはノードの容量になります。 |
system_limits . container.cpu.requested |
CPUコア |
ゲージ |
サービス仕様からの CPU リソース要求。制限が定義されていない場合、デフォルトでSnowflakeが選択した値になります。 |
system_limits . container.gpu.requested |
gpus |
ゲージ |
サービス仕様書からの GPU カウント。リミットが定義されていない場合、メトリックは出力されません。 |
system_limits . container.memory.requested |
bytes |
ゲージ |
サービス仕様からのメモリ要求。制限が定義されていない場合、デフォルトでSnowflakeが選択した値になります。 |
system_limits . container.gpu.memory.capacity |
bytes |
ゲージ |
GPU ごとのメモリ容量。ソース GPU は「gpu」属性で示されます。 |
status . container.restarts |
リスタート |
ゲージ |
Snowflakeがコンテナを再起動した回数。 |
status . container.state.finished |
boolean |
ゲージ |
コンテナーが「finished」ステートにあるとき、このメトリックスは値1で放出されます。 |
status . container.state.last.finished.reason |
boolean |
ゲージ |
コンテナーが以前に再起動したことがある場合、このメトリクスは値 1 で出力されます。「理由」ラベルには、そのコンテナーが最後に終了した理由が記載されています。 |
status . ontainer.state.last.finished.exitcode |
整数 |
ゲージ |
コンテナーが以前に再起動したことがある場合、このメトリクスには前回の実行時の終了コードが含まれます。 |
status . container.state.pending |
boolean |
ゲージ |
コンテナーが「pending」状態にあるとき、この指標は値1で発せられます。 |
status . container.state.pending.reason |
boolean |
ゲージ |
コンテナーが「pending」状態にあるとき、このメトリクスは値を1として発行されます。「理由」ラベルは、コンテナーが直近で保留状態にあった理由を示します。 |
status . container.state.running |
boolean |
ゲージ |
コンテナーが「running」状態にあるとき、このメトリクスの値は1になります。 |
status . container.state.started |
boolean |
ゲージ |
コンテナーが「started」状態にあるとき、このメトリクスの値は1になります。 |
ネットワーク . network.egress.denied.packets |
パケット |
ゲージ |
ポリシー検証の失敗により拒否されたネットワークエグレスのパケットの合計。 |
ネットワーク . network.egress.received.bytes |
bytes |
ゲージ |
リモート宛先から受信したネットワークエグレスの合計バイト数。 |
ネットワーク . network.egress.received.packets |
パケット |
ゲージ |
リモート宛先から受信したネットワークエグレスのパケットの合計。 |
ネットワーク . network.egress.transmitted.bytes |
バイト |
ゲージ |
リモート宛先に送信されたネットワークエグレスのパケットの合計。 |
ネットワーク . network.egress.transmitted.packets |
パケット |
ゲージ |
リモート宛先に送信されたネットワークエグレスのパケットの合計。 |
storage . volume.capacity |
bytes |
ゲージ |
ファイルシステムのサイズ。 |
storage . volume.io.inflight |
操作 |
ゲージ |
アクティブなファイルシステムI/O操作の数。 |
storage . volume.read.throughput |
バイト/秒 |
ゲージ |
ファイルシステムの読み取りスループット(バイト/秒)。 |
storage . volume.read.iops |
操作/秒 |
ゲージ |
1秒あたりのファイルシステム読み取り操作。 |
storage . volume.usage |
bytes |
ゲージ |
ファイルシステムで使用されている総バイト数。 |
storage . volume.write.throughput |
バイト/秒 |
ゲージ |
ファイルシステムの書き込みスループット(バイト/秒)。 |
storage . volume.write.iops |
操作/秒 |
ゲージ |
ファイルシステムの1秒あたりの書き込み操作。 |