Snowflake Telemetry API 라이브러리의 com.snowflake.telemetry.Telemetry 클래스를 사용하여 Scala로 작성된 함수 또는 프로시저 처리기에서 추적 이벤트를 내보낼 수 있습니다. Telemetry 클래스는 Snowflake에 포함되어 있습니다.
다음 예제의 코드는 testEvent 라는 이벤트를 추가하여 이벤트에 key 및 result 라는 두 가지 특성과 연결합니다.
// Adding an event without attributes.Telemetry.addEvent("testEvent")// Adding an event with attributes.AttributeseventAttributes=Attributes.of(AttributeKey.stringKey("key"),"run",AttributeKey.longKey("result"),Long.valueOf(123))Telemetry.addEvent("testEventWithAttributes",eventAttributes)
이러한 이벤트를 추가하면 이벤트 테이블에 두 개의 행이 생기는데, RECORD 열의 값이 각각 다릅니다.
{"name":"testEvent"}
{"name":"testEventWithAttributes"}
testEventWithAttributes 이벤트 행의 RECORD_ATTRIBUTES 열에 다음 특성을 포함합니다.
Snowflake에서 생성된 기본 범위와 별도로 사용자 지정 범위를 추가할 수 있습니다. 사용자 지정 범위에 대한 자세한 내용은 추적에 사용자 지정 범위 추가하기 섹션을 참조하십시오.
다음 예제의 코드는 OpenTelemetry API 및 OpenTelemetry context propagation API 를 사용하여 새 my.span 범위를 생성합니다. 그런 다음 새 범위에 이벤트를 추가합니다. 마지막으로, 이 코드는 범위를 종료하여 이벤트 테이블에 해당 범위의 이벤트 데이터가 캡처되도록 합니다. 코드에서 Span.end 메서드를 호출하지 않으면 이벤트 테이블에 데이터가 캡처되지 않습니다.
CREATEORREPLACEFUNCTIONtestScalaUserSpans(xVARCHAR)RETURNSVARCHARLANGUAGESCALARUNTIME_VERSION=2.12PACKAGES=('com.snowflake:telemetry:latest')HANDLER='TestScalaClass.run'AS$$classTestScalaClass{importcom.snowflake.telemetry.Telemetryimportio.opentelemetry.api.GlobalOpenTelemetryimportio.opentelemetry.api.trace.Tracerimportio.opentelemetry.api.trace.Spanimportio.opentelemetry.context.Scopedefrun(x:String):String={valtracer:Tracer=GlobalOpenTelemetry.getTracerProvider().get("my.tracer")valspan:Span=tracer.spanBuilder("my.span").startSpan()span.addEvent("test event from scala")span.end()returnx}} $$;
CREATEORREPLACEFUNCTIONtestScalaUserSpans(xVARCHAR)RETURNSVARCHARLANGUAGESCALARUNTIME_VERSION=2.13PACKAGES=('com.snowflake:telemetry:latest')HANDLER='TestScalaClass.run'AS$$classTestScalaClass{importcom.snowflake.telemetry.Telemetryimportio.opentelemetry.api.GlobalOpenTelemetryimportio.opentelemetry.api.trace.Tracerimportio.opentelemetry.api.trace.Spanimportio.opentelemetry.context.Scopedefrun(x:String):String={valtracer:Tracer=GlobalOpenTelemetry.getTracerProvider().get("my.tracer")valspan:Span=tracer.spanBuilder("my.span").startSpan()span.addEvent("test event from scala")span.end()returnx}} $$;
CREATEORREPLACEPROCEDUREdo_tracing()RETURNSSTRINGLANGUAGESCALARUNTIME_VERSION='2.12'PACKAGES=('com.snowflake:snowpark_2.12:latest','com.snowflake:telemetry:latest')HANDLER='ProcedureHandler.run'AS$$importcom.snowflake.snowpark_java.Sessionimportcom.snowflake.telemetry.Telemetryimportio.opentelemetry.api.common.AttributeKeyimportio.opentelemetry.api.common.AttributesclassProcedureHandler{defrun(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.valeventAttributes: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"}} $$;
CREATEORREPLACEPROCEDUREdo_tracing()RETURNSSTRINGLANGUAGESCALARUNTIME_VERSION='2.13'PACKAGES=('com.snowflake:snowpark_2.13:latest','com.snowflake:telemetry:latest')HANDLER='ProcedureHandler.run'AS$$importcom.snowflake.snowpark_java.Sessionimportcom.snowflake.telemetry.Telemetryimportio.opentelemetry.api.common.AttributeKeyimportio.opentelemetry.api.common.AttributesclassProcedureHandler{defrun(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.valeventAttributes: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"}} $$;