Snowpark Container Services: Monitoring Services

コンテナーログへのアクセス

Snowflakeは、アプリケーションコンテナーが標準出力や標準エラーに出力するものをすべて収集します。コードがサービスのデバッグに有用な情報を出力するようにしてください。

Snowflakeは、これらのサービス(ジョブサービスを含む)のコンテナログにアクセスする2つの方法を提供します。

SYSTEM$GET_SERVICE_LOGS の使用

ユーザーは、取得するサービス名、インスタンス ID、コンテナー名、またオプションで最新のログ行数を提供します。サービスインスタンスが1つしか実行されていない場合、サービスインスタンス ID は0になります。たとえば、次のステートメント コマンドは、 echo_service という名前のサービスのインスタンス0に属する echo という名前のコンテナーのログから、後続の10行を取得します。

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

出力例:

+--------------------------------------------------------------------------+
| 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;
Copy

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"
    }
    
    Copy
  • RECORD_ATTRIBUTES: Snowflakeサービスの場合は、エラーソース(標準出力または標準エラー)を識別します。

    { "log.iostream": "stdout" }
    
    Copy
  • 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>
    - ...
Copy

ここで、各 group N は、 事前に定義された、関心のあるメトリクス・グループ を指します(例えば、 systemnetworkstorage)。詳細については、サービス仕様書の 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;
Copy

アカウントのアクティブ・イベント・テーブルの名前がわからない場合は、 SHOW PARAMETERS コマンドを実行し、アカウント・レベル EVENT_TABLE パラメーターの値を表示します。

SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
Copy

イベントテーブルの詳細については、 イベントテーブルの使用 をご参照ください。

以下の手順に従って、アカウント用に構成されたイベントテーブルにメトリクスを記録するサービス例を作成します。

  1. チュートリアル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;
    
    Copy
  2. サービスが実行されると、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;
    
    Copy

コンピューティングプールメトリクスへのアクセス

コンピューティング・プール メトリクスは、コンピューティング・プール内のノードとその上で実行されているサービスに関する洞察を提供します。各ノードは、コンテナー用に利用可能なメモリ量などのノード固有のメトリクスや、個々のコンテナーによるメモリ使用量などのサービス・メトリクスを報告します。コンピューティング・プールのメトリクスは、ノードの視点からの情報を提供します。

各ノードには、 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秒あたりの書き込み操作。