Task 2-2: DLQ Monitoring & Alerting cho Prize Queues
Phase: 2 - DLQ & Error Handling Priority: Medium Depends on: task-2-1 Reference: docs/BountyHunter-Backend/details/feature-prize-allocation/SPEC.md
Background
Sau khi có DLQ policy (task-2-1), cần monitoring để phát hiện khi có messages vào DLQ của prize queues (dấu hiệu allocation thất bại liên tục).
Tasks
DI Note: -
JMSHandleDlqMessagelà@Componentvới@JmsListener. Cần injectAlertingService(hoặc tương đương — xác nhận class name bằng grep:grep -rn "class.*AlertingService\|class.*SlackNotification") qua constructor. -BatchQueueMonitorServicecần injectMeterRegistrynếu chưa có — thêm vào constructor. -@Header(JmsHeaders.ORIGINAL_DESTINATION)yêu cầuspring-jms— kiểm tra classJmsHeaderscó trong classpath không: thường làorg.springframework.jms.support.JmsHeaders.
-
[ ] Enhance
JMSHandleDlqMessageđể phân loại DLQ theo original destination:// Inject: private final AlertingService alertingService; (xác nhận tên class) @JmsListener(destination = "${queue.dlq:DLQ}") public void handleDlqMessage( String messageJson, @Header(JmsHeaders.ORIGINAL_DESTINATION) String originalDest ) { if (originalDest != null && originalDest.contains("prize-allocation")) { LOGGER.error("[DLQ_PRIZE] Prize allocation failed permanently. dest={}, msg={}", originalDest, messageJson); // High priority alert — xác nhận method name của alertingService alertingService.sendHighPriorityAlert("PRIZE_ALLOCATION_DLQ", originalDest, messageJson); } else { LOGGER.warn("[DLQ] Dead letter: dest={}", originalDest); } } -
[ ] Thêm per-queue DLQ depth gauge vào
BatchQueueMonitorService:// Inject: private final MeterRegistry meterRegistry; meterRegistry.gauge("jms.dlq.prize.depth", Tags.of("queue", "PRIZE"), this, // object cần pass vào gauge (hoặc lambda) obj -> (double) getPrizeDlqDepth()); // Implement getPrizeDlqDepth() bằng JMX hoặc ActiveMQ REST API
Verification / Acceptance Criteria
- [ ] Message vào DLQ với
original-destinationchứaprize-allocation→ log ERROR[DLQ_PRIZE]và alert sent - [ ] Non-prize DLQ message → log WARN nhưng không high-priority alert
- [ ] Metric
jms.dlq.prize.depthxuất hiện trong/actuator/metrics - [ ] Alert được gửi tới đúng channel (Slack/PagerDuty) khi prize allocation DLQ nhận message
Files to Modify
batch/jms/dlq/JMSHandleDlqMessage.javabatch/service/BatchQueueMonitorService.java