Snowflake가 추적 이벤트를 표시하는 방법

내부적으로, Snowflake는 OpenTelemetry 데이터 모델을 사용하여 범위 라는 오브젝트 내부의 추적 이벤트를 나타냅니다. 범위 는 저장 프로시저 호출 또는 행 세트에 대한 UDF의 실행과 같은 작업을 설명합니다. 범위에는 작업의 시작 시간과 종료 시간이 포함됩니다.

추적 이벤트를 추가할 때 염두에 두어야 할 지침은 추적 이벤트를 추가하는 일반 지침 섹션을 참조하십시오.

Snowflake가 추적 이벤트를 내보내는 방법

저장 프로시저 또는 UDF가 호출되면 Snowflake는 이를 병렬로 실행할 수 있으며, 각 병렬 실행 단위는 서로 다른 행 세트에서 실행됩니다. 내보낸 모든 추적 이벤트는 실행 단위로 범위가 지정되고 동일한 범위 내에서 래핑됩니다.

추적 이벤트는 실행 단위가 완료된 후에만 내보냅니다. 완료 전에 실행 단위가 실패하면 해당 실행 단위의 추적 이벤트를 내보내도록 보장되지 있습니다.

다양한 실행 단위의 추적 이벤트가 이벤트 테이블의 개별 행(즉, 다른 범위에 있는 행)에 저장됩니다.

참고

입력 테이블 행마다 UDF가 적용되므로 UDF에서 추적 이벤트 API에 대한 호출이 각 입력 테이블 행에 대해 실행됩니다. 대부분의 경우 모든 행에 추적 이벤트를 추가하는 것은 바람직하지 않습니다. 실행 단위마다 이벤트는 128개로 제한됩니다.

예: Java 프로시저에서 이벤트 내보내기

다음 예제에서는 처리기 코드에서 이벤트를 내보내는 방법을 보여줍니다. 또한 생성된 이벤트 데이터가 이벤트 테이블에 저장되는 방식도 보여줍니다.

Java 처리기가 있는 저장 프로시저

다음 예제의 Java 코드는 특성 데이터와 함께 이벤트를 범위에 추가하는 방법을 보여줍니다. 처리기 언어의 API에 대한 자세한 내용은 처리기 코드에서 이벤트 추적 섹션을 참조하십시오.

CREATE OR REPLACE PROCEDURE test_stored_proc()
RETURNS STRING
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES=('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest')
HANDLER = 'MyClass.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;
  import io.opentelemetry.api.common.AttributesBuilder;

  public class MyClass {

    public String run(Session session) {
        // 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);

        // Setting span attributes of different types.
        Telemetry.setSpanAttribute("example.boolean", true);
        Telemetry.setSpanAttribute("example.long", 2L);
        Telemetry.setSpanAttribute("example.double", 2.5);
        Telemetry.setSpanAttribute("example.string", "testAttribute");

        return "SUCCESS";
    }
  }
$$;
Copy

기록된 범위 데이터

함수 또는 프로시저가 성공적으로 실행된 후 Snowflake는 다음 표에 나타낸 것처럼 OpenTelemetry 범위 오브젝트를 이벤트 테이블의 열에서 오브젝트로 렌더링합니다.

범위는 자체 특성을 가질 수 있습니다. 범위는 저장 프로시저와 UDF 실행 단위를 나타내므로, 이후 데이터 분석을 위해 범위 수준 특성을 설정하는 것이 유용할 수 있습니다. 범위 특성을 설정하는 방법에 대한 자세한 내용은 처리기 코드를 작성하는 언어와 관련된 내용을 참조하십시오. 이러한 언어 목록은 처리기 코드에서 이벤트 추적 섹션을 참조하십시오.

한 범위는 최대 128개의 추적 이벤트와 최대 128개의 범위 특성을 보유할 수 있습니다.

  • 추적 이벤트 수가 한도를 초과하면 처리기 언어에 따라 다음과 같이 이벤트가 삭제됩니다.

    • Python 처리기의 경우 이벤트는 추가된 순서대로(즉, 선입선출의 순서로) 삭제됩니다.

    • Java, JavaScript, Scala 및 Snowflake Scripting으로 작성된 처리기의 경우, 한도에 도달하면 새 이벤트가 삭제됩니다.

  • 범위 특성 수가 한도를 초과하면 범위 특성을 더 이상 추가할 수 없습니다.

참고

2022년 11월부터 OpenTelemetry JavaScript 추적 SDK가 삭제된 개수를 보고하지 않으므로 모든 dropped_*_count 키가 JavaScript에 대해 설정되지 않습니다.

설명

데이터

처리기 코드가 포함된 프로시저의 실행을 위해 Snowflake에서 기록된 범위입니다.

  • START_TIMESTAMP 열의 시작 타임스탬프:

    2023-03-21 23:12:06.231

  • TIMESTAMP 열의 종료 타임스탬프:

    2023-03-21 23:12:06.944

  • RECORD 열의 데이터:

    {
      "kind": "SPAN_KIND_INTERNAL",
      "name": "snow.auto_instrumented",
      "status": {
        "code": "STATUS_CODE_UNSET"
      }
    }
    
    Copy

범위에 대해 처리기 코드로 추가된 특성입니다.

  • RECORD_ATTRIBUTES 열의 데이터:

    {
      "example.boolean": true,
      "example.double": 2.5,
      "example.long": 2,
      "example.string": "testAttribute"
    }
    
    Copy

기록된 이벤트 데이터

범위에는 추적 이벤트가 추가된 시점을 캡처하는 타임스탬프가 있는 추적 이벤트 목록이 포함됩니다. 여기에 표시되지 않음: 범위에는 대시가 없는 쿼리 ID인 trace_id 가 있습니다. 범위에는 또한 span_idname 키에 대해 시스템에서 생성된 값도 있습니다. 범위의 일부인 이벤트는 동일한 span_id 를 공유합니다.

이벤트 testEvent 에 대해 다음 데이터가 기록되었습니다.

설명

데이터

이벤트 이름

  • TIMESTAMP 열의 타임스탬프:

    2023-03-21 23:12:06.939

  • RECORD 열의 데이터:

    {
      "dropped_attributes_count": 0,
      "name": "testEvent"
    }
    
    Copy

이벤트 testEventWithAttributes 에 대해 다음 데이터가 기록되었습니다.

설명

데이터

이벤트 이름

  • TIMESTAMP 열의 타임스탬프:

    2023-03-21 23:12:06.940

  • RECORD 열의 데이터:

    {
      "dropped_attributes_count": 0,
      "name": "testEventWithAttributes"
    }
    
    Copy

이벤트 특성

  • RECORD_ATTRIBUTES 열의 데이터:

    {
      "key": "run",
      "result": 123
    }
    
    Copy