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
MeterRegistryqua constructor (@RequiredArgsConstructor+finalfield). Đảm bảospring-boot-starter-actuatorcó trongreceiver-service/pom.xml.messageType— xác nhận tên field và enum type trong message POJO (có thể làgetMessageType()hoặcgetType()). NếumessageTypecó 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 perMessageType(START_GAME, END_GAME, COUNT_DOWN, QUERY) - [ ]
JMSReceiverHealthCheckMachineListener: counter perMessageType(NEW_CONNECTED, APP_CLOSE, ERROR_REPORT, PING, CAM_STATUS_REPORT...) - [ ]
JMSReceiverLogMachineListener: counter perMachineLogType
Verification / Acceptance Criteria
- [ ] Metric
receiver.message.processedvới tagsqueue,status,message_typexuất hiện trong/actuator/metrics - [ ] Tất cả 3 queues có metric entries riêng biệt (tag
queuekhá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.javareceiver-service/jms/JMSReceiverHealthCheckMachineListener.javareceiver-service/jms/JMSReceiverLogMachineListener.java