Snowflake Scripting에서 추적 이벤트 내보내기

Snowflake SYSTEM 함수를 사용하여 Snowflake Scripting으로 작성된 함수 또는 프로시저 처리기에서 추적 이벤트를 내보낼 수 있습니다.

추적 이벤트를 내보내기 전에 원하는 데이터가 이벤트 테이블에 저장되도록 추적 수준을 설정했는지 확인합니다. 자세한 내용은 로깅, 메트릭 및 추적을 위한 수준 설정하기 섹션을 참조하십시오.

참고

추적 이벤트 내보내기를 시작하려면 먼저 이벤트 테이블을 설정해야 합니다. 자세한 내용은 이벤트 테이블 개요 섹션을 참조하십시오.

이벤트 테이블에서 SELECT 명령을 실행하여 저장된 추적 이벤트 데이터에 액세스할 수 있습니다. 자세한 내용은 추적 데이터 보기 섹션을 참조하십시오.

Snowflake에서 로깅 설정 및 메시지 검색에 대한 일반적인 정보는 함수와 프로시저의 추적 이벤트 섹션을 참조하십시오.

참고

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

추적 이벤트 추가하기

SYSTEM$ADD_EVENT 함수를 호출하여 이벤트 이름을 전달하여 추적 이벤트를 추가할 수 있습니다. 선택적으로 특성(키-값 페어)을 이벤트와 연결할 수도 있습니다.

다음 예제의 코드에서는 SProcEmptyEventSProcEventWithAttributes 의 두 이벤트가 추가됩니다. 이 코드에서 SProcEventWithAttributes 를 사용하면 key1key2 의 두 가지 특성도 추가됩니다.

SYSTEM$ADD_EVENT('SProcEmptyEvent');
SYSTEM$ADD_EVENT('SProcEventWithAttributes', {'key1': 'value1', 'key2': 'value2'});
Copy

이러한 이벤트를 추가하면 이벤트 테이블에 두 개의 행이 생기는데, RECORD 열의 값이 각각 다릅니다.

{
  "name": "SProcEmptyEvent"
}
Copy
{
  "name": "SProcEventWithAttributes"
}
Copy

SProcEventWithAttributes 이벤트 행의 RECORD_ATTRIBUTES 열에 다음 특성을 포함합니다.

{
  "key1": "value1",
  "key2": "value2"
}
Copy

범위 특성 추가하기

SYSTEM$SET_SPAN_ATTRIBUTES 함수를 호출하여 범위와 연결된 특성(키-값 페어)을 설정할 수 있습니다.

범위에 대한 자세한 내용은 Snowflake가 추적 이벤트를 표시하는 방법 섹션을 참조하십시오.

SYSTEM$SET_SPAN_ATTRIBUTES 함수는 다음 형식으로 사용할 수 있습니다.

SYSTEM$SET_SPAN_ATTRIBUTES(<object>);
Copy

여기서

  • object 는 이 추적 이벤트의 특성을 지정하는 키-값 페어가 있는 Snowflake Scripting 오브젝트입니다.

다음 예의 코드는 두 가지 특성을 생성하고 해당 값을 설정합니다.

SYSTEM$SET_SPAN_ATTRIBUTES('{'attr1':'value1', 'attr2':true}');
Copy

이러한 특성을 설정하면 이벤트 테이블의 RECORD_ATTRIBUTES 열에 다음 내용이 표시됩니다.

{
  "attr1": "value1",
  "attr2": "value2"
}
Copy

다음 예제의 코드에서는 SYSTEM$ADD_EVENT 함수를 사용하여 name_a 라는 이벤트와 name_b 라는 이벤트를 추가합니다. name_b 와 함께 두 특성 scorepass 를 연결합니다. 이 코드는 또한 SYSTEM$SET_SPAN_ATTRIBUTES를 사용하여 범위의 두 가지 특성인 key1key2 를 설정합니다.

CREATE OR REPLACE PROCEDURE pi_proc()
  RETURNS DOUBLE
  LANGUAGE SQL
  AS $$
  BEGIN
    -- Add an event without attributes
    SYSTEM$ADD_EVENT('name_a');

    -- Add an event with attributes
    LET attr := {'score': 89, 'pass': TRUE};
    SYSTEM$ADD_EVENT('name_b', attr);

    -- Set attributes for the span
    SYSTEM$SET_SPAN_ATTRIBUTES({'key1': 'value1', 'key2': TRUE});

    RETURN 3.14;
  END;
  $$;
Copy
CALL pi_proc();
Copy

하위 작업 및 예외에 대한 추적 이벤트 자동 생성

이벤트 테이블에서 Snowflake Scripting 저장 프로시저에 대해 다음과 같은 추가 유형의 추적 이벤트를 자동으로 발생시킬 수 있습니다.

  • 예외 잡기.

  • 하위 작업 실행에 대한 정보입니다.

  • 하위 작업 통계.

  • 실행 시간 및 입력 값을 포함한 저장 프로시저 통계.

자동 추적 배출은 다음과 같은 사용 사례를 위한 것입니다.

  • 저장 프로시저의 본문을 수정하지 않고 미리 정의된 추적 이벤트를 방출하려고 합니다.

  • 나중에 분석할 수 있는 저장 프로시저 실행에 대한 정보를 수집하려고 합니다.

    • 하위 작업 실행에 대한 정보(예: childJobUUID, rowCount, exceptionCode 등).

    • 하위 작업 실행 시간.

    • 입력 인자 값.

  • 저장 프로시저 실행에 대한 가시성을 높여 프로시저에 추적 코드를 수동으로 추가하지 않고도 개발 및 디버깅을 더 쉽게 할 수 있도록 하려는 것입니다.

저장 프로시저에 대해 이러한 추가 추적 이벤트를 자동으로 발생시키려면 ALTER PROCEDURE 명령을 사용하여 AUTO_EVENT_LOGGING 매개 변수를 TRACING 또는 ALL 로 설정합니다. 이 매개 변수를 ALL 로 설정하면 저장 프로시저에 대해 로그 메시지 도 자동으로 추가로 생성됩니다.

중요

유효 TRACE_LEVELALWAYS 또는 ON_EVENT 로 설정된 경우에만 추가 정보가 이벤트 테이블에 추가됩니다. 자세한 내용은 로깅, 메트릭 및 추적을 위한 수준 설정하기 섹션을 참조하십시오.

예를 들어 간단한 테이블을 만들고 데이터를 삽입합니다.

CREATE OR REPLACE TABLE test_auto_event_logging (id INTEGER, num NUMBER(12, 2));

INSERT INTO test_auto_event_logging (id, num) VALUES
  (1, 11.11),
  (2, 22.22);
Copy

다음으로 auto_event_logging_sp 이라는 저장 프로시저를 만듭니다. 이 샘플 저장 프로시저는 테이블 행을 업데이트한 다음 테이블을 쿼리합니다.

CREATE OR REPLACE PROCEDURE auto_event_logging_sp(
  table_name VARCHAR,
  id_val INTEGER,
  num_val NUMBER(12, 2))
RETURNS TABLE()
LANGUAGE SQL
AS
$$
BEGIN
  UPDATE IDENTIFIER(:table_name)
    SET num = :num_val
    WHERE id = :id_val;
  LET res RESULTSET := (SELECT * FROM IDENTIFIER(:table_name) ORDER BY id);
  RETURN TABLE(res);
EXCEPTION
  WHEN statement_error THEN
    res := (SELECT :sqlcode sql_code, :sqlerrm error_message, :sqlstate sql_state);
    RETURN TABLE(res);
END;
$$
;
Copy

다음 예에서는 저장 프로시저의 AUTO_EVENT_LOGGING 매개 변수를 설정합니다.

ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
  SET AUTO_EVENT_LOGGING = 'TRACING';
Copy
ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
  SET AUTO_EVENT_LOGGING = 'ALL';
Copy

저장 프로시저를 호출합니다.

CALL auto_event_logging_sp('test_auto_event_logging', 2, 44.44);
Copy
+----+-------+
| ID |   NUM |
|----+-------|
|  1 | 11.11 |
|  2 | 44.44 |
+----+-------+

이벤트 테이블에서 auto_event_logging_sp 이라는 저장 프로시저에 기록된 추적 데이터를 쿼리합니다. 각 추적 이벤트에 대해 이벤트의 타임스탬프, 이름 및 특성을 인쇄합니다.

SELECT
    TIMESTAMP as time,
    RECORD['name'] as event_name,
    RECORD_ATTRIBUTES as attributes,
  FROM
    my_db.public.my_events
  WHERE
    RESOURCE_ATTRIBUTES['snow.executable.name'] LIKE '%AUTO_EVENT_LOGGING_SP%'
    AND RECORD_TYPE LIKE 'SPAN%';
Copy
+-------------------------+--------------------------+-----------------------------------------------------------------------------------------------+
| TIME                    | EVENT_NAME               | ATTRIBUTES                                                                                    |
|-------------------------+--------------------------+-----------------------------------------------------------------------------------------------|
| 2024-10-25 20:48:49.844 | "snow.auto_instrumented" | {                                                                                             |
|                         |                          |   "childJobTime": 474,                                                                        |
|                         |                          |   "executionTime": 2,                                                                         |
|                         |                          |   "inputArgumentValues": "{ ID_VAL: 2, TABLE_NAME: test_auto_event_logging, NUM_VAL: 44.44 }" |
|                         |                          | }                                                                                             |
| 2024-10-25 20:48:49.740 | "child_job"              | {                                                                                             |
|                         |                          |   "childJobUUID": "01b7ef00-0003-01d1-0000-a99501233092",                                     |
|                         |                          |   "rowCount": 1,                                                                              |
|                         |                          |   "rowsAffected": 1                                                                           |
|                         |                          | }                                                                                             |
| 2024-10-25 20:48:49.843 | "child_job"              | {                                                                                             |
|                         |                          |   "childJobUUID": "01b7ef00-0003-01d1-0000-a99501233096",                                     |
|                         |                          |   "rowCount": 2,                                                                              |
|                         |                          |   "rowsAffected": 0                                                                           |
|                         |                          | }                                                                                             |
+-------------------------+--------------------------+-----------------------------------------------------------------------------------------------+

이제 저장 프로시저를 호출하되 존재하지 않는 테이블을 지정하여 예외를 발생시키십시오.

CALL auto_event_logging_sp('no_table', 2, 82.44);
Copy
+----------+-----------------------------------------------------+-----------+
| SQL_CODE | ERROR_MESSAGE                                       | SQL_STATE |
|----------+-----------------------------------------------------+-----------|
|     2003 | SQL compilation error:                              | 42S02     |
|          | Object 'NO_TABLE' does not exist or not authorized. |           |
+----------+-----------------------------------------------------+-----------+

이벤트 테이블에서 쿼리를 다시 실행하여 예외에 대한 정보를 확인합니다.

SELECT
    TIMESTAMP as time,
    RECORD['name'] as event_name,
    RECORD_ATTRIBUTES as attributes,
  FROM
    my_db.public.my_events
  WHERE
    RESOURCE_ATTRIBUTES['snow.executable.name'] LIKE '%AUTO_EVENT_LOGGING_SP%'
    AND RECORD_TYPE LIKE 'SPAN%';
Copy
+-------------------------+--------------------------+-----------------------------------------------------------------------------------------------------+
| TIME                    | EVENT_NAME               | ATTRIBUTES                                                                                          |
|-------------------------+--------------------------+-----------------------------------------------------------------------------------------------------|
| 2024-10-25 20:52:43.633 | "snow.auto_instrumented" | {                                                                                                   |
|                         |                          |   "childJobTime": 66,                                                                               |
|                         |                          |   "executionTime": 4,                                                                               |
|                         |                          |   "inputArgumentValues": "{ ID_VAL: 2, TABLE_NAME: no_table, NUM_VAL: 82.44 }"                      |
|                         |                          | }                                                                                                   |
| 2024-10-25 20:52:43.601 | "caught_exception"       | {                                                                                                   |
|                         |                          |   "exceptionCode": 2003,                                                                            |
|                         |                          |   "exceptionMessage": "SQL compilation error:\nObject 'NO_TABLE' does not exist or not authorized." |
|                         |                          | }                                                                                                   |
+-------------------------+--------------------------+-----------------------------------------------------------------------------------------------------+