Skip to content

Task 2-3: Metrics - Match Success Rate & Average Wait Time

Phase: 2 - Performance Priority: Medium Depends on: task-2-1 Reference: docs/BountyHunter-Backend/details/feature-matching-matchmaking/SPEC.md

Background

Không có visibility về tỷ lệ match thành công, thời gian chờ trung bình, hay số user đang trong queue. Cần để đánh giá UX và tune matchmaking algorithm.

Tasks

DI Note: - MatchMakingForAllGameModeConfig cần inject MeterRegistry (Micrometer) — thêm private final MeterRegistry meterRegistry; và inject qua constructor (dùng @RequiredArgsConstructor). - Đảm bảo spring-boot-starter-actuatormicrometer-registry-prometheus (hoặc tương đương) có trong batch/pom.xml. - UserMatchingService trong application-core cần expose method getQueueSize(String settingId, String prizeId) — kiểm tra nếu chưa có thì thêm.

File: batch/job/matchmaking/MatchMakingForAllGameModeConfig.java

  • [ ] Record số user trong queue mỗi scheduler tick:

    // Inject: private final MeterRegistry meterRegistry;
    // Inject: private final UserMatchingService matchingService; (nếu chưa có)
    int queueSize = matchingService.getQueueSize(settingId, prizeId);
    meterRegistry.gauge("matching.queue.size",
        Tags.of("settingId", settingId, "prizeId", String.valueOf(prizeId)),
        queueSize);
    

  • [ ] Record khi match thành công:

    meterRegistry.counter("matching.success",
        "settingId", settingId
    ).increment();
    

  • [ ] Record wait time (thời gian từ JOIN_QUEUE tới khi match):

    // matchingRecord.getJoinTime() phải là Instant hoặc có thể convert sang Instant
    long waitMs = Duration.between(matchingRecord.getJoinTime(), Instant.now()).toMillis();
    meterRegistry.timer("matching.wait_time",
        "settingId", settingId
    ).record(waitMs, TimeUnit.MILLISECONDS);
    

  • [ ] Kiểm tra getJoinTime() tồn tại trên MatchingRecord entity — nếu chưa, thêm field và migration

Verification / Acceptance Criteria

  • [ ] Metric matching.queue.size với tags settingIdprizeId xuất hiện trong /actuator/metrics
  • [ ] Metric matching.success tăng mỗi khi match được tạo thành công
  • [ ] Metric matching.wait_time có P50, P95, P99 histogram entries
  • [ ] Prometheus scrape /actuator/prometheus → metrics xuất hiện
  • [ ] Không gây performance regression: gauge/counter/timer overhead < 1ms per call

Files to Modify

  • batch/job/matchmaking/MatchMakingForAllGameModeConfig.java
  • application-core/service/matching/UserMatchingService.java