@@ -367,6 +367,8 @@ def _is_ready(self) -> bool:
367367 if ready :
368368 self .max_messages_to_process = MAX_MESSAGES_TO_CONSUME_AFTER_STARTUP
369369 LOG .info ("Ready in %s seconds" , time .monotonic () - self .start_time )
370+ # Initialize metrics with current database state when becoming ready
371+ self ._initialize_metrics ()
370372 return ready
371373
372374 def highest_offset (self ) -> int :
@@ -499,6 +501,33 @@ def _update_is_ready_flag(self) -> None:
499501 with self ._ready_lock :
500502 self ._ready = new_ready_flag
501503
504+ def _update_schema_gauges (self ) -> tuple [int , int , int , int ]:
505+ """Update all schema-related gauge metrics with current database state.
506+
507+ Returns:
508+ Tuple of (num_subjects, num_schemas, live_versions, soft_deleted_versions)
509+ """
510+ num_schemas = self .database .num_schemas ()
511+ num_subjects = self .database .num_subjects ()
512+ live_versions , soft_deleted_versions = self .database .num_schema_versions ()
513+
514+ self .stats .set_schemas_num_total (value = num_schemas )
515+ self .stats .set_subjects_num_total (value = num_subjects )
516+ self .stats .set_schema_versions_num_total (live_versions = live_versions , soft_deleted_versions = soft_deleted_versions )
517+
518+ return num_subjects , num_schemas , live_versions , soft_deleted_versions
519+
520+ def _initialize_metrics (self ) -> None :
521+ """Initialize metrics with current database state."""
522+ num_subjects , num_schemas , live_versions , soft_deleted_versions = self ._update_schema_gauges ()
523+ LOG .info (
524+ "Metrics initialized: subjects=%s, schemas=%s, live_versions=%s, soft_deleted_versions=%s" ,
525+ num_subjects ,
526+ num_schemas ,
527+ live_versions ,
528+ soft_deleted_versions ,
529+ )
530+
502531 def _report_schema_metrics (
503532 self ,
504533 schema_records_processed_keymode_canonical : int ,
@@ -510,20 +539,9 @@ def _report_schema_metrics(
510539 with_deprecated_key = schema_records_processed_keymode_deprecated_karapace ,
511540 )
512541
513- # Update following gauges only if there is a possibility of a change.
514- records_processed = bool (
515- schema_records_processed_keymode_canonical or schema_records_processed_keymode_deprecated_karapace
516- )
517- if records_processed :
518- num_schemas = self .database .num_schemas ()
519- num_subjects = self .database .num_subjects ()
520- self .stats .set_schemas_num_total (value = num_schemas )
521- self .stats .set_subjects_num_total (value = num_subjects )
522-
523- live_versions , soft_deleted_versions = self .database .num_schema_versions ()
524- self .stats .set_schema_versions_num_total (
525- live_versions = live_versions , soft_deleted_versions = soft_deleted_versions
526- )
542+ # Always update gauges to reflect current database state
543+ # This ensures metrics stay accurate even if no new records are processed
544+ self ._update_schema_gauges ()
527545
528546 def _handle_msg_config (self , key : dict , value : dict | None ) -> None :
529547 subject = key .get ("subject" )
0 commit comments