]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/diskprediction_cloud/agent/metrics/ceph_cluster.py
1 from __future__
import absolute_import
5 from . import MetricsAgent
, MetricsField
6 from ...common
.clusterdata
import ClusterAPI
9 class CephCluster(MetricsField
):
10 """ Ceph cluster structure """
11 measurement
= 'ceph_cluster'
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
44 class CephClusterAgent(MetricsAgent
):
45 measurement
= 'ceph_cluster'
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()
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', []))
63 osds
= obj_api
.get_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
72 c_data
.fields
['num_osd'] = len(osds
)
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())
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)
90 c_data
.fields
['osd_bytes_used_percentage'] = 0.0000
92 pg_stats
= obj_api
.module
.get('pg_stats').get('pg_stats', [])
95 num_object_degraded
= 0
96 num_object_misplaced
= 0
97 num_object_unfound
= 0
99 num_pg_active_clean
= 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
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)
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
128 filesystems
= obj_api
.get_file_systems()
133 for fs_data
in filesystems
:
135 num_mds_in
+ len(fs_data
.get('mdsmap', {}).get('in', []))
137 num_mds_up
+ len(fs_data
.get('mdsmap', {}).get('up', {}))
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
)