]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/telemetry: add stats about crush map
authorSage Weil <sage@redhat.com>
Fri, 1 Nov 2019 12:58:54 +0000 (07:58 -0500)
committerJoao Eduardo Luis <joao@suse.com>
Thu, 12 Dec 2019 18:08:01 +0000 (18:08 +0000)
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 713dbc9722888d3bf60d772dbca23e13b0cafc38)

 Conflicts:
src/pybind/mgr/telemetry/module.py
          Missing context due to missing patches.
        PendingReleaseNotes
          Dropped to prevent conflicts in the future

src/pybind/mgr/telemetry/module.py

index ef680952d83639ced2c632d3e35332d7a4c24ea5..00d8b68de38e7e784000e4935ae528971ca9f5ff 100644 (file)
@@ -51,6 +51,7 @@ REVISION = 2
 #     how much metadata is cached)
 #   - added more pool metadata (rep vs ec, cache tiering mode, ec profile)
 #   - rgw daemons, zones, zonegroups; which rgw frontends
+#   - crush map stats
 
 class Module(MgrModule):
     config = dict()
@@ -268,6 +269,45 @@ class Module(MgrModule):
 
         return metadata
 
+    def gather_crush_info(self):
+        osdmap = self.get_osdmap()
+        crush_raw = osdmap.get_crush()
+        crush = crush_raw.dump()
+
+        def inc(d, k):
+            if k in d:
+                d[k] += 1
+            else:
+                d[k] = 1
+
+        device_classes = {}
+        for dev in crush['devices']:
+            inc(device_classes, dev.get('class', ''))
+
+        bucket_algs = {}
+        bucket_types = {}
+        bucket_sizes = {}
+        for bucket in crush['buckets']:
+            if '~' in bucket['name']:  # ignore shadow buckets
+                continue
+            inc(bucket_algs, bucket['alg'])
+            inc(bucket_types, bucket['type_id'])
+            inc(bucket_sizes, len(bucket['items']))
+
+        return {
+            'num_devices': len(crush['devices']),
+            'num_types': len(crush['types']),
+            'num_buckets': len(crush['buckets']),
+            'num_rules': len(crush['rules']),
+            'device_classes': list(device_classes.values()),
+            'tunables': crush['tunables'],
+            'compat_weight_set': '-1' in crush['choose_args'],
+            'num_weight_sets': len(crush['choose_args']),
+            'bucket_algs': bucket_algs,
+            'bucket_sizes': bucket_sizes,
+            'bucket_types': bucket_types,
+        }
+
     def get_active_channels(self):
         r = []
         if self.config['channel_basic']:
@@ -360,6 +400,9 @@ class Module(MgrModule):
                 'require_min_compat_client': osd_map['require_min_compat_client']
             }
 
+            # crush
+            report['crush'] = self.gather_crush_info()
+
             # cephfs
             report['fs'] = {
                 'count': len(fs_map['filesystems']),