]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/prometheus: report per-pool pg states 33158/head
authorAleksei Zakharov <zakharov.a.g@yandex.ru>
Fri, 20 Dec 2019 10:40:44 +0000 (13:40 +0300)
committerShyukri Shyukriev <shshyukriev@suse.com>
Tue, 11 Feb 2020 18:26:54 +0000 (20:26 +0200)
This commit adds per-pool pg states metrics
with unique 'pool_id' label.

Signed-off-by: Aleksei Zakharov <zakharov.a.g@yandex.ru>
(cherry picked from commit 8fb16e43e6a21989ee6f0a45551d65f740011595)

 Conflicts:
src/pybind/mgr/prometheus/module.py

src/pybind/mgr/prometheus/module.py

index 7ed51a69f3cb8acfbb0a2bdc16a3be0233ebf26c..96cfb35cbdab4497b69b4a2a21a5f71e927d0a7c 100644 (file)
@@ -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')