From 233880b13d86ac3527865d9e63f5274ffc70f41e Mon Sep 17 00:00:00 2001 From: Aleksei Zakharov Date: Fri, 20 Dec 2019 13:40:44 +0300 Subject: [PATCH] mgr/prometheus: report per-pool pg states This commit adds per-pool pg states metrics with unique 'pool_id' label. Signed-off-by: Aleksei Zakharov (cherry picked from commit 8fb16e43e6a21989ee6f0a45551d65f740011595) Conflicts: src/pybind/mgr/prometheus/module.py --- src/pybind/mgr/prometheus/module.py | 47 ++++++++++++++++------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/pybind/mgr/prometheus/module.py b/src/pybind/mgr/prometheus/module.py index 7ed51a69f3cb8..96cfb35cbdab4 100644 --- a/src/pybind/mgr/prometheus/module.py +++ b/src/pybind/mgr/prometheus/module.py @@ -318,6 +318,7 @@ class Module(MgrModule): 'gauge', path, 'PG {}'.format(state), + ('pool_id',) ) for state in DF_CLUSTER: path = 'cluster_{}'.format(state) @@ -404,30 +405,34 @@ class Module(MgrModule): )) def get_pg_status(self): - # TODO add per pool status? - pg_status = self.get('pg_status') - # Set total count of PGs, first + pg_status = self.get('pg_status') self.metrics['pg_total'].set(pg_status['num_pgs']) - reported_states = {} - for pg in pg_status['pgs_by_state']: - for state in pg['state_name'].split('+'): - reported_states[state] = reported_states.get(state, 0) + pg['count'] - - for state in reported_states: - path = 'pg_{}'.format(state) - try: - self.metrics[path].set(reported_states[state]) - except KeyError: - self.log.warn("skipping pg in unknown state {}".format(state)) - - for state in PG_STATES: - if state not in reported_states: - try: - self.metrics['pg_{}'.format(state)].set(0) - except KeyError: - self.log.warn("skipping pg in unknown state {}".format(state)) + pg_summary = self.get('pg_summary') + + for pool in pg_summary['by_pool']: + for state_name, count in pg_summary['by_pool'][pool].items(): + reported_states = {} + + for state in state_name.split('+'): + reported_states[state] = reported_states.get( + state, 0) + count + + for state in reported_states: + path = 'pg_{}'.format(state) + try: + self.metrics[path].set(reported_states[state],(pool,)) + except KeyError: + self.log.warn("skipping pg in unknown state {}".format(state)) + + for state in PG_STATES: + if state not in reported_states: + try: + self.metrics['pg_{}'.format(state)].set(0,(pool,)) + except KeyError: + self.log.warn( + "skipping pg in unknown state {}".format(state)) def get_osd_stats(self): osd_stats = self.get('osd_stats') -- 2.39.5