Snowpipe 이벤트 모니터링
Snowpipe 이벤트 모니터링
Snowflake가 파이프 상태에 대한 자세한 정보를 제공하는 이벤트를 기록하도록 구성할 수 있어요. 이러한 이벤트는 파이프와 연결된 활성 이벤트 테이블에 캡처돼요.
이 이벤트를 모니터링하면 다음 영역에 대한 통찰을 얻을 수 있어요.
- 파이프 상태 변경: Snowpipe의 운영 상태 추적.
- 파일 처리 진행 상황: Snowpipe 시스템을 통과하는 파일의 이동 이해.
- 주기적이고 집계된 수집 통계 다이제스트: 데이터 수집에 대한 요약 통계 획득.
또한 다음 중요한 조건에 대한 알림을 구성할 수 있어요.
- 대량의 들어오는 파일
- 높은 수집 지연 시간
- 파이프 오류
- 파일 오류
다음 섹션은 Snowpipe용 이벤트 로깅을 활성화하고, 로그 이벤트의 심각도 수준을 구성하고, 이벤트 테이블에 기록된 이벤트를 해석하는 방법을 설명해요.
- Snowpipe 이벤트 유형: 다양한 이벤트 범주와 그 세부 정보.
- 캡처할 이벤트의 심각도 수준 설정: 중요도에 따라 기록할 이벤트 구성.
- Snowpipe 이벤트를 위한 이벤트 테이블 조회: 이벤트 데이터 검색 및 분석 방법.
- Snowpipe 이벤트에 대해 기록된 정보: 이벤트 테이블 열 안의 데이터 구조와 의미.
주의 — Snowpipe 이벤트 로깅에는 비용이 발생해요. 자세한 내용은 원격 측정 데이터 수집 비용을 참고해요.
출처: Documentation
본문
Snowpipe 이벤트 유형
Snowpipe 이벤트는 이벤트 테이블의 RECORD 열 안에 있는 name 특성으로 식별돼요.
file_lifecycle
file_lifecycle 이벤트는 파일이 Snowpipe 시스템을 통과하는 이동을 추적해요. 파일의 상태는 RECEIVED, INGESTED 또는 ERRORED일 수 있어요.
RECEIVED: Snowpipe가 파일 요청을 받으면 이벤트가 발생해요. 파일이 이전에 처리되었다면 파이프가 이 파일을 건너뛸 수 있으며, 이 경우 skipped 특성이 이를 나타내요.
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"snow.database.name": "<MY_DB_NAME>",
"snow.schema.name": "<MY_SCHEMA_NAME>",
"snow.pipe.name": "<MY_PIPE_NAME>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "file_lifecycle",
"severity_text": "DEBUG"
},
"RECORD_ATTRIBUTES": {
"snow.file.path": "<a/path/to/a/file>"
},
"VALUE": {
"notification_channel": "<notification_channel>",
"file_content_key": "<file_content_key>",
"last_modified_time": "<last_modified_time>",
"state": "<received_or_skipped>"
}
}
INGESTED: Snowpipe가 파일을 성공적으로 수집한 후 이벤트가 발생해요.
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"snow.database.name": "<MY_DB_NAME>",
"snow.schema.name": "<MY_SCHEMA_NAME>",
"snow.pipe.name": "<MY_PIPE_NAME>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "file_lifecycle",
"severity_text": "DEBUG"
},
"RECORD_ATTRIBUTES": {
"snow.file.path": "<a/path/to/a/file>"
},
"VALUE": {
"notification_channel": "<notification_channel>",
"file_content_key": "<file_content_key>",
"state": "ingested"
}
}
ERRORED: Snowpipe가 파일을 수집하는 데 실패하면 이벤트가 발생해요.
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"snow.database.name": "<MY_DB_NAME>",
"snow.schema.name": "<MY_SCHEMA_NAME>",
"snow.pipe.name": "<MY_PIPE_NAME>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "file_lifecycle",
"severity_text": "ERROR"
},
"RECORD_ATTRIBUTES": {
"snow.file.path": "<a/path/to/a/file>"
},
"VALUE": {
"notification_channel": "<notification_channel>",
"file_content_key": "<file_content_key>",
"first_error_message": "<first_error_message>",
"first_error_line_number": "<some_number>",
"first_error_character_pos": "<some_character_pos>",
"error_count": "<error_count>",
"error_limit": "<error_limit>",
"file_state": "FAILED"
}
}
notification_received
이 이벤트는 Snowflake가 알림 메시지를 받을 때 발생해요.
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"notification_channel_name": "<notification_channel_name>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "notification_received",
"severity_text": "TRACE"
},
"VALUE": {
"file_path": "<a/path/to/a/file>",
"file_content_key": "<file_content_key>",
"upstream_event_time": "<upstream_event_time>"
}
}
notification_channel_errored
이 이벤트는 Snowflake가 알림 채널에서 메시지를 읽는 동안 오류가 발생할 때 발생해요. 이는 일반적으로 인증 문제 같은 사용자 구성 오류를 나타내요.
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"notification_channel_name": "<notification_channel_name>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "notification_channel_errored",
"severity_text": "ERROR"
},
"VALUE": {
"first_error_message": "<error_message>"
}
}
pipe_lifecycle
이 이벤트는 파이프의 상태가 변경될 때 발생해요. 새 상태는 RUNNING, PAUSED, STOPPED 또는 STALLED일 수 있어요.
RUNNING 또는 PAUSED 파이프 상태의 경우:
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"snow.database.name": "<MY_DB_NAME>",
"snow.schema.name": "<MY_SCHEMA_NAME>",
"snow.pipe.name": "<MY_PIPE_NAME>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "pipe_lifecycle",
"severity_text": "INFO"
},
"VALUE": {
"state": "<running_or_paused>"
}
}
STOPPED_ 또는 STALLED_ 파이프 상태의 경우:** 이러한 상태는 파이프가 파일 처리를 예기치 않게 중지했음을 나타내요.
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"snow.database.name": "<MY_DB_NAME>",
"snow.schema.name": "<MY_SCHEMA_NAME>",
"snow.pipe.name": "<MY_PIPE_NAME>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "pipe_lifecycle",
"severity_text": "<WARN_or_ERROR>"
},
"VALUE": {
"state": "<pipe_status>",
"error_message": "<error_message>"
}
}
STOPPED_* 또는 STALLED_* 상태의 severity_text는 특정 이유에 따라 달라져요.
다음 이유로 파이프가 중지되었으면 WARN:
STOPPED_BY_SNOWFLAKE_ADMINSTOPPED_CLONEDSTOPPED_FEATURE_DISABLED
다음 이유로 파이프가 중지되었으면 ERROR:
STOPPED_STAGE_ALTEREDSTOPPED_STAGE_DROPPEDSTOPPED_FILE_FORMAT_DROPPEDSTOPPED_NOTIFICATION_INTEGRATION_DROPPEDSTOPPED_MISSING_PIPESTOPPED_MISSING_TABLESTALLED_COMPILATION_ERRORSTALLED_INITIALIZATION_ERRORSTALLED_EXECUTION_ERRORSTALLED_INTERNAL_ERRORSTALLED_STAGE_PERMISSION_ERROR
pipe_throttled
이 이벤트는 Snowpipe가 제한(throttle)되면 발생해요.
{
"TIMESTAMP": "<some_timestamp>",
"RESOURCE_ATTRIBUTES": {
"snow.database.name": "<MY_DB_NAME>",
"snow.schema.name": "<MY_SCHEMA_NAME>",
"snow.pipe.name": "<MY_PIPE_NAME>"
},
"RECORD_TYPE": "EVENT",
"RECORD": {
"name": "pipe_throttled",
"severity_text": "WARN"
},
"VALUE": {
"throttled_files": "<throttled_file_name_list>"
}
}
캡처할 이벤트의 심각도 수준 설정
Snowpipe 이벤트가 이벤트 테이블에 기록되도록 하려면 파이프 수준 또는 계정 수준에서 LOG_EVENT_LEVEL 매개 변수를 설정해야 해요. LOG_EVENT_LEVEL은 심각도에 따라 캡처할 로그 이벤트를 결정해요. 자세한 내용은 매개 변수와 이벤트를 제어하는 새 LOG_EVENT_LEVEL 매개 변수를 참고해요.
ERROR: 해결하려면 사람의 개입이 필요한 변경을 알리는 이벤트에 사용.WARN: 사람의 개입 없이 해결할 수 있는 문제를 알리는 이벤트에 사용.INFO: 일반적으로 유용하고 대량 이벤트가 아닌 사용자 시작 이벤트에 사용.DEBUG: 대량 이벤트에 사용.TRACE: 가장 낮은 로깅 수준으로, 매우 자세한 정보를 캡처.
주의 — 심각도 수준이 계정 수준 또는 파이프 수준에서 설정되지 않으면 이벤트가 캡처되지 않아요.
예제:
계정의 모든 객체에 대해 ERROR 수준 이벤트를 캡처하려면 다음 코드를 실행해요.
ALTER ACCOUNT <my_account_name> SET LOG_EVENT_LEVEL = ERROR;
특정 파이프에 대해 INFO 수준 이벤트를 캡처하려면 다음 코드를 실행해요.
ALTER PIPE <my_pipe_name> SET LOG_EVENT_LEVEL = INFO;
각 이벤트 유형의 심각도 수준
다음 표는 LOG_EVENT_LEVEL을 사용할 때 각 Snowpipe 이벤트 유형의 기본 또는 권장 심각도를 요약해요.
| 이벤트 | 심각도 |
|---|---|
| file_lifecycle - RECEIVED, INGESTED | DEBUG |
| file_lifecycle - ERRORED | ERROR |
| notification_received | TRACE |
| notification_channel_errored | ERROR |
| pipe_lifecycle - RUNNING, PAUSED | INFO |
| pipe_lifecycle - STOPPED | WARN 또는 ERROR(다음 섹션 참고) |
| pipe_throttled | WARN |
pipe_lifecycle - STOPPED 심각도 세부 정보:
다음 이유로 파이프가 중지되었으면 WARN:
STOPPED_BY_SNOWFLAKE_ADMINSTOPPED_CLONEDSTOPPED_FEATURE_DISABLED
다음 이유로 파이프가 중지되었으면 ERROR:
STOPPED_STAGE_ALTEREDSTOPPED_STAGE_DROPPEDSTOPPED_FILE_FORMAT_DROPPEDSTOPPED_NOTIFICATION_INTEGRATION_DROPPEDSTOPPED_MISSING_PIPESTOPPED_MISSING_TABLESTALLED_COMPILATION_ERRORSTALLED_INITIALIZATION_ERRORSTALLED_EXECUTION_ERRORSTALLED_INTERNAL_ERRORSTALLED_STAGE_PERMISSION_ERROR
Snowpipe 이벤트를 위한 이벤트 테이블 조회
조회하기 전에 이벤트 테이블을 설정하고 캡처할 이벤트에 원하는 심각도 수준을 구성했는지 확인해요.
다음 예제 쿼리는 파일 수집 중 생성된 것 같은 Snowpipe 이벤트를 검색하는 방법을 보여줘요.
SELECT
record_type,
record:"name" AS event_name,
record:"severity_text" AS log_level,
resource_attributes:"snow.database.name" AS database_name,
resource_attributes:"snow.schema.name" AS schema_name,
resource_attributes:"snow.pipe.name" AS pipe_name,
record_attributes,
PARSE_JSON(value):file_content_key AS file_content_key,
PARSE_JSON(value):state AS state
FROM {my_event_table_name}
ORDER BY state;
예제 출력(성공적인 파일 수집):
다음 출력은 파일에 대한 RECEIVED와 INGESTED 이벤트를 모두 보여주며, 성공적인 처리를 나타내요.
| SCOPE | RECORD_TYPE | EVENT_NAME | LOG_LEVEL | DATABASE_NAME | SCHEMA_NAME | PIPE_NAME | RECORD_ATTRIBUTES | FILE_CONTENT_KEY | STATE |
|---|---|---|---|---|---|---|---|---|---|
| [NULL] | EVENT | "file_lifecycle" | "DEBUG" | "TESTDB" | "TESTSH" | "MYPIPE" | { "snow.file.path": "data_0_0_0.event" } | "ba1f2511fc30423bdbb183fe33f3dd0f" | "INGESTED" |
| [NULL] | EVENT | "file_lifecycle" | "DEBUG" | "TESTDB" | "TESTSH" | "MYPIPE" | { "snow.file.path": "data_0_0_0.event" } | "ba1f2511fc30423bdbb183fe33f3dd0f" | "RECEIVED" |
Snowpipe 이벤트에 대해 기록된 정보
다음 섹션은 Snowpipe 이벤트에 대한 이벤트 테이블 안의 주요 열과 그 내용을 설명해요. 열이 다음 섹션에 명시적으로 나열되지 않으면 그 값은 Snowpipe 이벤트에 대해 NULL이에요.
이벤트 테이블 열 값
| 열 | 데이터 유형 | 설명 |
|---|---|---|
| timestamp | TIMESTAMP_NTZ | 이벤트가 생성된 UTC 타임스탬프. |
| resource_attributes | OBJECT | 데이터베이스, 스키마, 파이프 이름 같은 Snowpipe 이벤트를 식별하는 특성. |
| record_type | STRING | 기록된 이벤트의 유형. Snowpipe 이벤트의 경우 이 값은 항상 EVENT예요. |
| record | OBJECT | name과 severity_text를 포함하는 Snowpipe 이벤트 실행 상태에 대한 자세한 정보. |
| value | VARIANT | Snowpipe 이벤트에 특정한 추가 정보. Snowpipe 작업이 실패하면 오류 메시지를 포함해요. |
resource_attributes 열의 키-값 쌍
resource_attributes 열은 다음 키-값 쌍을 가진 OBJECT 값을 포함해요.
| 특성 이름 | 특성 유형 | 설명 | 예 |
|---|---|---|---|
| snow.database.name | VARCHAR | 파이프와 연결된 데이터베이스의 이름. | "MY_DATABASE" |
| snow.schema.name | VARCHAR | 파이프와 연결된 스키마의 이름. | "MY_SCHEMA_NAME" |
| snow.pipe.name | VARCHAR | 파이프의 이름. | "MY_PIPE_NAME" |
| notification_channel_name | VARCHAR | 메시지를 받았거나 오류가 발생한 알림 채널의 이름. | "arn:aws:sqs:us-west-2:774383465531:sf-snowpipe-AIDA3" |
record 열의 키-값 쌍
record 열은 다음 키-값 쌍을 가진 OBJECT 값을 포함해요.
| 키 | 유형 | 설명 | 예 |
|---|---|---|---|
| name | VARCHAR | 이벤트의 이름. | "pipe_lifecycle" |
| severity_text | VARCHAR | 이벤트의 심각도 수준. | "INFO" |