Snowpark Container Services:Monitoring Services¶
コンテナログへのアクセス¶
Snowflakeは、アプリケーションコンテナーが標準出力や標準エラーに出力するものをすべて収集します。コードが、後でサービスのデバッグに使用できる有用な情報を出力するようにします。
明示的にオプトアウトしない限り、Snowflakeは後でアクセスできるようにイベントテーブルにコンテナログを永続化します。詳細については、 ログコレクションを構成する をご参照ください。イベントテーブルにログを保存すると、サービスとジョブを遡及的に分析できるようになります。詳細については、 イベントテーブルの使用 をご参照ください。
現在、次のオプションを使用してコンテナログにアクセスできます。
サービスヘルパーメソッドを使用する: <service-name>!SPCS_GET_LOGS 関数の使用 テーブル関数を呼び出して、Snowflakeによってイベントテーブルに収集された、指定されたサービスまたはジョブのコンテナログを取得することをお勧めします。
イベントテーブルを直接使用する: イベントテーブルに対するフルアクセス権がある場合は、イベントテーブルに直接クエリして履歴ログを取得できます。
** SYSTEM$GET_SERVICE_LOGS システム関数を使用する:** SYSTEM$GET_SERVICE_LOGS を呼び出して現在実行中のサービスまたはジョブコンテナのログを取得します。
<service-name>!SPCS_GET_LOGS 関数の使用¶
<service_name>!SPCS_GET_LOGS テーブル関数は、指定されたジョブのコンテナからログを返します。これらのログはSnowflakeによって収集され、イベントテーブルに格納されます。
次のリストでは、このテーブル関数を使用する利点について説明します。
特定のサービスのログを取得できます。
指定した時間範囲内のログを取得できます。
呼び出し元はイベントテーブル全体にアクセスする必要がありません。これは、情報セキュリティ要件が厳しい顧客にとって有益です。現在のセッションにサービス所有者ロールが含まれている場合、サービス所有者はこれらのログにアクセスできます。
service_name
には、サービスの名前を指定します。関数は、そのサービスのコンテナから収集したSnowflakeのログを返します(コンテナログへのアクセス を参照)。
オプションで日付範囲を指定できます。デフォルトでは、関数は1日のログを返します。たとえば、クエリが、Snowflakeが過去1日間の my_test_job
ジョブのコンテナから収集したログを取得しました(これがデフォルトです)。
SELECT * FROM TABLE(my_test_job!SPCS_GET_LOGS());出力例:
+-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+ | 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" | | | | | | } | +-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+
このメソッドの呼び出しの詳細については、 <service_name>!SPCS_GET_LOGS をご参照ください。
イベントテーブルの使用¶
Snowflake は、コンテナーから標準出力および標準エラーストリームに送信されたログを、アカウント用に設定されたイベントテーブルに取り込むことができます。イベントテーブルの設定については、 ロギング、トレース、メトリクス をご参照ください。
サービス仕様ファイルの spec.logExporters field を使用して、イベントテーブルに収集するストリーム(すべて、標準エラーのみ、あるいはなし)を制御します。
そして、イベント・テーブルにイベントをクエリすることができます。アカウントのアクティブなイベントテーブルを見つけるには、 SHOW PARAMETERS コマンドを使用して、 EVENT_TABLE パラメーターの値を確認します。
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
パラメーターは、アカウントのアクティブイベントテーブルを指定します。
次に、そのイベントテーブルをクエリします。次の 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!']]}"
SYSTEM$GET_SERVICE_LOGS の使用¶
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は、アカウント内の コンピューティングプール 、それらのコンピューティングプール上で実行されている サービス のメトリクスを提供します。Snowflakeが提供するこれらのメトリクスは、プラットフォーム・メトリクスとも呼ばれます。
イベント・テーブル・サービスのメトリクス: 個々のサービスがメトリクスを公開しています。これらは、サービスに固有の情報を提供するコンピューティング・プール・メトリクスのサブセットです。このユースケースのターゲットは、特定のサービスのリソース使用率を観察することです。サービス仕様では、サービス実行中にSnowflakeにイベントテーブルに記録させたいメトリクスを定義します。
コンピューティング・プールのメトリクス: 各コンピューティング・プールは、そのコンピューティング・プール内で何が起こっているかについての情報を提供するメトリクスも公開しています。このユースケースは、コンピューティングプールの使用率を観察することが目的です。コンピューティング・プールのメトリクスにアクセスするには、Prometheus互換の API 、コンピューティング・プールが公開しているメトリクスをポーリングするサービスを書く必要があります。
イベント・テーブル・サービスのメトリクスへのアクセス¶
サービスからのメトリクスをアカウント用に構成されたイベント・テーブルにログに記録するには、サービス仕様に以下のセクションを含めます。
platformMonitor:
metricConfig:
groups:
- <group 1>
- <group 2>
- ...
ここで、各 group N
は、関心のある 事前に定義されたメトリックグループ を指します(例えば、 system
、 network
、 storage
)。詳細については、サービス仕様書の spec.platformMonitor field セクションをご参照ください。
サービスの実行中、Snowflakeはこれらのメトリクスをアカウントのイベントテーブルに記録します。これらのメトリックは次のような方法で読むことができます。
サービスヘルパーメソッドの使用: <service_name>!SPCS_GET_METRICS テーブル関数は、指定されたサービス用にSnowflakeが収集したメトリックを返します。次のリストは、このテーブル関数を使用する利点を説明しています。
特定のサービスのメトリックを取得できます。
指定した時間範囲内のメトリックを取得できます。
呼び出し元はイベントテーブル全体にアクセスする必要がありません。これは、情報セキュリティ要件が厳しい顧客にとって有益です。
次の SELECT ステートメントは、テーブル関数を使用して過去1時間に記録された指定サービスのプラットフォームイベントを取得します。
SELECT * FROM TABLE(echo_service!SPCS_GET_METRICS(start_time => dateadd('hour', -1, current_timestamp())));
イベントテーブルを直接クエリする: イベントテーブルをクエリして、メトリックを読み取ることができます。次のクエリは、
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 の手順に従って、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は指定されたメトリックグループのメトリックをイベントテーブルに記録し始めます。
<service_name>!SPCS_GET_METRICS 関数を呼び出しすか、イベントテーブルをクエリしてメトリックにアクセスします。たとえば、echo_serviceサービスによって過去1時間にレポートされたメトリックを取得します。
<service_name>!SPCS_GET_METRICS ヘルパー関数を使用します。
SELECT * FROM TABLE(echo_service!SPCS_GET_METRICS(START_TIME => DATEADD('hour', -1, CURRENT_TIMESTAMP())));
イベントテーブルを直接クエリします。
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;
コンピューティングプールメトリックへのアクセス¶
コンピューティング・プール メトリクスは、コンピューティング・プール内のノードとその上で実行されているサービスに関する洞察を提供します。各ノードは、コンテナー用に利用可能なメモリ量などのノード固有のメトリクスや、個々のコンテナーによるメモリ使用量などのサービス・メトリクスを報告します。コンピューティング・プールのメトリクスは、ノードの視点からの情報を提供します。
各ノードには、 TCP ポート 9001 でリッスンするメトリクス・パブリッシャーがあります。他のサービスは、ノードのポート9001にパス /metrics
を使って HTTP GET リクエストを出すことができます。ノードの IP アドレスを発見するには、 discover.monitor.compute_pool_name.cp.spcs.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 |
gauge |
バイト単位の使用メモリ。 |
system . container.gpu.memory.usage |
bytes |
gauge |
GPU ごとに使用されるメモリ。バイト単位。ソース GPU は「gpu」属性で示されます。 |
system . container.gpu.utilization |
ratio |
gauge |
GPU ごとの比率、容量に対する使用量の割合。ソース GPU は「gpu」属性で示されます。 |
system_limits . container.cpu.limit |
CPUコア |
gauge |
サービス仕様書からの CPU リソース制限。制限が定義されていない場合、デフォルトはノードの容量になります。 |
system_limits . container.gpu.limit |
gpus |
gauge |
サービス仕様書からの GPU カウント制限。リミットが定義されていない場合、メトリックは出力されません。 |
system_limits . container.memory.limit |
bytes |
gauge |
サービス仕様からのメモリ制限。制限が定義されていない場合、デフォルトはノードの容量になります。 |
system_limits . container.cpu.requested |
CPUコア |
gauge |
サービス仕様からの CPU リソース要求。制限が定義されていない場合、デフォルトでSnowflakeが選択した値になります。 |
system_limits . container.gpu.requested |
gpus |
gauge |
サービス仕様書からの GPU カウント。リミットが定義されていない場合、メトリックは出力されません。 |
system_limits . container.memory.requested |
bytes |
gauge |
サービス仕様からのメモリ要求。制限が定義されていない場合、デフォルトでSnowflakeが選択した値になります。 |
system_limits . container.gpu.memory.capacity |
bytes |
gauge |
GPU ごとのメモリ容量。ソース GPU は「gpu」属性で示されます。 |
status . container.restarts |
restarts |
gauge |
Snowflakeがコンテナを再起動した回数。 |
status . container.state.finished |
boolean |
gauge |
コンテナーが「finished」ステートにあるとき、このメトリックスは値1で放出されます。 |
status . container.state.last.finished.reason |
boolean |
gauge |
コンテナーが以前に再起動したことがある場合、このメトリクスは値 1 で出力されます。「理由」ラベルには、そのコンテナーが最後に終了した理由が記載されています。 |
ステータス . container.state.last.finished.exitcode |
integer |
gauge |
コンテナーが以前に再起動したことがある場合、このメトリクスには前回の実行時の終了コードが含まれます。 |
status . container.state.pending |
boolean |
gauge |
コンテナーが「pending」状態にあるとき、この指標は値1で発せられます。 |
status . container.state.pending.reason |
boolean |
gauge |
コンテナーが「pending」状態にあるとき、この指標は値1で発せられます。「理由」ラベルは、コンテナーが直近で保留状態にあった理由を示します。 |
status . container.state.running |
boolean |
gauge |
コンテナーが「running」状態にあるとき、このメトリクスの値は1になります。 |
status . container.state.started |
boolean |
gauge |
コンテナーが「started」状態にあるとき、このメトリクスの値は1になります。 |
ネットワーク . network.egress.denied.packets |
packets |
gauge |
ポリシー検証の失敗により拒否されたネットワークエグレスのパケットの合計。 |
ネットワーク . network.egress.received.bytes |
bytes |
gauge |
リモート宛先から受信したネットワークエグレスの合計バイト数。 |
ネットワーク . network.egress.received.packets |
packets |
gauge |
リモート宛先から受信したネットワークエグレスのパケットの合計。 |
ネットワーク . network.egress.transmitted.bytes |
byte |
gauge |
リモート宛先に送信されたネットワークエグレスのパケットの合計。 |
ネットワーク . network.egress.transmitted.packets |
packets |
gauge |
リモート宛先に送信されたネットワークエグレスのパケットの合計。 |
storage . volume.capacity |
bytes |
gauge |
ファイルシステムのサイズ。 |
storage . volume.io.inflight |
operations |
gauge |
アクティブなファイルシステムI/O操作の数。 |
storage . volume.read.throughput |
バイト/秒 |
gauge |
ファイルシステムの読み取りスループット(バイト/秒)。 |
storage . volume.read.iops |
操作/秒 |
gauge |
1秒あたりのファイルシステム読み取り操作。 |
storage . volume.usage |
bytes |
gauge |
ファイルシステムで使用されている総バイト数。 |
storage . volume.write.throughput |
バイト/秒 |
gauge |
ファイルシステムの書き込みスループット(バイト/秒)。 |
storage . volume.write.iops |
操作/秒 |
gauge |
ファイルシステムの1秒あたりの書き込み操作。 |
アプリケーションメトリックの公開とアクセス¶
アプリケーションメトリックとトレースは、Snowflakeが生成するプラットフォームメトリックとは対照的に、サービスによって生成されます。サービスコンテナーは、 OLTP またはPrometheusメトリックを生成でき、Snowflakeはそれらをアカウント用に構成されたイベントテーブルに公開します。
サービスコンテナーコードが正しい単位、集計、およびインスツルメンテーションタイプでメトリックを出力し、分析に意味のある効果的なメトリックを生成するようにする必要があることに注意してください。
OTLP アプリケーションメトリックとトレースの公開¶
Snowflakeは OTel コレクターを実行し、サービスコンテナーが OTLP アプリケーションメトリックとトレースを公開するために使用できます。つまり、サービスコンテナーは、 OTel コレクターエンドポイントにメトリックをプッシュすることができます。その後、Snowflakeは、元のサービスの詳細とともに、Snowflakeアカウントに構成されたイベントテーブルに書き込みます。
仕組みは次のとおりです。
Snowflakeは、コンテナーがアプリケーションメトリックとトレースを公開できる OTel コレクターエンドポイントを提供するサービスコンテナーの以下の環境変数を自動的に入力します。
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
標準の OTLP クライアント は、これらの環境変数を検索して、 OTel コレクターを自動的に検出します。これにより、サービスコンテナーは、このクライアントを使用してメトリックとトレースを公開できるようになります。
OTLP アプリケーションTrace IDs の構成¶
トレースは、 Snowflake Trail で表示可能で、ルックアップを実行できるように、Snowflake Trace ID 形式を使用する必要があります。
SnowflakeはPythonおよびJavaライブラリを提供し、Trace ID ジェネレーターのセットアップを簡素化します。以下の例では、これらのライブラリを使用して、デフォルトの OpenTelemetry trace ID ジェネレーターをオーバーライドする方法を示します。
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
)
詳細情報については、 PyPI の Snowflake-telemetry-python を参照してください。
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();
com.snowflake.telemetry
のインストールに関する情報については、 テレメトリクラスを使用するためのJavaおよびScala環境の設定 をご覧ください。
Trace ID ジェネレーターは、他のプログラミング言語でも実装することができます。16バイトの ID (ビッグエンディアン)には、最上位4バイトにタイムスタンプが含まれていなければなりません。他のバイトにはランダムビットが含まれていなければなりません。詳細情報については、 Pythonリファレンス実装 をご覧ください。
Prometheusアプリケーションメトリックの公開¶
SnowflakeはPrometheusメトリックをサポートしており、アプリケーションは OTLP メトリックをプッシュする代わりに、Snowflakeが提供するコレクターによってポーリングされるPrometheusメトリックを公開する場合があります。Snowflakeがこれらのアプリケーションメトリックをサービスから収集し、イベントテーブルに公開するには、以下の手順に従います。
Prometheusメトリックを公開するポートでサービスをリッスンしてください。
Snowflakeが提供するコンテナー(「サイドカー」コンテナーとも呼ばれます)をサービスに組み込み、サービスコンテナーからメトリックを取得するために必要な構成を行います。
Prometheusサイドカーは、スケジュールされた頻度でコンテナーからアプリケーションメトリックを取得し、Prometheus形式を OTLP 形式に変換し、メトリックを OTel コレクターにプッシュします。その後、 OTel コレクターは、Snowflakeアカウントに構成されたイベントテーブルにこれらのメトリックを公開します。
注釈
SnowflakeはPrometheus Summary メトリックタイプ をサポートしていません。これは OpenTelemetry で非推奨となっている ためです。代わりにヒストグラムタイプを使用してください。
Prometheusサイドカーコンテナーを別のコンテナーとしてサービス仕様に追加し、コンテナーが公開する HTTP エンドポイントを指定する引数を以下の形式で含めます。
localhost:{PORT}/{METRICS_PATH}, {SCRAPE_FREQUENCY}
サイドカーがメトリックを取得するポート番号、パス、頻度を指定します。
サービス仕様のフラグメントの例は、サイドカーコンテナーがポート8000からサービスコンテナーから1分ごとにメトリックをスクレイピングし、パス「/metrics」からメトリックを取得していることを示しています。
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"
仕様で、
image
はSnowflake提供のサイドカーコンテナーイメージです。args
は、prometheusコンテナーがメトリックをスクレイピングするために必要な構成を提供します。コンテナーが提供するポート8000から。このprometheusコンテナーの構成では、ポートは必須です。
パス「/metrics」を使用しています。オプションです。指定がない場合、「/metrics」がデフォルトパスとなります。
毎分。オプションです。指定がない場合、「1m」がデフォルトとなります。
デフォルトを活用する場合、これはメトリックをスクレイピングするための同等の構成です。
spec: ... args: - "-e" - "localhost:8000"
注釈
Prometheusサイドカーコンテナーは、サービス(ジョブではない)にのみ対応しています。ジョブのアプリケーションメトリックを収集する場合は、 OTel コレクターにメトリックをプッシュする必要があります。
イベントテーブルのアプリケーションメトリックとトレースへのアクセス¶
イベントテーブルをクエリして、アプリケーションメトリックを取得できます。以下のクエリは、過去1時間に収集されたアプリケーションメトリックを取得します。
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;
イベントテーブルの詳細については、 イベントテーブルの概要 をご参照ください。これらのメトリックは、 Snowflakeダッシュボード で可視化できます。
イベントテーブルをクエリしてアプリケーショントレースを表示することもできます。例えば、過去1時間のアプリケーショントレースを取得するには、前述のクエリで record_type
条件を以下のように置き換えます。
AND record_type = 'SPAN' OR record_type = 'SPAN_EVENT'
トレースは、 Snowflake trail ビューアで可視化できます。
メトリックとトレースには、リソース属性と記録属性として、ユーザー定義属性とSnowflake定義属性の両方が含まれます。プレフィックス snow.
はSnowflakeが生成した属性用に予約されています。Snowflakeはこのプレフィックスを使用するカスタム属性を無視します。Snowflakeで定義されている属性のリストについては、 利用可能なプラットフォーム・メトリクス を参照してください。
サンプルコード はPythonとJavaの両方で提供されており、 OTLP SDK を使用したカスタムメトリックとトレースによるアプリケーションのインスツルメンテーションを実演しています。例では、トレース用のSnowflake trailビューアとの互換性のために、Snowflake Trace ID の生成を構成する方法を示します。
プラットフォームイベントへのアクセス¶
Snowflakeは、サービスのステータスと履歴を可視化するイベントを記録します。Snowflakeが提供するこれらのイベントは、プラットフォームイベント と呼ばれます。
例えば、サービスコンテナが現在実行中で、致命的なエラー(メモリ不足の状態など)が原因で1日前に再起動された場合、プラットフォームイベントを使用してこの履歴イベントを表示することができます。
Snowflakeは、これらのプラットフォームイベントをアカウント内の イベントテーブル でログします。デフォルトでは、プラットフォームイベントはログに記録されません。プラットフォームイベントのログを有効にするには、リソース作成時に(例: CREATESERVICE の実行時など) LOG_LEVEL パラメーターを設定するか、 ALTER ステートメントを使用して既存のリソースのログレベルを更新します。
注釈
LOG_LEVEL パラメーターがリソースレベルで設定されていない場合、Snowflakeはより高いレベルで設定されたパラメーターの値を継承できます。サービスの場合、Snowflakeはスキーマ、データベース、またはサービスのアカウントに設定される LOG_LEVEL パラメーターの値を継承できます。詳細については、 Snowflakeが有効レベルを決定する方法 をご参照ください。
SHOWPARAMETERS... INSERVICE を実行すると、サービスに設定されている現在のログレベルを確認できます。
SHOW PARAMETERS LIKE 'LOG_LEVEL' IN SERVICE mydb.myschema.myservice;
LOG_LEVEL パラメーターの値は、イベントテーブルに記録するイベントの重大度を決定します。現在の実装では、サポートされている LOG_LEVEL 値は INFO
および ERROR
です。
イベントテーブル内の ERROR イベントのみを記録する場合、 LOG_LEVEL を
ERROR
に設定します。INFO
およびERROR
イベントをイベントテーブルに記録する場合は、 LOG_LEVEL をINFO
に設定します。イベントテーブルへのプラットフォームイベントの記録を停止する場合は、 LOG_LEVEL を
OFF
に設定します。
詳細については、 テレメトリーレベルの設定 をご参照ください。
クエリプラットフォームイベント¶
リソースのログレベルを構成すると、SnowflakeはプラットフォームイベントをSnowflakeアカウントのアクティブなイベントテーブルに記録します。これらのイベントには以下の方法でアクセスできます。
サービスヘルパーメソッドの使用: <service_name>!SPCS_GET_EVENTS テーブル関数は、指定されたサービスのコンテナからSnowflakeが収集したイベントを返します。
次のリストでは、このテーブル関数を使用する利点について説明します。
特定のサービスのイベントを取得できます。
指定された時間範囲内のイベントを取得できます。
呼び出し元はイベントテーブル全体にアクセスする必要がありません。これは、情報セキュリティ要件が厳しい顧客にとって有益です。
次の SELECT ステートメントは、テーブル関数を使用して、過去1時間に記録された指定サービスのプラットフォームイベントを取得します。
SELECT * FROM TABLE(echo_service!SPCS_GET_EVENTS(START_TIME => DATEADD('hour', -1, CURRENT_TIMESTAMP())));
**イベントテーブルを直接使用する: ** イベントテーブルを直接クエリできます。アカウントのアクティブなイベントテーブルを見つけるには、 SHOW PARAMETERS コマンドを使用して、 EVENT_TABLE パラメーターの値を確認します。
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
パラメーターは、アカウントのアクティブイベントテーブルを指定します。
次に、そのイベントテーブルをクエリします。次の SELECT ステートメントは、過去1時間に記録された、指定されたサービスのプラットフォームイベントを取得します。
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;
イベントテーブルの詳細については、 イベントテーブルの使用 をご参照ください。
イベントテーブルの次の列は、プラットフォームイベントに関する有用な情報を提供します。
TIMESTAMP: イベントがいつ記録されたかを示します。
**RESOURCE_ATTRIBUTES:**サービス、コンテナ、コンピューティングプールなど、イベントソースに関するメタデータを含む JSON オブジェクトを提供します。次の
resource_attribute
列の値の例では、イベントが記録される特定のサービスを識別します{ "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: イベントの基点を示します。プラットフォームイベントの場合、次の例に示すようにスコープの名前は
snow.spcs.platform
になります{ "name": "snow.spcs.platform" }
RECORD_TYPE: プラットフォームイベントの場合 EVENT は RECORD_TYPE です。
RECORD: 特定のイベントに関するメタデータを提供します。次のメタデータは、プラットフォームイベントの名前と重大度レベルを示します。
{ "name": "CONTAINER.STATUS_CHANGE", "severity_text": "INFO" }
VALUE: イベントの詳細を提供します。次の例は、ステータスと、コンテナのステータスに関するメッセージを示しています。
{ "message": "Running", "status": "READY" }
サポートされているイベント¶
現在Snowflakeはコンテナステータス変更イベントのみをサポートしています。
次のテーブルは、Snowflakeが記録するプラットフォームイベントのリストです。列名の RECORD
および VALUE
は、イベントテーブルの列を指します(前のセクションで説明)。
RECORD:名前 |
RECORD:severity_text |
VALUE:メッセージ |
VALUE:ステータス |
---|---|---|---|
CONTAINER.STATUS_CHANGE |
INFO |
実行 |
READY |
CONTAINER.STATUS_CHANGE |
INFO |
準備プローブがパス: <path>ポート: <port>で失敗しています |
PENDING |
CONTAINER.STATUS_CHANGE |
INFO |
開始待ち |
PENDING |
CONTAINER.STATUS_CHANGE |
INFO |
コンピューティングプールノードをプロビジョニングしています |
PENDING |
CONTAINER.STATUS_CHANGE |
ERROR |
画像のプルに失敗しました |
PENDING |
CONTAINER.STATUS_CHANGE |
ERROR |
提供された画像名が無効な形式を使用しています |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
致命的エラーが発生しました。再試行中 |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
致命的エラーが発生しました |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
実行中に致命的なエラーが発生しました。コンテナログを確認してください |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
コンテナはリソースの使用状況により OOMKilled でした |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
ユーザーアプリケーションエラーが発生しました。コンテナログを確認してください |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
コンテナの起動中に致命的エラーが発生しました |
FAILED |
CONTAINER.STATUS_CHANGE |
INFO |
正常に完了しました |
DONE |
ガイドラインと制約¶
ノードごとにイベントテーブルに取り込まれるログの最大スループットは、 AWS およびAzure上のSnowflakeアカウントの場合、1 MB/秒です。
イベントテーブルに取り込まれるメトリックとトレースの最大合計スループットは、Azureと AWS の両方で、ノードあたり1 MB/秒です。
イベントテーブルに取り込まれるログの最大記録サイズは16 KiB です。