From: Sage Weil Date: Fri, 1 Nov 2019 12:58:54 +0000 (-0500) Subject: mgr/telemetry: add stats about crush map X-Git-Tag: v12.2.13~15^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d12dd7bf825e8efc6332158227d1462c01e58b2f;p=ceph.git mgr/telemetry: add stats about crush map Signed-off-by: Sage Weil (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 --- diff --git a/src/pybind/mgr/telemetry/module.py b/src/pybind/mgr/telemetry/module.py index ef680952d83..00d8b68de38 100644 --- a/src/pybind/mgr/telemetry/module.py +++ b/src/pybind/mgr/telemetry/module.py @@ -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']),