Skip to content

Task 2-1: Metrics - Messages Processed per Queue

Phase: 2 - Observability Priority: Medium Depends on: Không có Reference: docs/BountyHunter-Backend/details/feature-receiver-service/SPEC.md

Background

Không có metrics về throughput, error rate, hay processing latency cho 3 queues. Rất khó diagnose khi có machine event flood.

Tasks

DI Note: Tất cả 3 listeners cần inject MeterRegistry qua constructor (@RequiredArgsConstructor + final field). Đảm bảo spring-boot-starter-actuator có trong receiver-service/pom.xml. messageType — xác nhận tên field và enum type trong message POJO (có thể là getMessageType() hoặc getType()). Nếu messageType có thể null trước khi parse, handle null với fallback "unknown".

Thêm metrics vào cả 3 listeners:

// Template để apply vào mỗi listener:
// Inject: private final MeterRegistry meterRegistry;

@JmsListener(destination = "${queue.queue-control-server-gameplay}", ...)
public void receiveMessage(String message) {
    String messageType = null;
    Timer.Sample sample = Timer.start(meterRegistry);
    String status = "success";
    try {
        // parse message để lấy messageType sớm nhất có thể
        messageType = parseMessageType(message);  // xác định method name thực tế
        // existing logic
    } catch (Exception e) {
        status = "error";
        throw e;  // re-throw để JMS trigger redelivery policy
    } finally {
        sample.stop(meterRegistry.timer("receiver.message.processed",
            Tags.of(
                "queue", "gameplay",  // thay đổi per listener: "healthcheck", "log"
                "status", status,
                "message_type", messageType != null ? messageType : "unknown"
            )
        ));
    }
}

Per-queue counters

  • [ ] JMSReceiverGameplayMachineListener: counter per MessageType (START_GAME, END_GAME, COUNT_DOWN, QUERY)
  • [ ] JMSReceiverHealthCheckMachineListener: counter per MessageType (NEW_CONNECTED, APP_CLOSE, ERROR_REPORT, PING, CAM_STATUS_REPORT...)
  • [ ] JMSReceiverLogMachineListener: counter per MachineLogType

Verification / Acceptance Criteria

  • [ ] Metric receiver.message.processed với tags queue, status, message_type xuất hiện trong /actuator/metrics
  • [ ] Tất cả 3 queues có metric entries riêng biệt (tag queue khác nhau)
  • [ ] status=error được record khi listener throw exception
  • [ ] Error path: exception vẫn được re-throw (không nuốt)
  • [ ] Metric resolution đủ để detect machine event flood (gauge cần update frequent)

Files to Modify

  • receiver-service/jms/JMSReceiverGameplayMachineListener.java
  • receiver-service/jms/JMSReceiverHealthCheckMachineListener.java
  • receiver-service/jms/JMSReceiverLogMachineListener.java