관측 (OTel)
세션 진행을 어디서 보는지, 그리고 OTLP 예제 수집기를 띄워 보는 법
Werft는 설정하기 전까지 OpenTelemetry trace를 내보내지 않는다(기본은 꺼짐). 켜는 키는 API 서버 운영 문서에 있다. 아래 예제 수집기는 OTLP를 받는 쪽을 띄워 보는 용도다.
지금 볼 수 있는 곳
| 무엇 | 어디서 |
|---|---|
| 세션에서 일어난 일(모델 답변, 도구 호출과 결과, 권한 요청, 상태 변화) | 이벤트 스트림 GET /v1/sessions/{id}/events(스트리밍 받기) |
| 명령 하나의 결과 | receipt GET /v1/receipts/{id}(receipt) |
| 비용과 token | GET /v1/sessions/{id}/usage(상태와 수명) |
| 서버 상태 | GET /readyz, API·worker의 stdout JSON 로그 |
이벤트는 DB에 저장된 정본이다. 엔진 메시지의 비밀처럼 보이는 값은 저장 전에 [REDACTED]로 가려진다. 이벤트는 그 세션을 볼 수 있는 sessions:read 주체만 읽는다.
curl -sS -w '\n' "$API/readyz"{"status":"ready","checks":{"database":"ok","schema":"ok","config":"ok"}}예제 수집기 띄우기
저장소의 infra/observability/에 수집기 예제가 둘 있다. 둘 다 Werft 스택과 따로 뜨는 compose project이고, 앞에 OpenTelemetry Collector를 두어 OTLP/HTTP를 받는다. 한 컴퓨터에서 확인하는 용도이고 운영 구성이 아니다. 포트는 모두 loopback에만 열린다.
| 예제 | OTLP/HTTP 받는 곳 | 화면 | 받는 신호 |
|---|---|---|---|
Grafana LGTM (infra/observability/lgtm/) | http://127.0.0.1:26318 | http://localhost:26000 | trace, 로그, 메트릭 |
Langfuse (infra/observability/langfuse/) | http://127.0.0.1:25318 | http://localhost:25000 | trace |
아래는 Grafana LGTM이다. 저장소 루트에서 실행한다.
docker compose -p werft-obs-lgtm -f infra/observability/lgtm/compose.yml up -d --wait테스트 trace 보내기
send-test-span.sh는 앞으로 Werft가 보낼 모양의 가짜 trace 하나를 보낸다. werft.turn 아래에 모델 호출(werft.llm_request)과 도구 호출(werft.tool)이 있다. --with-log는 같은 trace에 묶인 로그 한 줄도 보낸다.
infra/observability/send-test-span.sh http://127.0.0.1:26318 --with-log | tee span.txt
TRACE_ID=$(sed -n 's/^trace_id=\([0-9a-f]*\) .*/\1/p' span.txt)trace_id=… session_id=ses_test_…Grafana(http://localhost:26000, 로그인 없음)의 Explore → Tempo에서 trace id로 찾는다. 한 세션의 turn을 모두 보려면 TraceQL { span.werft.session_id = "<session_id>" }로 검색한다. 로그는 Explore → Loki에서 {service_name="werft-api"}로 찾는다. API로도 확인할 수 있다.
until curl -sf "http://127.0.0.1:26000/api/datasources/proxy/uid/tempo/api/traces/$TRACE_ID" -o trace.json; do
sleep 2
done
jq -r '[.batches[].scopeSpans[].spans[].name] | sort | join(" ")' trace.jsonwerft.llm_request werft.tool werft.turn내리기
-v는 저장한 trace까지 지운다.
docker compose -p werft-obs-lgtm -f infra/observability/lgtm/compose.yml down -vLangfuse 예제의 계정과 키, 화면에서 찾는 법은 세션 데이터가 흐르는 길에 있다.
다음 단계
- 스트리밍 받기: 세션 이벤트 받기
- TypeScript SDK