Pythonでのトレースイベントの出力¶
Snowflake telemetry パッケージを使用すると、Pythonで記述された関数またはプロシージャハンドラーからトレースイベントを出力できます。このパッケージは、 Anaconda Snowflakeチャネル から入手できます。
イベントテーブルで SELECT コマンドを実行すると、格納されたトレースイベントデータにアクセスできます。詳細については、 トレースデータの表示 をご参照ください。
注釈
トレースイベントを追加する際に留意すべきガイドラインについては、 トレースイベントを追加するための一般的なガイドライン をご参照ください。
Snowflakeでのログの設定とメッセージの取得に関する一般的な情報については、 関数とプロシージャからのメッセージのログ をご参照ください。
コードからログする前に、次を実行する必要があります。
ハンドラーコードからログされたメッセージを収集するイベントテーブルを設定します。
詳細については、 イベントテーブルの概要 をご参照ください。
必要なデータがイベントテーブルに格納されるようにトレースレベルが設定されていることを確認してください。
詳細については、 ロギング、メトリクス、トレースのレベル設定 をご参照ください。
注釈
トレースイベントを追加する際に留意すべきガイドラインについては、 トレースイベントを追加するための一般的なガイドライン をご参照ください。
テレメトリパッケージのサポートの追加¶
テレメトリパッケージを使用するには、Snowflakeに含まれるオープンソースの Snowflakeテレメトリパッケージ をハンドラーコードで利用できるようにする必要があります。このパッケージは、 Anaconda Snowflakeチャネル から入手できます。
デフォルトでは、ストアドプロシージャや関数のPythonハンドラーを作成するときに、テレメトリパッケージが含まれます。ただし、特定のパッケージを明示的に許可または禁止するパッケージポリシーを指定している場合、Snowflakeは snowflake-telemetry-python パッケージを自動的に含めません。この場合は、 PACKAGES 句でパッケージを指定する必要があります。
Streamlitアプリの場合。 Snowsight または
environment.yml.ファイルを使用して、snowflake-telemetry-pythonパッケージをアプリに追加できます。次の例のコードでは、 PACKAGES 句を使用してTelemetryパッケージとSnowparkライブラリ(Pythonで記述されたストアドプロシージャに必要です。詳細については、 SQL と Python を使ったストアドプロシージャの記述 参照)を参照します。
コードに
telemetryパッケージをインポートします。
トレースイベントの追加¶
トレースイベントを追加するには、 telemetry.add_event メソッドを呼び出してイベントの名前を渡します。オプションで、属性(キーと値のペア)をイベントに関連付けることもできます。
add_event メソッドは次の形式で使用できます。
条件
nameは、トレースイベントの名前を指定するPython文字列です。attributesは、このトレースイベントの属性を指定する OpenTelemetry 属性オブジェクト です。この引数はオプションです。このトレースイベントに指定する属性がない場合は、引数を省略します。
次の例のハンドラーコードは、2つのイベント FunctionEmptyEvent と FunctionEventWithAttributes を追加します。FunctionEventWithAttributes を使用すると、コードは2つの属性、 key1 と key2 も追加します。
これらのイベントを追加すると、イベントテーブルに2つの行が作成され、それぞれの RECORD 列に異なる値が含まれます。
FunctionEventWithAttributes イベント行には、行の RECORD_ATTRIBUTES 列に次の属性が含まれています。
スパン属性の追加¶
telemetry.set_span_attribute メソッドを呼び出すと、スパンに関連付けられた属性(キーと値のペア)を設定できます。
スパンの詳細については、 Snowflakeがトレースイベントを表す方法 をご参照ください。
set_span_attribute メソッドは次の形式で使用できます。
条件:
keyは、属性のキーを指定するPython文字列です。
valueは、属性の値を指定する OpenTelemetry AttributeValue オブジェクト です。
次の例のコードは4つの属性を作成し、それらの値を設定します。
これらの属性を設定すると、イベントテーブルの RECORD_ATTRIBUTES 列が次のようになります。
カスタムスパンの追加¶
Snowflakeが作成するデフォルトのスパンとは別に、カスタムスパンを追加することができます。カスタム・スパンの詳細については、 トレースへのカスタムスパンの追加 をご参照ください。
次の例のコードは、 OpenTelemetry Python API を使って、 my.span スパンを現在のスパンとして作成し、 start_as_current_span を使っています。そして、 OpenTelemetry Python API を使用して、新しいスパンに属性を持つイベントを追加します。
ハンドラーの実行が完了する前にスパンが終了しない限り、イベントデータはイベントテーブルに取り込まれません。この例では、 with ステートメントが終了すると、スパンが自動的に閉じられます。
Pythonの例¶
以下のセクションでは、Pythonコードからトレースイベントのサポートを追加する例を示します。
ストアドプロシージャの例¶
Streamlitの例¶
UDF の例¶
入力行を処理するPython関数からトレースイベント API を呼び出すと、 UDF によって処理される すべての行 に対して API が呼び出されます。
たとえば、次のステートメントは、前の例で50行に対して定義されたPython関数を呼び出し、その結果、100個のトレースイベント(各行に2つ)が生成されます。
UDTF の例¶
UDTF ハンドラークラスの process() メソッドでトレースイベント API を呼び出すと、処理される すべての行 に対して API が呼び出されます。
たとえば、次のステートメントは、前の例で50行に対して定義された process() メソッドを呼び出します。その結果、 process() メソッドによって追加された100個のトレースイベント(各行に2つ)が生成されます。