메인 콘텐츠로 건너뛰기
쓰기 전 로그(WAL)는 API 요청을 서버로 보내기 전에 디스크에 저장합니다. 기본적으로 클라이언트는 요청을 메모리에 버퍼링하므로 프로세스가 예기치 않게 종료되면 버퍼링된 데이터가 손실됩니다. Weave의 WAL은 요청을 전송하기 전에 디스크에 기록해 이 문제를 해결합니다. WAL을 활성화하면 클라이언트는 먼저 각 API 요청을 로컬 JSONL 파일에 기록한 다음, 해당 파일의 내용을 서버로 플러시합니다. 프로세스가 비정상 종료되거나 서버에 연결할 수 없는 경우에도 데이터는 디스크에 남아 있으며, 클라이언트가 다시 실행되면 자동으로 전송됩니다. WAL은 특히 프로세스가 중단되거나 서버를 일시적으로 사용할 수 없는 환경에서 유용합니다:
  • 컨테이너 오케스트레이션: 백그라운드 스레드가 트레이스 업로드를 마치기 전에 축출되거나 OOM으로 종료될 수 있는 파드 환경
  • 분산 트레이닝: 여러 프로세스가 병렬로 트레이스를 기록하며, 그중 하나의 프로세스라도 실패할 수 있는 환경
  • 불안정한 네트워크: Weave 서버 연결이 간헐적으로 끊기는 환경
  • 배치 작업: 비정상 종료로 트레이스 데이터가 손실되면 부담이 큰 장시간 실행 작업
서버리스 함수처럼 수명이 짧은 환경에서는 프로세스가 종료되기 전에 weave.flush() 또는 weave.finish()를 호출해 모든 데이터가 업로드되도록 하는 것도 고려하세요. 자세한 내용은 워커 프로세스에서의 트레이스 데이터 손실을 참조하세요.
쓰기 전 로그는 현재 옵트인 기능입니다. 향후 릴리스에서는 기본적으로 활성화될 예정입니다.

쓰기 전 로그 활성화

WAL을 활성화하려면 WEAVE_ENABLE_WAL 환경 변수를 true로 설정하세요:
export WEAVE_ENABLE_WAL=true
Python에서 weave.init()를 호출하기 전에 이를 설정할 수도 있습니다:
import os
os.environ["WEAVE_ENABLE_WAL"] = "true"
추가적인 코드 변경은 필요하지 않습니다. WAL은 기존 Weave Tracing 코드와도 별도 수정 없이 그대로 작동합니다.

작동 방식

WAL이 활성화되면 다음과 같이 동작합니다.
  1. Weave API에 대한 각 호출(객체 생성, 호출 시작, 호출 종료 등)은 메모리에만 유지되지 않고 디스크의 JSONL 파일에 추가됩니다.
  2. 각 프로세스는 자체 로그 파일에 기록하므로 병렬 프로세스 간에 충돌이 발생하지 않습니다.
  3. 백그라운드 전송기가 로그 파일을 읽어 해당 내용을 Weave 서버로 전송합니다.
  4. 데이터가 성공적으로 전송되면 로그 파일이 제거됩니다.
로그 파일은 작업 디렉터리 내의 .weave/wal/에 저장되며, 엔터티와 프로젝트별로 구성됩니다. 각 파일에는 원시 API 요청이 JSON 객체 형식으로 한 줄에 하나씩 들어 있습니다. 클라이언트가 시작되면 이전 실행에서 생성된 기존 로그 파일이 있는지 확인합니다. 발견되면 전송기가 새 데이터와 함께 해당 파일도 전송합니다. 즉, 비정상 종료된 프로세스가 기록한 데이터는 다음에 클라이언트가 실행될 때 자동으로 복구됩니다.

환경 변수

변수유형기본값설명
WEAVE_ENABLE_WALboolfalse쓰기 전 로그를 활성화합니다. true로 설정하면 Weave는 API 요청을 서버로 보내기 전에 먼저 로컬 디스크에 기록합니다.
WEAVE_DISABLE_WAL_SENDERboolfalseWAL sender를 비활성화합니다. true로 설정하면 Weave는 요청을 로컬 디스크에 기록하지만 서버로 전송하지 않습니다. 디버깅에 유용합니다.
Weave에서 사용 가능한 모든 환경 변수 목록은 environment variables 레퍼런스 페이지를 참조하세요.