@@ -1722,36 +1722,41 @@ def get_all_databases(self, cluster: str = "local", node_name: str = "node-01")
17221722 Returns:
17231723 List of database names
17241724 """
1725- # Try to get databases from metrics that use 'dbname' label (custom metrics)
1726- db_query = f'last_over_time(pgwatch_unused_indexes_index_size_bytes{{cluster="{ cluster } ", node_name="{ node_name } "}}[10h])'
1727- result = self .query_instant (db_query )
1728-
1729- databases = []
1730- if result .get ('status' ) == 'success' and result .get ('data' , {}).get ('result' ):
1731- for item in result ['data' ]['result' ]:
1732- db_name = item ['metric' ].get ('dbname' , '' )
1733- if db_name and db_name not in databases :
1734- databases .append (db_name )
1735-
1736- # If no databases found using dbname, try using datname (catalog metrics)
1737- if not databases :
1738- db_query = f'pgwatch_pg_database_wraparound_age_datfrozenxid{{cluster="{ cluster } ", node_name="{ node_name } ", datname!="template1"}}'
1739- result = self .query_instant (db_query )
1740- if result .get ('status' ) == 'success' and result .get ('data' , {}).get ('result' ):
1741- for item in result ['data' ]['result' ]:
1742- db_name = item ['metric' ].get ('datname' , '' )
1743- if db_name and db_name not in databases :
1744- databases .append (db_name )
1745-
1746- # If still no databases found, try another alternative query
1747- if not databases :
1748- db_query = f'pgwatch_pg_database_size_bytes{{cluster="{ cluster } ", node_name="{ node_name } "}}'
1749- result = self .query_instant (db_query )
1750- if result .get ('status' ) == 'success' and result .get ('data' , {}).get ('result' ):
1751- for item in result ['data' ]['result' ]:
1752- db_name = item ['metric' ].get ('datname' , '' )
1753- if db_name and db_name not in databases :
1754- databases .append (db_name )
1725+ # Build a source-agnostic database list by unifying labels from:
1726+ # 1) Generic per-database metric (wraparound) → datname
1727+ # 2) Custom index reports (unused/redundant) → dbname
1728+ # 3) Btree bloat (for completeness) → datname
1729+ databases : List [str ] = []
1730+ database_set = set ()
1731+
1732+ # Helper to add a name safely
1733+ def add_db (name : str ) -> None :
1734+ if name and name not in ('template0' , 'template1' ) and name not in database_set :
1735+ database_set .add (name )
1736+ databases .append (name )
1737+
1738+ # 1) Generic per-database metric
1739+ wrap_q = f'pgwatch_pg_database_wraparound_age_datfrozenxid{{cluster="{ cluster } ", node_name="{ node_name } "}}'
1740+ wrap_res = self .query_instant (wrap_q )
1741+ if wrap_res .get ('status' ) == 'success' and wrap_res .get ('data' , {}).get ('result' ):
1742+ for item in wrap_res ['data' ]['result' ]:
1743+ add_db (item ["metric" ].get ("datname" , "" ))
1744+
1745+ # 2) Custom reports using dbname
1746+ unused_q = f'last_over_time(pgwatch_unused_indexes_index_size_bytes{{cluster="{ cluster } ", node_name="{ node_name } "}}[10h])'
1747+ redun_q = f'last_over_time(pgwatch_redundant_indexes_index_size_bytes{{cluster="{ cluster } ", node_name="{ node_name } "}}[10h])'
1748+ for q in (unused_q , redun_q ):
1749+ res = self .query_instant (q )
1750+ if res .get ('status' ) == 'success' and res .get ('data' , {}).get ('result' ):
1751+ for item in res ['data' ]['result' ]:
1752+ add_db (item ["metric" ].get ("dbname" , "" ))
1753+
1754+ # 3) Btree bloat family
1755+ bloat_q = f'last_over_time(pgwatch_pg_btree_bloat_bloat_pct{{cluster="{ cluster } ", node_name="{ node_name } "}}[1d])'
1756+ bloat_res = self .query_instant (bloat_q )
1757+ if bloat_res .get ('status' ) == 'success' and bloat_res .get ('data' , {}).get ('result' ):
1758+ for item in bloat_res ['data' ]['result' ]:
1759+ add_db (item ["metric" ].get ("datname" , "" ))
17551760
17561761 return databases
17571762
0 commit comments