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