추적에 사용자 지정 범위 추가하기¶
프로시저나 함수에 대한 처리기 내에서 더욱 세분화된 추적을 위해 추적에 사용자 지정 범위를 추가할 수 있습니다.
기본적으로 추적을 활성화 한 경우 (Snowflake가 추적 이벤트를 표시하는 방법 에 설명된 대로) Snowflake가 범위를 시작하고 해당 범위에 모든 추적 이벤트를 추가합니다. (이를 내부적으로 “auto_instrumented” 범위하고 합니다.) OpenTelemetry APIs를 사용하여 사용자의 자체 범위를 생성할 수 있습니다. 새 범위에는 해당 언어의 OpenTelemetry API 또는 Snowflake API를 사용하여 이벤트와 특성을 추가할 수 있습니다.
예를 들어, 코드를 사용하여 ML 모델을 훈련시킬 때와 같이 프로시저 내에서 발생하는 계산이 많은 작업에 대한 추적 데이터를 분리하려는 경우 고유 범위를 생성할 수 있습니다.
사용자가 생성하는 사용자 지정 범위는 OpenTelemetry에서 생성한 범위의 기본 동작과 일치합니다.
지원되는 언어¶
다음 언어로 작성된 코드에서 사용자 지정 범위를 추가할 수 있으며, 처리기 코드가 Snowpark APIs 로 작성된 경우도 포함됩니다.
언어/유형 |
Java |
Python |
JavaScript |
Scala |
Snowflake Scripting |
---|---|---|---|---|---|
저장 프로시저 핸들러 |
✔ |
✔ |
✔ |
✔ [1] |
|
Streamlit 앱 |
✔ |
||||
UDF 핸들러(스칼라 함수) |
✔ |
✔ |
✔ |
✔ [1] |
|
UDTF 핸들러(테이블 함수) |
✔ |
✔ |
✔ |
사용자 지정 범위 만들기¶
처리기 코드를 사용하여 사용자 지정 범위를 추가하려면 기존 Snowflake 원격 분석 환경 내에서 처리기 언어의 OpenTelemetry API를 사용하여 새 범위를 생성하고 필요에 따라 이벤트와 특성을 추가한 다음 범위를 닫습니다.
OpenTelemetry API를 사용하여 범위의 컨텍스트를 관리할 추적기를 생성합니다.
기존 Snowflake 원격 분석 환경에서 생성된 이 추적기를 통해 이벤트 테이블에서 추적 데이터를 캡처하는 기존 인프라를 사용하는 사용자 지정 범위를 생성할 수 있습니다.
새 추적기에서 새 범위가 현재 범위가 되도록 API를 사용하여 사용자 지정 범위를 생성합니다.
Snowflake에서 관리하는 기존 컨텍스트에 새 범위를 생성하면 trace_id 및 parent_span_id 값을 포함한 컨텍스트의 정보가 Snowflake 기본 범위에서 다른 범위로 전달되도록 할 수 있습니다.
사용자 지정 범위에서 코드가 완료되면 처리기가 실행을 완료하기 전에 범위를 닫아야 이벤트 테이블에서 추적 데이터를 캡처할 수 있습니다.
사용자 지정 범위의 이 동작은 OpenTelemetry의 기본 동작과 일치합니다.
지원되는 언어로 사용자 지정 범위를 추가하는 방법에 대한 내용은 다음 항목을 참조하십시오.
Python 예제¶
다음 예제의 코드는 OpenTelemetry Python API 를 사용하여 start_as_current_span
가 있는 현재 범위로 my.span
범위를 생성합니다. 그런 다음 OpenTelemetry Python API 를 사용하여 새 범위에 특성이 있는 이벤트를 추가합니다.
처리기가 실행을 완료하기 전에 범위가 끝나지 않으면 이벤트 데이터는 이벤트 테이블에 캡처되지 않습니다. 이 예제에서는 with
문이 끝나면 범위 닫기가 자동으로 수행됩니다.
CREATE OR REPLACE FUNCTION customSpansPythonExample() RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES = ('snowflake-telemetry-python', 'opentelemetry-api')
HANDLER = 'custom_spans_function'
AS $$
from snowflake import telemetry
from opentelemetry import trace
def custom_spans_function():
tracer = trace.get_tracer("my.tracer")
with tracer.start_as_current_span("my.span") as span:
span.add_event("Event2 in custom span", {"key1": "value1", "key2": "value2"})
return "success"
$$;