Task 2-1: Room Creation Metrics
Phase: 2 - Stability Priority: Medium Module:
websocket,batchDepends on: Không có Reference:docs/BountyHunter-Backend/details/feature-game-room-management/SPEC.md
Background
Không có metrics về room creation latency, validation fail rate theo từng reason code, hay queue routing distribution. Rất khó diagnose khi có performance issue.
Tasks
File: websocket/handler/consumer_handler/RoomCmdConsumer.java
DI Note:
MeterRegistryđược inject qua constructor hoặc@Autowiredfield. NếuRoomCmdConsumerchưa có constructor injection, thêm field:Dependency@Autowired private MeterRegistry meterRegistry;io.micrometer:micrometer-corephải có trongpom.xmlcủa modulewebsocket. Kiểm tra trước khi thêm.
-
[ ] Inject
MeterRegistryvàoRoomCmdConsumer(xem DI Note trên) -
[ ] Record room creation attempt tại điểm đầu handler, TRƯỚC khi gọi validation:
// Clarification: gameMode được xác định từ loại request (PVE_FREE_PLAY hoặc PVE_SINGLE_PLAY) meterRegistry.counter("room.creation.attempt", "game_mode", gameMode.name() ).increment(); -
[ ] Capture start time để tính latency:
// Đặt ngay sau khi record attempt counter Instant start = Instant.now(); -
[ ] Record latency sau khi room được tạo thành công (sau khi nhận response từ service):
meterRegistry.timer("room.creation.latency", "game_mode", gameMode.name() ).record(Duration.between(start, Instant.now()));
File: application-core/service/cache_room/create_room/validate/CreateRoomValidationService.java
DI Note: Inject
MeterRegistryvàoCreateRoomValidationServicetương tự như trên. Class này là Spring@Service.
- [ ] Record validation fail tại mỗi điểm validation thất bại:
// Clarification: reasonCode là giá trị từ RoomReasonCode.* (sau khi task-1-1 hoàn thành) // Nếu task-1-1 chưa hoàn thành, dùng string literal tạm thời meterRegistry.counter("room.creation.validation_fail", "reason", reasonCode // từ RoomReasonCode.* ).increment();
File: application-core/service/cache_room/create_room/CreateRoomService.java
DI Note: Inject
MeterRegistryvàoCreateRoomService. Record queue routing distribution tại điểm quyết định routing queue.
- [ ] Record queue routing distribution:
// Clarification: allocationType.name() trả về string như "PRIZE", "UNLIMITED", "PRIZE_FOR_STREAMER" meterRegistry.counter("room.queue.routed", "queue_type", allocationType.name() ).increment();
Verification / Acceptance Criteria
- [ ] Sau khi tạo room thành công, metric
room.creation.attempttăng 1 với đúng taggame_mode - [ ] Metric
room.creation.latencycó giá trị > 0 sau mỗi room creation thành công - [ ] Khi validation thất bại (e.g.,
ROOM_ALREADY_EXIST), metricroom.creation.validation_failtăng với tagreason=ROOM_ALREADY_EXIST - [ ] Metric
room.queue.routedtăng với đúngqueue_typetag theo loại prize - [ ] Tất cả metrics xuất hiện tại
GET /actuator/metrics/room.creation.attempt(nếu actuator được enable) - [ ] Không có
NullPointerExceptionliên quan đếnmeterRegistrykhi chạy tests - [ ] Dependency
micrometer-coređã có trongpom.xml(không thêm nếu đã có)
Files to Modify
websocket/handler/consumer_handler/RoomCmdConsumer.javaapplication-core/service/cache_room/create_room/validate/CreateRoomValidationService.javaapplication-core/service/cache_room/create_room/CreateRoomService.java