dbt Projects on Snowflake 모니터링

dbt Projects on Snowflake 모니터링

이 항목은 dbt Projects on Snowflake 모니터링 기능을 사용해 dbt 프로젝트 실행(수동 또는 태스크 예약)을 검사하고 로그와 아티팩트를 보는 방법을 설명해요.

섹션 설명
dbt 프로젝트 객체 모니터링 기능 활성화 dbt 프로젝트 객체와 그를 실행하는 예약 태스크에 대한 로깅·추적 이벤트를 캡처해요. 이 기능을 활성화하려면 dbt 프로젝트 객체와 태스크가 배포된 스키마에 logging, tracing, metrics를 설정해야 해요.
dbt 프로젝트 객체의 예약 실행 모니터링 Snowsight의 탐색 메뉴에서 Transformation » dbt Projects를 선택해 dbt 프로젝트 객체의 실행 기록, 태스크 그래프, 쿼리 세부 정보를 봐요. 워크스페이스가 태스크 스케줄에 따라 실행되는 dbt 프로젝트 객체에 연결되어 있으면 워크스페이스 안에서 태스크 실행 기록과 태스크 그래프를 열 수 있어요.
dbt 아티팩트와 로그에 프로그래밍 방식 접근 DBT_PROJECT_EXECUTION_HISTORY 테이블 함수와 dbt 시스템 함수를 사용해 dbt 아티팩트와 로그에 프로그래밍 방식으로 접근해요.

출처: Snowflake 문서

본문

dbt 프로젝트 객체 모니터링 기능 활성화

dbt 프로젝트 객체의 모니터링 기능을 활성화하려면 다음 SQL 예시처럼 dbt 프로젝트 객체가 생성된 데이터베이스와 스키마에 LOG_LEVEL, TRACE_LEVEL, METRIC_LEVEL을 설정하세요.

ALTER SCHEMA my_db.my_dbt_project_schema SET LOG_LEVEL = 'INFO';

ALTER SCHEMA my_db.my_dbt_project_schema SET TRACE_LEVEL = 'ALWAYS';

ALTER SCHEMA my_db.my_dbt_project_schema SET METRIC_LEVEL = 'ALL';

dbt 프로젝트 객체의 예약 실행 모니터링

태스크를 사용해 배포된 dbt 프로젝트 객체를 스케줄로 실행하고, 태스크가 dbt 프로젝트 객체와 같은 스키마에 있다면 Connect를 선택한 다음 View Schedules를 선택해 워크스페이스에서 직접 예약 태스크를 볼 수 있어요.

📌 이 기능은 dbt 프로젝트 객체에 연결된 워크스페이스에서만 사용할 수 있어요.

워크스페이스에서 dbt 프로젝트 객체의 예약 실행을 모니터링하려면:

  1. 프로젝트 창 오른쪽의 dbt 프로젝트 메뉴의 Scheduled runs 아래에서 View schedules를 선택해요.
  2. 목록에서 검사할 스케줄(태스크)을 선택한 다음 View details를 선택해요. 태스크의 정보 창이 열리며, Task details, 태스크 Graph(해당하는 경우), 이 태스크의 Run History를 볼 수 있어요. 자세한 내용은 Snowsight에서 태스크와 태스크 그래프 보기 문서를 참조하세요.
  3. 목록의 예약된 dbt 프로젝트 객체 실행에 대한 Run History에서 맨 오른쪽의 Open query history 버튼을 선택해 실행의 쿼리 세부 정보, 쿼리 프로필, 쿼리 원격 측정을 봐요. 자세한 내용은 특정 쿼리의 세부 정보와 프로필 검토 문서를 참조하세요.

Snowsight에서 dbt 프로젝트 객체 모니터링

dbt 프로젝트 객체 실행에 대한 자세한 모니터링 정보를 보려면 Snowsight에서 Transformations » dbt Projects로 이동해요. dbt 프로젝트 객체의 모니터링 정보를 보려면 MONITOR 권한이 있는 역할을 사용해야 해요.

자세한 내용은 dbt Projects on Snowflake 접근 제어 문서를 참조하세요.

  1. 탐색 메뉴에서 Transformation » dbt Projects를 선택해요. 히스토그램이 dbt 프로젝트 객체 실행 빈도와 실행된 프로젝트 목록을 보여줘요. dbt 프로젝트 객체 목록에는 다음 정보를 가진 컬럼이 포함돼요. 날짜 범위, 명령, 실행 상태로 목록을 필터링할 수 있어요.
    • PROJECT - dbt 프로젝트 객체의 이름과 선택된 기간의 실행(런) 수.
    • LAST COMMAND - 마지막 실행에서 실행된 dbt 명령.
    • LAST RUN STATUS - 실행 결과: Succeeded, Executing, 또는 Failed.
    • LAST RUN - 마지막 실행 이후 경과 시간. 정렬 순서를 바꾸려면 컬럼 헤더를 선택해요. 기본적으로 가장 최근 실행이 먼저 표시돼요.
    • PREVIOUS RUNS - 선택된 기간의 상태별 실행 수.
    • DATABASE 및 SCHEMA - dbt 프로젝트 객체가 저장된 데이터베이스와 스키마.
    • LAST RUN PARAMETERS - 마지막 dbt 프로젝트 객체 실행에 대해 EXECUTE DBT PROJECT 명령에 지정된 dbt 명령줄 인수(ARGS).
  2. 개별 프로젝트 실행을 검사하려면 목록에서 dbt 프로젝트 객체를 선택해요. 해당 dbt 프로젝트 객체에 대해 Horizon Catalog Explorer의 dbt 프로젝트 객체 세부 정보 페이지가 열려요. Run History 탭이 기본으로 선택되며, 선택된 기간의 각 작업 실행에 대해 다음 정보가 표시돼요: COMMAND - 마지막 실행에서 실행된 dbt 명령. STATUS - 실행 결과: Succeeded, Executing, 또는 Failed. RUN TIME - 마지막 실행 이후 경과 시간. 정렬 순서를 바꾸려면 컬럼 헤더를 선택해요. 기본적으로 가장 최근 실행이 먼저 표시돼요. PARAMETERS - 마지막 dbt 프로젝트 객체 실행에 대해 EXECUTE DBT PROJECT 명령에 지정된 dbt 명령줄 인수(ARGS).
  3. 실행 세부 정보를 보려면 목록에서 선택해요. 실행된 EXECUTE DBT PROJECT 쿼리에 대한 Query Details 페이지가 열려요. 이 페이지에는 다음 탭이 포함돼요. Query Details - 실행 상태, 시작 시간, 종료 시간, 지속 시간, 웨어하우스 크기, 쿼리 ID, EXECUTE DBT PROJECT 명령의 SQL 텍스트를 표시해요. 또한 실행된 dbt 명령(예: build)의 모델별 결과를 보여줘요. 각 모델 이름, 소요 시간, 상태를 포함해요. Query Profile - 쿼리 실행 계획과 성능 통계를 보여줘요. Query Telemetry - 실행의 원격 측정(telemetry) 데이터를 보여줘요. DAG - 실행 중 실행된 모델과 그 결과를 시각화해요. 자세한 내용은 쿼리 기록 DAG 보기 문서 및 특정 쿼리의 세부 정보와 프로필 검토 문서를 참조하세요.

쿼리 기록(query history) DAG 보기

dbt 프로젝트 객체 실행의 Query Details에는 실행 중 무엇이 실행됐는지와 각 모델의 결과를 시각화하는 DAG 탭이 포함돼요. 프로젝트 세부 정보 페이지의 모델, 테스트, 소스 및 의존성을 포함한 프로젝트 문서 레이어 역할을 하는 DAG와는 다르다.

쿼리 기록 DAG는 실행 중 생성된 manifest.json과 run_results.json 아티팩트로 구축돼요. DAG에서 노드를 선택하면 특정 쿼리의 세부 정보(쿼리 ID와 쿼리가 실패했다면 오류 메시지 포함)가 있는 사이드 패널이 열려요. 사이드 패널은 또한 모델 실행의 런타임 세부 정보를 보여줘요:

  • 모델 실행의 시작 시간, 종료 시간, 지속 시간.
  • 데이터베이스의 target 객체 링크.
  • 모델 실행의 쿼리 ID.
  • 모델이 실패했다면 오류 메시지.

쿼리 기록 DAG는 프로젝트 세부 정보 DAG와 같은 검색 바, 깊이 컨트롤, 컬럼 수준 혈통을 지원해요: 아무 노드에서 Show columns를 선택해 컬럼 목록을 펼친 다음 컬럼을 선택해 그 컬럼을 사용하는 모든 업스트림·다운스트림 모델을 강조 표시해요. 각 DAG 노드 유형 설명을 포함한 DAG 상호작용의 전체 세부 정보는 dbt 프로젝트 객체 보기 및 관리 문서를 참조하세요.

쿼리 기록 DAG를 보려면:

  1. 탐색 메뉴에서 Transformations » dbt Projects를 선택해요.
  2. dbt 프로젝트 객체 목록에서 프로젝트를 선택해요.
  3. Run History 탭에서 실행을 선택해 그 실행의 Query Details를 열어요.
  4. DAG 탭을 선택해요.

📌 쿼리 기록 DAG가 "No data available"을 보여주면 실행이 run_results.json이 생성되기 전에 실패했을 가능성이 높아요. 자세한 내용은 쿼리 기록 DAG 제한 사항 문서를 참조하세요.

배포 메타데이터 검사

SHOW DBT PROJECTS 또는 DESCRIBE DBT PROJECT를 사용해 dbt 프로젝트 객체의 last_deployed_from 컬럼을 검사해요. 이 컬럼은 가장 최근 배포를 설명하며 git_url 또는 stage_url, git_commit, git_branch, user, timestamp 필드를 포함할 수 있어요. 배포 메타데이터가 기록되지 않으면 NULL을 반환해요.

GitHub Actions에서 snow dbt deploy로 배포할 때 Snowflake CLI는 저장소 URL, 커밋, 브랜치를 자동으로 캡처해요. 다른 CI 러너에서는 --git-url, --git-commit, --git-branch를 명시적으로 전달하세요. Snowflake는 URL을 배포 메타데이터에 저장하므로 사용자 이름, 비밀번호, 접근 토큰이 없는 저장소의 웹 URL을 사용하세요.

dbt 아티팩트와 로그에 프로그래밍 방식 접근

DBT_PROJECT_EXECUTION_HISTORY 테이블 함수와 다음 시스템 함수를 사용해 dbt 아티팩트와 로그에 프로그래밍 방식으로 접근해요.

📌 이 페이지에서 설명하는 일부 기능은 가변 live 버전을 사용하는 dbt 프로젝트 객체가 필요해요. live 버전 객체를 얻으려면 2026_06 동작 변경 번들에 옵트인하거나, Snowflake 계정 담당자에게 별도의 단일 live 버전 기능을 활성화하도록 요청하세요. 그런 다음 객체를 생성하거나 교체하고, 기존 버전 객체는 SYSTEM$MIGRATE_DBT_PROJECT로 마이그레이션하세요. 자세한 내용은 dbt 프로젝트 객체의 단일 가변 live 버전으로의 마이그레이션 문서를 참조하세요.

이 섹션의 시스템 함수는 EXECUTE DBT PROJECT 실행에서 아티팩트와 로그를 검색해요. 배포 중 자동 컴파일은 쿼리별 실행 결과를 만들지 않으므로 이 함수들로 그 아티팩트를 검색할 수 없어요. Snowflake는 DEFAULT_WRITEBACK 또는 WRITEBACK과 관계없이 각 실행에 대해 별도의 쿼리별 결과 아티팩트와 아카이브를 저장해요.

SYSTEM$DBT_GET_LAST_SUCCESSFUL_RUN_TARGET, SYSTEM$DBT_GET_LAST_FAILED_RUN_TARGET, 또는 SYSTEM$DBT_GET_LAST_RUN_TARGET을 사용해 dbt 프로젝트 객체의 최근 실행에서 재사용 가능한 dbt 아티팩트를 검색해요. 예를 들어 Slim CI는 SYSTEM$DBT_GET_LAST_SUCCESSFUL_RUN_TARGET을 사용해 프로덕션 객체에서 dbt 아티팩트를 검색해요. 이 함수들은 참조된 dbt 프로젝트 객체에 MONITOR가 필요하며, 그 객체는 지난 7일 이내에 자격 있는 실행이 한 번 이상 있어야 해요.

알려진 쿼리의 아티팩트는 쿼리 ID와 함께 SYSTEM$LOCATE_DBT_ARTIFACTS 또는 SYSTEM$LOCATE_DBT_ARCHIVE를 사용해요. 특정 실행의 결과를 조사하거나 임포트할 때 이 시스템 함수들을 사용하세요.

📌 Information Schema 테이블 함수는 데이터를 7일간 보관해요. 더 긴 보관(365일)은 Account Usage 뷰인 DBT_PROJECT_EXECUTION_HISTORY를 사용하세요.

함수 반환하는 것 일반적인 용도 비고
SYSTEM$GET_DBT_LOG 텍스트 로그 출력(실행의 로그 꼬리) SQL에서 빠른 디버깅. 예: 파일을 다운로드하지 않고 오류와 경고 보기. 로그 내용을 반환하며 만들거나 이동하는 것이 없음.
SYSTEM$LOCATE_DBT_ARTIFACTS manifest.json과 로그 같은 아티팩트 파일을 포함한 폴더 경로(예: snow://…/results/query_id_…/). 컴파일된 SQL 파일은 dbt_artifacts.zip 안에서만 사용 가능. LIST, GET, COPY FILES로 특정 파일 탐색·복사. 단순 위치(URL)일 뿐이며, 가져오려면 여전히 GET/COPY FILES를 실행해야 함.
SYSTEM$LOCATE_DBT_ARCHIVE 단일 ZIP 파일 URL(예: …/dbt_artifacts.zip). 한 파일을 다운로드하고 싶을 때 편리(예: GET 사용). GET '<url>' file:///local/dir로 다운로드.
SYSTEM$DBT_GET_LAST_SUCCESSFUL_RUN_TARGET 지정된 dbt 프로젝트 객체의 최근 성공 실행의 dbt 아티팩트. Slim CI용 프로덕션 dbt 아티팩트 가져오기. 참조된 dbt 프로젝트 객체에 MONITOR 필요.
SYSTEM$DBT_GET_LAST_FAILED_RUN_TARGET 지정된 dbt 프로젝트 객체의 최근 실패 실행의 dbt 아티팩트. 결과 셀렉터로 실패한 실행에서 복구. 참조된 dbt 프로젝트 객체에 MONITOR 필요.
SYSTEM$DBT_GET_LAST_RUN_TARGET 가장 최근 완료된(성공 또는 실패) 실행의 dbt 아티팩트. 가장 최근 완료 실행에서 dbt 아티팩트 가져오기. 참조된 dbt 프로젝트 객체에 MONITOR 필요.

results 디렉터리 내용

실행 결과는 snow://dbt/<database>.<schema>.<project>/results/query_id_<query_id>/에 저장돼요. 디렉터리는 실행의 target 및 log 디렉터리에 있을 때 다음 독립 파일들과 결과 아카이브를 포함해요:

results 디렉터리 기준 상대 경로 내용
target/manifest.json 프로젝트 리소스와 그 관계. state 비교와 defer에 사용.
target/semantic_manifest.json dbt가 생성한 시맨틱 정의.
target/run_results.json dbt 명령의 결과. result: 셀렉터에 사용.
target/sources.json 소스 신선도(source freshness) 결과. source_status: 셀렉터에 사용.
logs/dbt.log 현재 실행의 dbt 로그만. 누적 로그나 전체 logs 디렉터리가 아님.
dbt_artifacts.zip 컴파일된 SQL과 별도로 업로드되지 않은 파일을 포함한 target·logs 디렉터리의 전체 내용. 아카이브된 dbt 로그는 현재 실행으로 범위가 지정됨.

Snowflake는 실행의 target·logs 디렉터리에서 위 표에 나열된 독립 파일만 업로드해요. 모든 명령이 모든 파일을 생성하지는 않아요. 예를 들어 compile은 sources.json을 생성하지 않지만, sources.json이 live 버전의 target 디렉터리에 이미 존재하면 쿼리의 아티팩트에 여전히 나타나요. 실행이 결과를 업로드하기 전에 실패하면 파일을 사용할 수 없을 수 있어요.

SYSTEM$LOCATE_DBT_ARTIFACTS는 results 디렉터리 위치를 반환하고, SYSTEM$LOCATE_DBT_ARCHIVE는 ZIP 파일 위치를 반환해요. 이 함수들은 파일을 찾아줄 뿐 다운로드하거나 생성하지 않아요. 반환된 위치를 검사하려면 LIST를, 파일을 다운로드하려면 GET을 사용하세요.

SYSTEM$DBT_GET_LAST_*_RUN_TARGET 함수는 대신 실행 기록을 검색해 일치하는 실행의 target 위치를 반환해요. IMPORTS에서 사용하면 SYSTEM$DBT_GET_LAST_*_RUN_TARGET 함수는 독립 target 아티팩트를 임포트해요. SYSTEM$LOCATE_DBT_ARTIFACTS는 dbt_artifacts.zip을 포함한 results 디렉터리를 임포트하지만 ZIP 파일은 추출하지 않아요. SYSTEM$LOCATE_DBT_ARCHIVE는 아카이브를 추출해요. state 경로와 예시에 대해서는 문서를 참조하세요.

소스 신선도 실행과 검색 예시는 소스 신선도 결과 검색 문서를 참조하세요.

로그 가져오기 및 최신 dbt 프로젝트 쿼리의 ZIP 파일 다운로드

다음 예시는 Snowflake의 dbt 실행 기록을 쿼리해 dbt 프로젝트 객체의 가장 최근 쿼리 ID를 보여줘요. 그 실행의 로그 출력을 가져오고 그 실행의 압축된 dbt 아티팩트 위치를 반환해요.

Snowflake CLI 예시는 GET을 사용해 아티팩트 ZIP 파일이나 특정 파일(manifest.json처럼)을 로컬 폴더로 다운로드해요.

Snowsight에서 ZIP 파일을 다운로드하려면 Transformations » dbt Projects로 이동해 프로젝트를 선택한 다음 실행을 선택해 Query Details로 이동하고 dbt Output 아래의 Download Build Artifacts를 선택하세요.

dbt 프로젝트 객체에 OWNERSHIP, USAGE, 또는 MONITOR 권한이 있는 역할을 사용해야 해요.

💡 가능하면 DATABASE, SCHEMA, OBJECT_NAME 같은 함수 인수를 사용해 결과를 필터링하세요. 이 필터는 RESULT_LIMIT(기본 100행)보다 먼저 적용되므로, 잠재적으로 잘린 결과 집합을 WHERE 절로 필터링하는 대신 가장 관련성 높은 결과를 얻을 수 있어요.

-- 가장 최근 dbt 프로젝트 객체 실행 조회
SET latest_query_id = (
  SELECT query_id
  FROM TABLE(SNOWFLAKE.INFORMATION_SCHEMA.DBT_PROJECT_EXECUTION_HISTORY(
     DATABASE => 'ANALYTICS_DB',
     SCHEMA => 'DBT_PROD',
     OBJECT_NAME => 'FINANCE_ANALYTICS'
  ))
  ORDER BY query_end_time DESC
  LIMIT 1
);

-- 가장 최근 dbt 프로젝트 객체 실행의 dbt run 로그 가져오기
SELECT SYSTEM$GET_DBT_LOG($latest_query_id);
============================== 15:14:53.100781 | 46d19186-61b8-4442-8339-53c771083f16 ==============================
[0m15:14:53.100781 [info ] [Dummy-1   ]: Running with dbt=1.9.4
...
[0m15:14:58.198545 [debug] [Dummy-1   ]: Command `cli run` succeeded at 15:14:58.198121 after 5.19 seconds

dbt 프로젝트 객체 실행 아티팩트를 Snowflake가 저장한 스테이지 경로를 보려면 SYSTEM$LOCATE_DBT_ARTIFACTS 함수를 사용하세요. 그런 다음 그 경로를 GET 또는 COPY FILES와 함께 사용해 manifest.json과 로그 같은 파일을 다운로드할 수 있어요. 컴파일된 SQL 파일은 dbt_artifacts.zip 아카이브 안에서만 사용할 수 있어요.

-- dbt 프로젝트 객체 실행 아티팩트 디렉터리 가져오기
SELECT SYSTEM$LOCATE_DBT_ARTIFACTS($latest_query_id);
+-------------------------------------------------------------------------------------------------+
| SYSTEM$LOCATE_DBT_ARTIFACTS($LATEST_QUERY_ID)                                                   |
+-------------------------------------------------------------------------------------------------+
| snow://dbt/TESTDBT.PUBLIC.MY_DBT_PROJECT/results/query_id_01c01096-010c-0ccb-0000-a99506bd199e/ |
+-------------------------------------------------------------------------------------------------+
-- dbt 실행의 모든 파일 나열
ls 'snow://dbt/TESTDBT.PUBLIC.MY_DBT_PROJECT/results/query_id_01bf3f5a-010b-4d87-0000-53493abb7cce/';

또한 새 내부 스테이지를 만들고, 지정된 dbt 프로젝트 객체 실행의 아티팩트에 대한 Snowflake 관리 경로를 찾은 다음, 다음 예시처럼 검색을 위해 그 아티팩트를 스테이지로 복사할 수도 있어요.

CREATE OR REPLACE STAGE my_dbt_stage ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');

SELECT SYSTEM$LOCATE_DBT_ARTIFACTS($latest_query_id);
snow://dbt/TESTDBT.PUBLIC.MY_DBT_PROJECT/results/query_id_01bf51c1-010b-5676-0000-53493ae6db02/
COPY FILES INTO @my_dbt_stage/results/
  FROM 'snow://dbt/TESTDBT.PUBLIC.MY_DBT_PROJECT/results/query_id_01bf51c1-010b-5676-0000-53493ae6db02/';
results/dbt_artifacts.zip
results/logs/dbt.log
results/target/manifest.json
results/target/semantic_manifest.json
snowsql -q "SELECT query_id
   FROM TABLE(SNOWFLAKE.INFORMATION_SCHEMA.DBT_PROJECT_EXECUTION_HISTORY(
     DATABASE => 'ANALYTICS_DB',
     SCHEMA => 'DBT_PROD',
     OBJECT_NAME => 'FINANCE_ANALYTICS'
   ))
   ORDER BY query_end_time DESC LIMIT 1;"
snowsql -q "SELECT SYSTEM\$GET_DBT_LOG('01bf3f89-0300-0001-0000-0000000c1229')"
| ============================== 11:17:39.152234 | 4df65841-7aa3-40e2-81cb-2007c09c2b81
| 11:17:39.152234 [info ] [Dummy-1   ]: Running with dbt=1.9.4
....
snowsql -q "SELECT SYSTEM\$LOCATE_DBT_ARCHIVE('01bf3f89-0300-0001-0000-0000000c1229')"
snow://dbt_project/TESTDBT.PUBLIC.MY_DBT_PROJECT/results/query_id_01bf3f89-0300-0001-0000-0000000c1229/dbt_artifacts.zip
snowsql -q "GET 'snow://dbt_project/TESTDBT.PUBLIC.MY_DBT_PROJECT/results/query_id_01bf3f89-0300-0001-0000-0000000c1229/dbt_artifacts.zip' file:///Users/user_name/Code/temp"
Type SQL statements or !help
+-----------------------------------------------------------------+--------+------------+-----
| file                                                            |   size | status    | ....
|-----------------------------------------------------------------+--------+------------+-----
| query_id_01bf3f89-0300-0001-0000-0000000c1229/dbt_artifacts.zip | 137351 | DOWNLOADED |...
+-----------------------------------------------------------------+--------+------------+-----

📌 dbt 로그 파일(dbt.log)은 기본적으로 debug 레벨로 기록되어 내부 dbt 엔진 세부 정보를 포함한 장황한 출력을 생성해요. 덜 장황한 출력을 원하면 EXECUTE DBT PROJECT의 ARGS에 --log-level-file info를 전달하세요. 자세한 내용은 지원되는 dbt 명령과 플래그 문서를 참조하세요.

dbt 프로젝트 실행 이벤트용 이벤트 테이블 쿼리

모니터링 기능을 활성화한 후 Snowflake는 각 dbt 프로젝트 객체 실행에 대한 로그 항목과 추적 span을 계정의 활성 이벤트 테이블에 기록해요. dbt 프로젝트 객체가 여전히 실행 중일 때 이벤트 테이블을 쿼리해 진행 상황을 라이브로 관찰하거나, 실행이 완료된 후 실패를 진단할 수 있어요.

📌 이벤트 테이블 항목은 이벤트 발생 시점부터 최대 10초 지연과 함께 나타날 수 있어요. 라이브 실행 중에 쿼리한다면 최근 이벤트가 즉시 보이지 않을 수 있어요.

📌 이 섹션의 예시는 기본 이벤트 테이블인 SNOWFLAKE.TELEMETRY.EVENTS를 사용해요. 계정이나 데이터베이스가 커스텀 이벤트 테이블을 사용한다면 이 쿼리에서 테이블 참조를 바꾸세요. 활성 이벤트 테이블을 찾으려면 다음 중 하나를 실행해요:

SHOW PARAMETERS LIKE 'EVENT_TABLE' IN ACCOUNT;

SHOW PARAMETERS LIKE 'EVENT_TABLE' IN DATABASE my_db;

📌 이 쿼리들을 실행하기 전에 dbt 프로젝트 객체가 배포된 스키마에서 모니터링 기능을 활성화했는지 확인하세요.

라이브 실행 모니터링

dbt 프로젝트 객체가 여전히 실행 중일 때 이벤트 테이블을 쿼리하려면 실행을 비동기로 시작해 쿼리 ID를 즉시 받아요. 그런 다음 그 쿼리 ID를 사용해 별도 세션에서 이벤트 테이블 결과를 필터링해요.

Snowflake CLI에서는 --run-async 플래그를 사용해요:

snow dbt execute --run-async MY_DB.MY_SCHEMA.MY_DBT_PROJECT run

명령은 다음과 같은 출력과 함께 즉시 반환돼요:

Command submitted. You can check the result with
`snow sql -q "select execution_status from table(information_schema.query_history_by_user())
where query_id in ('01c5a039-c81a-619f-0000-53495cc5c5a2');"`

출력에서 쿼리 ID를 복사한 다음 별도 워크시트나 세션에서 이벤트 테이블을 쿼리해요.

순수 SQL에서 작업한다면 실행 기록에서 가장 최근 실행의 쿼리 ID도 얻을 수 있어요:

SET latest_query_id = (
  SELECT query_id
  FROM TABLE(SNOWFLAKE.INFORMATION_SCHEMA.DBT_PROJECT_EXECUTION_HISTORY(
    DATABASE => 'MY_DB',
    SCHEMA => 'MY_SCHEMA',
    OBJECT_NAME => 'MY_DBT_PROJECT'
  ))
  ORDER BY query_end_time DESC
  LIMIT 1
);

쿼리 ID를 사용해 이벤트 테이블을 필터링하고, 실행이 진행됨에 따라 새 로그 항목을 보기 위해 주기적으로 쿼리해요.

dbt 프로젝트 실행 중 또는 후에 로그 쿼리

다음 쿼리는 특정 dbt 프로젝트 객체에 대한 로그 항목을 가장 최근부터 반환해요. 프로젝트가 실행 중일 때 이 쿼리를 실행해 진행 상황을 라이브로 모니터링할 수 있어요:

SELECT
  TIMESTAMP,
  RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING AS project_name,
  RECORD:"severity_text"::STRING AS severity,
  VALUE::STRING AS message
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE
  RESOURCE_ATTRIBUTES:"snow.executable.type"::STRING = 'DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING = 'MY_DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.query.id"::STRING = '<query_id>'
  AND SCOPE:"name"::STRING = 'snow.dbt.logger'
ORDER BY TIMESTAMP ASC
LIMIT 500;

심각도별 로그 필터링

dbt 프로젝트 실행에서 오류나 경고만 분리하려면:

SELECT
  TIMESTAMP,
  RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING AS project_name,
  RECORD:"severity_text"::STRING AS severity,
  VALUE::STRING AS message
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE
  RESOURCE_ATTRIBUTES:"snow.executable.type"::STRING = 'DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING = 'MY_DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.query.id"::STRING = '<query_id>'
  AND SCOPE:"name"::STRING = 'snow.dbt.logger'
  AND RECORD:"severity_text"::STRING IN ('ERROR', 'WARN')
ORDER BY TIMESTAMP ASC
LIMIT 500;

특정 실행의 추적 span 쿼리

실행 단계와 그 지속 시간을 보여주는 추적 span을 보려면:

SELECT
  TIMESTAMP,
  RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING AS project_name,
  RECORD:"name"::STRING AS span_name,
  DATEDIFF('millisecond', START_TIMESTAMP, TIMESTAMP) AS duration_ms
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE
  RECORD_TYPE = 'SPAN'
  AND RESOURCE_ATTRIBUTES:"snow.executable.type"::STRING = 'DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING = 'MY_DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.query.id"::STRING = '<query_id>'
ORDER BY TIMESTAMP ASC
LIMIT 500;

결과를 시간 창으로 범위 지정

마지막 1시간으로 결과를 좁히려면(실행 중 또는 직후에 유용):

SELECT
  TIMESTAMP,
  RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING AS project_name,
  RECORD:"severity_text"::STRING AS severity,
  VALUE::STRING AS message
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE
  RESOURCE_ATTRIBUTES:"snow.executable.type"::STRING = 'DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING = 'MY_DBT_PROJECT'
  AND RESOURCE_ATTRIBUTES:"snow.query.id"::STRING = '<query_id>'
  AND SCOPE:"name"::STRING = 'snow.dbt.logger'
  AND TIMESTAMP > DATEADD('hour', -1, CURRENT_TIMESTAMP())
ORDER BY TIMESTAMP ASC
LIMIT 500;

로그를 추적 span과 상관시키기

TRACE_ID를 사용해 로그 메시지를 그 메시지가 속한 span과 연결해요. 이렇게 하면 어떤 실행 단계가 특정 로그 항목을 생성했는지 이해하는 데 도움이 돼요:

SELECT
  logs.TIMESTAMP,
  logs.RECORD:"severity_text"::STRING AS severity,
  logs.VALUE::STRING AS message,
  spans.RECORD:"name"::STRING AS span_name
FROM SNOWFLAKE.TELEMETRY.EVENTS AS logs
JOIN SNOWFLAKE.TELEMETRY.EVENTS AS spans
  ON logs.TRACE:trace_id::STRING = spans.TRACE:trace_id::STRING
  AND logs.TRACE:span_id::STRING = spans.TRACE:span_id::STRING
WHERE
  logs.RECORD_TYPE = 'LOG'
  AND spans.RECORD_TYPE = 'SPAN'
  AND logs.RESOURCE_ATTRIBUTES:"snow.executable.type"::STRING = 'DBT_PROJECT'
  AND logs.RESOURCE_ATTRIBUTES:"snow.executable.name"::STRING = 'MY_DBT_PROJECT'
  AND logs.RESOURCE_ATTRIBUTES:"snow.query.id"::STRING = '<query_id>'
  AND logs.SCOPE:"name"::STRING = 'snow.dbt.logger'
  AND logs.TIMESTAMP > DATEADD('hour', -1, CURRENT_TIMESTAMP())
ORDER BY logs.TIMESTAMP ASC
LIMIT 500;

더 알아보기 (Learn more)