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