마지막 업데이트 2026-07-22
ppi-socket-prod 로그로 대조한 재현 경로 문서다. 결론은 영상 시작 이벤트는 서버에 도달했지만
guest-video-end가 0건이고, 이후 진행자가 Host changed step으로 수동 전환했다는 것이다.
| 대상 | 아동247 24회기 · 2026-06-23 · prod · 진행자 엘리스 |
| roomId | 77b062db-a06e-4e7e-8987-d4ae1d26a5a3_24 |
| 아동 세션 | LogRocket guest session — 아동247, Edge 149 / Windows 11 |
| 진행자 세션 | LogRocket facilitator session — 엘리스, Chrome 148 / macOS |
| Grafana | ppi-socket — ppi-socket-prod, env=prod, service=ppi-socket, 조회 범위 2026-06-23 20:28~20:58 KST |
| 판정 | 재현 경로 확정 영상 시작 있음 → guest-video-end 없음 → 진행자 수동 step 변경 |
Guest video play started가 ppi-socket에 기록됨guest-video-end, video-end, video ended 검색 0건onEnd → goToNextStep() 경로가 실행되지 않은 상태Host changed step가 먼저 찍히고 직후 Guest step update가 따라옴autoTransitionEnabled: true 상태에서 영상 활동 시작으로 관찰.DISCONNECTED 상태였다가 수업 시작 전 연결 복구.대시보드 쿼리 구조는 {service="$service", env=~"$env", instance=~"$instance"} !~ "/health|/metrics"이며,
아래 roomId 문자열로 Loki query_range를 직접 조회했다.
{service="ppi-socket", env=~"prod", instance=~".*"} |= "77b062db-a06e-4e7e-8987-d4ae1d26a5a3_24"
| 검색어 | 결과 | 의미 |
|---|---|---|
Guest video play started | 9건 | 영상 step 시작/재생 시작 이벤트는 서버까지 도달. |
guest-video-end, video-end, video end, video ended, guest-video | 0건 | 영상 종료 이벤트는 ppi-socket에 도달하지 않음. |
Host changed step | 2건 | 자동 전환 대신 진행자 수동 step 변경이 발생. |
disconnect | 수업 종료 부근 5건 | 11:55:49Z 이후 cleanup. 실패 시점의 직접 원인은 아님. |
Producer/Consumer | 생성 로그 존재 | 아동 Producer ↔ 진행자 Consumer 연결 흐름 자체는 생성됨. |
{"msg":"Guest video play started in room 77b062db-a06e-4e7e-8987-d4ae1d26a5a3_24","prefix":"SFU-SessionHandlers","data":{"serverTimestamp":1782214258742}}
첫 영상 step 시작은 서버가 받았다.
{"msg":"Host changed step in room 77b062db-a06e-4e7e-8987-d4ae1d26a5a3_24","prefix":"SFU-SessionHandlers","data":{"activityIndex":0,"stepIndex":1,"stepType":"full:video","mediaType":"resource:video_pingpong16_new_hi_nomal_0"}}
guest-video-end 없이 Host changed step가 먼저 찍혔으므로 자동 전환이 아니라 진행자 수동 전환이다.
{"msg":"Guest step update in room 77b062db-a06e-4e7e-8987-d4ae1d26a5a3_24","prefix":"SFU-SessionHandlers","data":{"activityIndex":0,"stepIndex":1,"layoutMode":"full:video"}}
host step change 11ms 뒤 게스트 상태가 따라온다. 순서상 자동 전환이 아니다.
{"msg":"Host changed step in room 77b062db-a06e-4e7e-8987-d4ae1d26a5a3_24","prefix":"SFU-SessionHandlers","data":{"activityIndex":2,"stepIndex":0,"stepType":"full:ai","mediaType":""}}
두 번째 수동 전환도 Grafana에서 확인된다.
{"msg":"Guest video play started in room 77b062db-a06e-4e7e-8987-d4ae1d26a5a3_24","prefix":"SFU-SessionHandlers","data":{"serverTimestamp":1782215245385}}
후속 영상들도 시작 이벤트는 계속 올라오지만, 전체 조회 범위에서 종료 이벤트는 0건이다.
MeetVideo.onEnded
→ GuestLayoutContent.handleVideoEnd
→ session.notifyVideoEnd()
→ socket.emit("guest-video-end")
→ autoTransitionEnabled=true이면 session.goToNextStep()
→ guest-step-update
→ ppi-socket broadcast
→ 진행자/monitor 화면 동기화
| 파일 | 라인 | 의미 |
|---|---|---|
apps/web/shared/ui/meet-video.tsx | 232-240 | video native ended가 들어와야 props.onEnd?.() 호출. |
apps/web/shared/ui/guest-layout-content.tsx | 113-118 | onEnd 수신 시 notifyVideoEnd()와 goToNextStep() 실행. |
apps/web/entities/guest-socket/model/use-guest-socket.ts | 398-400 | socket.emit("guest-video-end", { roomId }). |
apps/web/entities/guest-page-session/model/use-guest-page-session.ts | 1078-1108 | 다음 step 계산 및 state 변경. |
apps/socket/src/sfu-socket/handlers/session-handlers.ts | 207-247 | guest-step-update 수신 후 host/monitor로 broadcast. |
apps/web/entities/host-socket/model/use-host-socket.ts | 115-132, 234-242 | 진행자/monitor가 guest step update를 반영. |
guest-video-end가 0건이므로, 서버가 종료 이벤트를 받아놓고 유실한 문제가 아니다.
실패 지점은 아동 클라이언트의 영상 종료 감지 또는 notifyVideoEnd/goToNextStep 호출 이전이다.
autoTransitionEnabled: true인 수업.full:video 또는 resource:video_* step에 진입.Guest video play started는 서버에 도달.guest-video-end가 발생하지 않음./guest에서 입장 후 /client-guest/session으로 진입한다.ppi-socket-prod에 Guest video play started가 찍히는지 확인한다.guest-video-end가 0건이면 실패 상태다.Host changed step가 찍히고 직후 Guest step update가 따라온다.| 가설 | 검증 결과 | 판정 |
|---|---|---|
SFU가 guest-video-end를 받았지만 host/monitor로 전달 실패 |
roomId 기준 guest-video-end 자체가 0건. |
기각 |
진행자/monitor가 guest-step-update를 못 받아서 화면만 안 바뀜 |
실패 구간의 전환은 Host changed step가 먼저이고, 직후 Guest step update가 따라옴. |
기각 |
| 아동 클라이언트에서 video 종료 감지/onEnd 경로가 미호출 | 영상 시작은 서버 도달, 종료 이벤트는 서버 미도달, 진행자가 수동 전환. | 유지 |
| 수업 종료 부근 disconnect가 원인 | disconnect는 11:55:49Z 이후 cleanup. 첫 수동 전환 11:32:41Z, 두 번째 11:46:51Z와 시간상 직접 원인 아님. | 기각 |
MEET_VIDEO, Video ended event fired, Video reached near-end threshold, VideoEndWatchdog, Notifying video ended 실제 문자열 존재 여부를 재확인한다.VideoEndWatchdog가 포함됐는지 배포 태그/커밋을 확인한다. 포함됐는데도 0건이면 watchdog arm 조건 또는 초기 stall/progress 조건을 의심한다.play started 후 expected duration + grace 안에 guest-video-end가 없으면 클라이언트와 ppi-socket 양쪽에 “종료 미도달” 진단 로그를 남긴다.goToNextStep()가 1차 트리거이므로, 서버 로그에서는 guest-video-end 부재가 곧 클라이언트 종료 경로 미도달의 강한 증거다.