DOCS/troubleshooting/250915_happybell80_rb8001_stats_api_중복_제거.md
happybell80 64a77618fa fix: rb8001 stats API 문서 정확성 수정
- 에러 메시지 위치: brain_service.py:56 (router.py 아님)
- robeing-monitor 경로: /stats/{id} (gateway와 불일치)
- DB 스키마 차이: robeing_id vs robeing_container_id
- 설정값 위치: config.py는 None, state_client.py가 8507 기본값
2025-09-15 19:50:41 +09:00

2.8 KiB

rb8001 Stats API 중복 구현 조사

작성일: 2025-09-15

작성자: happybell80

상태: 조사 완료


현재 상황

에러 메시지

  • 발생 위치: rb8001 brain_service.py
  • 에러: Failed to fetch stats: {e}
  • 파일: /home/happybell/projects/ivada/rb8001/app/brain/brain_service.py:56
  • 참고: router.py의 _load_stats_from_state() 호출은 이미 제거됨

Stats API 엔드포인트 현황

1. rb8001 내부 구현

  • 파일: /home/happybell/projects/ivada/rb8001/app/state/state_service.py
  • GET 엔드포인트: @app.get("/api/stats/{robeing_id}") (67줄)
  • PUT 엔드포인트: @app.put("/api/stats/{robeing_id}") (89줄)
  • DB 모델: RobeingStats (database.py:24-41)
    • 필드: robeing_id, ethics, stat_points 포함
    • 테이블명: "robeing"

2. robeing-monitor 구현 (포트 9024)

  • 파일: /home/happybell/projects/ivada/robeing-monitor/app/state/state_service.py
  • GET 엔드포인트: @app.get("/stats/{robeing_id}") (53줄) - /api 없음
  • PUT 엔드포인트: @app.put("/stats/{robeing_id}") (75줄) - /api 없음
  • DB 모델: RobeingStats (database.py:20-34)
    • 필드: robeing_container_id 사용 (robeing_id 아님)
    • ethics, stat_points 필드 없음
    • 테이블명: "robeing"

3. robeing-gateway 프록시

  • 파일: /home/happybell/projects/ivada/robeing-gateway/app/main.py:304
  • 프록시: f"http://192.168.219.52:9024/api/stats/{robeing_id}"
  • 문제: gateway는 /api/stats/로 프록시하지만 monitor는 /stats/로 서비스

Stats API 호출자

1. rb8001/app/brain/brain_service.py

  • GET 호출: 48줄 f"{settings.STATE_SERVICE_URL}/api/stats/{robeing_id}"
  • PUT 호출: 110줄 f"{settings.STATE_SERVICE_URL}/api/stats/{robeing_id}"
  • 에러 로깅: 56줄 Failed to fetch stats
  • 설정: settings.STATE_SERVICE_URL (config.py:51, 기본값 None)

2. rb8001/app/brain/state_client.py

  • base_url: os.getenv('STATE_SERVICE_URL', 'http://localhost:8507') (17줄)
  • GET 메서드: 25줄 f"{self.base_url}/api/stats/{self.robeing_id}"
  • PUT 메서드: 68줄 f"{self.base_url}/api/stats/{self.robeing_id}"
  • 싱글톤: state_client = StateServiceClient() (168줄)
  • 참고: rb8001 내에서 state_client 직접 사용 흔적 없음

설정값

  • config.py:51: STATE_SERVICE_URL: Optional[str] = None
  • state_client.py:17: os.getenv('STATE_SERVICE_URL', 'http://localhost:8507')

확인된 문제

  1. robeing-monitor 경로: /stats/{id} vs gateway 프록시: /api/stats/{id} 불일치
  2. DB 스키마 차이: rb8001은 robeing_id, monitor는 robeing_container_id
  3. 필드 차이: rb8001은 ethics, stat_points 있음, monitor는 없음