]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/controllers/monitor.py
import quincy beta 17.1.0
[ceph.git] / ceph / src / pybind / mgr / dashboard / controllers / monitor.py
1 # -*- coding: utf-8 -*-
2
3 import json
4
5 from .. import mgr
6 from ..security import Scope
7 from . import APIDoc, APIRouter, BaseController, Endpoint, EndpointDoc, ReadPermission
8
9 MONITOR_SCHEMA = {
10 "mon_status": ({
11 "name": (str, ""),
12 "rank": (int, ""),
13 "state": (str, ""),
14 "election_epoch": (int, ""),
15 "quorum": ([int], ""),
16 "quorum_age": (int, ""),
17 "features": ({
18 "required_con": (str, ""),
19 "required_mon": ([int], ""),
20 "quorum_con": (str, ""),
21 "quorum_mon": ([str], "")
22 }, ""),
23 "outside_quorum": ([str], ""),
24 "extra_probe_peers": ([str], ""),
25 "sync_provider": ([str], ""),
26 "monmap": ({
27 "epoch": (int, ""),
28 "fsid": (str, ""),
29 "modified": (str, ""),
30 "created": (str, ""),
31 "min_mon_release": (int, ""),
32 "min_mon_release_name": (str, ""),
33 "features": ({
34 "persistent": ([str], ""),
35 "optional": ([str], "")
36 }, ""),
37 "mons": ([{
38 "rank": (int, ""),
39 "name": (str, ""),
40 "public_addrs": ({
41 "addrvec": ([{
42 "type": (str, ""),
43 "addr": (str, ""),
44 "nonce": (int, "")
45 }], "")
46 }, ""),
47 "addr": (str, ""),
48 "public_addr": (str, ""),
49 "priority": (int, ""),
50 "weight": (int, ""),
51 "stats": ({
52 "num_sessions": ([int], ""),
53 }, "")
54 }], "")
55 }, ""),
56 "feature_map": ({
57 "mon": ([{
58 "features": (str, ""),
59 "release": (str, ""),
60 "num": (int, "")
61 }], ""),
62 "mds": ([{
63 "features": (str, ""),
64 "release": (str, ""),
65 "num": (int, "")
66 }], ""),
67 "client": ([{
68 "features": (str, ""),
69 "release": (str, ""),
70 "num": (int, "")
71 }], ""),
72 "mgr": ([{
73 "features": (str, ""),
74 "release": (str, ""),
75 "num": (int, "")
76 }], ""),
77 }, "")
78 }, ""),
79 "in_quorum": ([{
80 "rank": (int, ""),
81 "name": (str, ""),
82 "public_addrs": ({
83 "addrvec": ([{
84 "type": (str, ""),
85 "addr": (str, ""),
86 "nonce": (int, "")
87 }], "")
88 }, ""),
89 "addr": (str, ""),
90 "public_addr": (str, ""),
91 "priority": (int, ""),
92 "weight": (int, ""),
93 "stats": ({
94 "num_sessions": ([int], "")
95 }, "")
96 }], ""),
97 "out_quorum": ([int], "")
98 }
99
100
101 @APIRouter('/monitor', Scope.MONITOR)
102 @APIDoc("Get Monitor Details", "Monitor")
103 class Monitor(BaseController):
104 @Endpoint()
105 @ReadPermission
106 @EndpointDoc("Get Monitor Details",
107 responses={200: MONITOR_SCHEMA})
108 def __call__(self):
109 in_quorum, out_quorum = [], []
110
111 counters = ['mon.num_sessions']
112
113 mon_status_json = mgr.get("mon_status")
114 mon_status = json.loads(mon_status_json['json'])
115
116 for mon in mon_status["monmap"]["mons"]:
117 mon["stats"] = {}
118 for counter in counters:
119 data = mgr.get_counter("mon", mon["name"], counter)
120 if data is not None:
121 mon["stats"][counter.split(".")[1]] = data[counter]
122 else:
123 mon["stats"][counter.split(".")[1]] = []
124 if mon["rank"] in mon_status["quorum"]:
125 in_quorum.append(mon)
126 else:
127 out_quorum.append(mon)
128
129 return {
130 'mon_status': mon_status,
131 'in_quorum': in_quorum,
132 'out_quorum': out_quorum
133 }