]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | from __future__ import absolute_import\r |
2 | \r | |
3 | import socket\r | |
4 | \r | |
5 | from . import MetricsAgent, MetricsField\r | |
6 | from ...common.clusterdata import ClusterAPI\r | |
7 | \r | |
8 | \r | |
9 | class 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 | |
44 | class 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 |