Scalaでのトレースイベントの出力¶
テレメトリ API ライブラリの com.snowflake.telemetry.Telemetry
クラスを使用して、Scalaで記述された関数またはプロシージャハンドラーからトレースイベントを出力できます。 Telemetry
クラスはSnowflakeに含まれています。
注釈
Snowflakeテレメトリライブラリを使用すると、関数またはプロシージャの実行環境に他のライブラリが追加されます。詳細については、 Snowflakeテレメトリパッケージの依存関係 をご参照ください。
Mavenでコードをパッケージ化するときにテレメトリライブラリを含める方法については、 テレメトリクラスを使用するためのJavaおよびScala環境の設定 をご参照ください。
イベントテーブルで SELECT コマンドを実行すると、格納されたトレースイベントデータにアクセスできます。詳細については、 トレースデータへのアクセス をご参照ください。
注釈
トレースイベントを追加する際に留意すべきガイドラインについては、 トレースイベントを追加するための一般的なガイドライン をご参照ください。
Snowflakeでのログの設定とメッセージの取得に関する一般的な情報については、 関数とプロシージャのイベントをトレースする をご参照ください。
コードからログする前に、次を実行する必要があります。
ハンドラーコードからログされたメッセージを収集するイベントテーブルを設定します。
詳細については、 イベントテーブルの設定 をご参照ください。
必要なデータがイベントテーブルに格納されるようにトレースレベルが設定されていることを確認してください。
詳細については、 トレースレベルの設定 をご参照ください。
テレメトリ API のサポートの追加¶
Telemetry
メソッドを使用するには、Snowflakeに含まれるSnowflakeテレメトリライブラリをハンドラーコードで使用できるようにする必要があります。
CREATE PROCEDURE または CREATE FUNCTION ステートメントの PACKAGES 句に、
com.snowflake:telemetry
パッケージを含めます。PACKAGES 句により、含まれているSnowflakeテレメトリ API がコードで使用できるようになります。次の例のコードでは、 PACKAGES 句を使用してテレメトリライブラリとSnowparkライブラリ(Scalaで記述されたストアドプロシージャに必要です。詳細については、 Scalaでのストアドプロシージャの記述 をご参照ください)を参照します。
CREATE OR REPLACE PROCEDURE MYPROC(...) RETURNS ... LANGUAGE SCALA ... PACKAGES = ('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest') ...
ハンドラーコードに
com.snowflake.telemetry
パッケージをインポートします。import com.snowflake.telemetry.Telemetry
トレースイベントの追加¶
トレースイベントを追加するには、 Telemetry.addEvent
メソッドを呼び出してイベントの名前を渡します。オプションで、属性(キーと値のペア)をイベントに関連付けることもできます。
addEvent
メソッドには次の署名があります。
public static void addEvent(String name)
public static void addEvent(String name, Attributes attributes)
次の例のコードは、 testEvent
というイベントを追加し、そのイベントに2つの属性 key
と result
を関連付けます。
// Adding an event without attributes.
Telemetry.addEvent("testEvent");
// Adding an event with attributes.
Attributes eventAttributes = Attributes.of(
AttributeKey.stringKey("key"), "run",
AttributeKey.longKey("result"), Long.valueOf(123))
Telemetry.addEvent("testEventWithAttributes", eventAttributes)
これらのイベントを追加すると、イベントテーブルに2つの行が作成され、それぞれの RECORD 列に異なる値が含まれます。
{
"name": "testEvent"
}
{
"name": "testEventWithAttributes"
}
testEventWithAttributes
イベント行には、行の RECORD_ATTRIBUTES 列に次の属性が含まれています。
{
"key": "run",
"result": 123
}
スパン属性の追加¶
Telemetry.setSpanAttribute
メソッドを呼び出すと、スパンに関連付けられた属性(キーと値のペア)を設定できます。
setSpanAttribute
メソッドには次の署名があります。
public static void setSpanAttribute(String key, boolean value)
public static void setSpanAttribute(String key, long value)
public static void setSpanAttribute(String key, double value)
public static void setSpanAttribute(String key, String value)
スパンの詳細については、 Snowflakeがトレースイベントを表す方法 をご参照ください。
次の例のコードは4つの属性を作成し、それらの値を設定します。
// Setting span attributes.
Telemetry.setSpanAttribute("example.boolean", true)
Telemetry.setSpanAttribute("example.long", 2L)
Telemetry.setSpanAttribute("example.double", 2.5)
Telemetry.setSpanAttribute("example.string", "testAttribute")
これらの属性を設定すると、イベントテーブルの RECORD_ATTRIBUTES 列が次のようになります。
{
"example.boolean": true,
"example.long": 2,
"example.double": 2.5,
"example.string": "testAttribute"
}
例¶
ストアドプロシージャの例¶
CREATE OR REPLACE PROCEDURE do_tracing()
RETURNS STRING
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES=('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest')
HANDLER = 'ProcedureHandler.run'
AS
$$
import com.snowflake.snowpark_java.Session;
import com.snowflake.telemetry.Telemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
class ProcedureHandler {
def run(session: Session): String = {
// Set span attribute.
Telemetry.setSpanAttribute("example.proc.do_tracing", "begin");
// Add an event without attributes.
Telemetry.addEvent("run_method_start");
// Add an event with attributes.
val eventAttributes: Attributes = Attributes.of(
AttributeKey.stringKey("example.method.name"), "run")
Telemetry.addEvent("event_with_attributes", eventAttributes);
// Set span attribute.
Telemetry.setSpanAttribute("example.proc.do_tracing", "complete");
return "SUCCESS";
}
}
$$;