]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/diskprediction_cloud/agent/metrics/ceph_cluster.py
bump version to 15.2.11-pve1
[ceph.git] / ceph / src / pybind / mgr / diskprediction_cloud / agent / metrics / ceph_cluster.py
1 from __future__ import absolute_import
2
3 import socket
4
5 from . import MetricsAgent, MetricsField
6 from ...common.clusterdata import ClusterAPI
7
8
9 class CephCluster(MetricsField):
10 """ Ceph cluster structure """
11 measurement = 'ceph_cluster'
12
13 def __init__(self):
14 super(CephCluster, self).__init__()
15 self.tags['cluster_id'] = None
16 self.fields['agenthost'] = None
17 self.tags['agenthost_domain_id'] = None
18 self.fields['cluster_health'] = ''
19 self.fields['num_mon'] = None
20 self.fields['num_mon_quorum'] = None
21 self.fields['num_osd'] = None
22 self.fields['num_osd_up'] = None
23 self.fields['num_osd_in'] = None
24 self.fields['osd_epoch'] = None
25 self.fields['osd_bytes'] = None
26 self.fields['osd_bytes_used'] = None
27 self.fields['osd_bytes_avail'] = None
28 self.fields['num_pool'] = None
29 self.fields['num_pg'] = None
30 self.fields['num_pg_active_clean'] = None
31 self.fields['num_pg_active'] = None
32 self.fields['num_pg_peering'] = None
33 self.fields['num_object'] = None
34 self.fields['num_object_degraded'] = None
35 self.fields['num_object_misplaced'] = None
36 self.fields['num_object_unfound'] = None
37 self.fields['num_bytes'] = None
38 self.fields['num_mds_up'] = None
39 self.fields['num_mds_in'] = None
40 self.fields['num_mds_failed'] = None
41 self.fields['mds_epoch'] = None
42
43
44 class CephClusterAgent(MetricsAgent):
45 measurement = 'ceph_cluster'
46
47 def _collect_data(self):
48 # process data and save to 'self.data'
49 obj_api = ClusterAPI(self._module_inst)
50 cluster_id = obj_api.get_cluster_id()
51
52 c_data = CephCluster()
53 cluster_state = obj_api.get_health_status()
54 c_data.tags['cluster_id'] = cluster_id
55 c_data.fields['cluster_health'] = str(cluster_state)
56 c_data.fields['agenthost'] = socket.gethostname()
57 c_data.tags['agenthost_domain_id'] = cluster_id
58 c_data.fields['osd_epoch'] = obj_api.get_osd_epoch()
59 c_data.fields['num_mon'] = len(obj_api.get_mons())
60 c_data.fields['num_mon_quorum'] = \
61 len(obj_api.get_mon_status().get('quorum', []))
62
63 osds = obj_api.get_osds()
64 num_osd_up = 0
65 num_osd_in = 0
66 for osd_data in osds:
67 if osd_data.get('up'):
68 num_osd_up = num_osd_up + 1
69 if osd_data.get('in'):
70 num_osd_in = num_osd_in + 1
71 if osds:
72 c_data.fields['num_osd'] = len(osds)
73 else:
74 c_data.fields['num_osd'] = 0
75 c_data.fields['num_osd_up'] = num_osd_up
76 c_data.fields['num_osd_in'] = num_osd_in
77 c_data.fields['num_pool'] = len(obj_api.get_osd_pools())
78
79 df_stats = obj_api.module.get('df').get('stats', {})
80 total_bytes = df_stats.get('total_bytes', 0)
81 total_used_bytes = df_stats.get('total_used_bytes', 0)
82 total_avail_bytes = df_stats.get('total_avail_bytes', 0)
83 c_data.fields['osd_bytes'] = total_bytes
84 c_data.fields['osd_bytes_used'] = total_used_bytes
85 c_data.fields['osd_bytes_avail'] = total_avail_bytes
86 if total_bytes and total_avail_bytes:
87 c_data.fields['osd_bytes_used_percentage'] = \
88 round((float(total_used_bytes) / float(total_bytes)) * 100, 4)
89 else:
90 c_data.fields['osd_bytes_used_percentage'] = 0.0000
91
92 pg_stats = obj_api.module.get('pg_stats').get('pg_stats', [])
93 num_bytes = 0
94 num_object = 0
95 num_object_degraded = 0
96 num_object_misplaced = 0
97 num_object_unfound = 0
98 num_pg_active = 0
99 num_pg_active_clean = 0
100 num_pg_peering = 0
101 for pg_data in pg_stats:
102 num_pg_active = num_pg_active + len(pg_data.get('acting'))
103 if 'active+clean' in pg_data.get('state'):
104 num_pg_active_clean = num_pg_active_clean + 1
105 if 'peering' in pg_data.get('state'):
106 num_pg_peering = num_pg_peering + 1
107
108 stat_sum = pg_data.get('stat_sum', {})
109 num_object = num_object + stat_sum.get('num_objects', 0)
110 num_object_degraded = \
111 num_object_degraded + stat_sum.get('num_objects_degraded', 0)
112 num_object_misplaced = \
113 num_object_misplaced + stat_sum.get('num_objects_misplaced', 0)
114 num_object_unfound = \
115 num_object_unfound + stat_sum.get('num_objects_unfound', 0)
116 num_bytes = num_bytes + stat_sum.get('num_bytes', 0)
117
118 c_data.fields['num_pg'] = len(pg_stats)
119 c_data.fields['num_object'] = num_object
120 c_data.fields['num_object_degraded'] = num_object_degraded
121 c_data.fields['num_object_misplaced'] = num_object_misplaced
122 c_data.fields['num_object_unfound'] = num_object_unfound
123 c_data.fields['num_bytes'] = num_bytes
124 c_data.fields['num_pg_active'] = num_pg_active
125 c_data.fields['num_pg_active_clean'] = num_pg_active_clean
126 c_data.fields['num_pg_peering'] = num_pg_active_clean
127
128 filesystems = obj_api.get_file_systems()
129 num_mds_in = 0
130 num_mds_up = 0
131 num_mds_failed = 0
132 mds_epoch = 0
133 for fs_data in filesystems:
134 num_mds_in = \
135 num_mds_in + len(fs_data.get('mdsmap', {}).get('in', []))
136 num_mds_up = \
137 num_mds_up + len(fs_data.get('mdsmap', {}).get('up', {}))
138 num_mds_failed = \
139 num_mds_failed + len(fs_data.get('mdsmap', {}).get('failed', []))
140 mds_epoch = mds_epoch + fs_data.get('mdsmap', {}).get('epoch', 0)
141 c_data.fields['num_mds_in'] = num_mds_in
142 c_data.fields['num_mds_up'] = num_mds_up
143 c_data.fields['num_mds_failed'] = num_mds_failed
144 c_data.fields['mds_epoch'] = mds_epoch
145 self.data.append(c_data)