Skip to content

Task 2-1: Room Creation Metrics

Phase: 2 - Stability Priority: Medium Module: websocket, batch Depends 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 @Autowired field. Nếu RoomCmdConsumer chưa có constructor injection, thêm field:

@Autowired
private MeterRegistry meterRegistry;
Dependency io.micrometer:micrometer-core phải có trong pom.xml của module websocket. Kiểm tra trước khi thêm.

  • [ ] Inject MeterRegistry vào RoomCmdConsumer (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 MeterRegistry vào CreateRoomValidationService tươ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 MeterRegistry vào CreateRoomService. 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.attempt tăng 1 với đúng tag game_mode
  • [ ] Metric room.creation.latency có giá trị > 0 sau mỗi room creation thành công
  • [ ] Khi validation thất bại (e.g., ROOM_ALREADY_EXIST), metric room.creation.validation_fail tăng với tag reason=ROOM_ALREADY_EXIST
  • [ ] Metric room.queue.routed tăng với đúng queue_type tag 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ó NullPointerException liên quan đến meterRegistry khi chạy tests
  • [ ] Dependency micrometer-core đã có trong pom.xml (không thêm nếu đã có)

Files to Modify

  • websocket/handler/consumer_handler/RoomCmdConsumer.java
  • application-core/service/cache_room/create_room/validate/CreateRoomValidationService.java
  • application-core/service/cache_room/create_room/CreateRoomService.java