Skip to content

Task 4-1: Firebase Listener Health Monitoring

Phase: 4 Priority: Medium Module: firebaselistener Depends on: Không có Reference: docs/BountyHunter-Backend/details/feature-livestream/SPEC.md

Background

Firebase listeners trong firebaselistener module không có health check. Nếu listener crash hoặc disconnect, events không được process nhưng hệ thống không biết.

Tasks

DI Note: FirebaseHealthCheckService là Spring @Service và dùng @Scheduled — cần đảm bảo @EnableScheduling đã được khai báo trong firebaselistener module (thường ở @SpringBootApplication class hoặc một @Configuration class). FirebaseDatabase.getInstance() không cần inject — dùng static factory method của Firebase SDK. Logger dùng Lombok @Slf4j hoặc LoggerFactory.getLogger(...).

File mới: firebaselistener/service/FirebaseHealthCheckService.java

@Service
@Slf4j  // Lombok; hoặc khai báo: private static final Logger log = LoggerFactory.getLogger(FirebaseHealthCheckService.class);
public class FirebaseHealthCheckService {

    @Scheduled(fixedDelay = 60000)  // Cân nhắc externalize: "${firebase.health.check-interval:60000}"
    public void checkFirebaseConnection() {
        try {
            FirebaseDatabase db = FirebaseDatabase.getInstance();  // Static factory, không inject
            db.getReference(".info/connected").addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        Boolean connected = snapshot.getValue(Boolean.class);
                        if (Boolean.TRUE.equals(connected)) {
                            log.debug("[FIREBASE_HEALTH] Connection OK");
                        } else {
                            log.error("[FIREBASE_HEALTH] Firebase reports disconnected!");
                        }
                    }
                    @Override
                    public void onCancelled(DatabaseError error) {
                        log.error("[FIREBASE_HEALTH] Health check cancelled: {}", error.getMessage());
                    }
                }
            );
        } catch (Exception e) {
            log.error("[FIREBASE_HEALTH] Firebase connection check failed", e);
        }
    }
}
  • [ ] Verify @EnableScheduling tồn tại trong firebaselistener module config
  • [ ] Cân nhắc externalize check interval: ${firebase.health.check-interval:60000} trong application-common.yaml
  • [ ] Thêm alert integration nếu có (PagerDuty, Slack webhook) khi disconnected được detect

Verification / Acceptance Criteria

  • [ ] FirebaseHealthCheckService.java được tạo và compile thành công
  • [ ] @EnableScheduling tồn tại trong module (application khởi động không lỗi scheduler)
  • [ ] Health check job chạy mỗi 60s (verify qua logs [FIREBASE_HEALTH] Connection OK)
  • [ ] Khi Firebase thực sự disconnect (mock) → log [FIREBASE_HEALTH] Firebase reports disconnected! xuất hiện
  • [ ] Health check failure không làm crash service — exception được catch và log

Files to Modify / Create

  • firebaselistener/src/main/java/com/figpop/firebaselistener/service/FirebaseHealthCheckService.java (new)