Skip to content

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: - JMSHandleDlqMessage@Component với @JmsListener. Cần inject AlertingService (hoặc tương đương — xác nhận class name bằng grep: grep -rn "class.*AlertingService\|class.*SlackNotification") qua constructor. - BatchQueueMonitorService cần inject MeterRegistry nếu chưa có — thêm vào constructor. - @Header(JmsHeaders.ORIGINAL_DESTINATION) yêu cầu spring-jms — kiểm tra class JmsHeaders có 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-destination chứa prize-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.depth xuấ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.java
  • batch/service/BatchQueueMonitorService.java