]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/prometheus: report per-pool pg states
authorAleksei Zakharov <zakharov.a.g@yandex.ru>
Fri, 20 Dec 2019 10:40:44 +0000 (13:40 +0300)
committerAleksei Zakharov <zaharov@selectel.ru>
Wed, 29 Jan 2020 14:26:20 +0000 (17:26 +0300)
This commit adds per-pool pg states metrics
with unique 'pool_id' label.

Signed-off-by: Aleksei Zakharov <zakharov.a.g@yandex.ru>
src/pybind/mgr/prometheus/module.py

index 5d5a053f98310d018270cba4bd1b0ec0e5fa797b..d58c1f67a18ecff39d9c220e050f6619e7af481f 100644 (file)
@@ -358,6 +358,7 @@ class Module(MgrModule):
                 'gauge',
                 path,
                 'PG {}'.format(state),
+                ('pool_id',)
             )
         for state in DF_CLUSTER:
             path = 'cluster_{}'.format(state)
@@ -510,32 +511,34 @@ class Module(MgrModule):
             self.metrics['mgr_module_can_run'].set(_can_run, (mod_name,))
 
     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')