]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/dashboard/filesystem.html
buildsys: fix parallel builds
[ceph.git] / ceph / src / pybind / mgr / dashboard / filesystem.html
CommitLineData
31f18b77
FG
1{% extends "base.html" %}
2
3{% block content %}
4
5<script>
6 $(document).ready(function(){
7 // Pre-populated initial data at page load
8 var content_data = {{ content_data }};
9
10 var refresh = function() {
11 $.get("/filesystem_data/" + content_data.fs_status.filesystem.id + "/", function(data) {
12 _.extend(content_data.fs_status, data);
13 setTimeout(refresh, 5000);
14 });
15 };
16
17 // Generate a "width: xx%" style string for use with a progress
18 // bar element showing a pool's used space.
19 rivets.formatters.pool_size_bar = function(pool){
20 var ratio = pool.used / pool.avail;
21
22 return "width: " + Math.round(ratio * 100).toString() + "%";
23 };
24
25 rivets.bind($("div#content"), content_data.fs_status);
26 setTimeout(refresh, 5000);
27
28 // Convert ceph-mgr's time series format (list of 2-tuples
29 // with seconds-since-epoch timestamps) into what chart.js
30 // can handle (list of objects with millisecs-since-epoch
31 // timestamps)
32 var convert_timeseries = function(source_series)
33 {
34 var data = [];
35 _.each(source_series, function(dp) {
36 data.push({
37 x: dp[0] * 1000,
38 y: dp[1]
39 });
40 });
41
42 return data;
43 };
44
45 var delta_timeseries = function(source_series)
46 {
47 var i;
48 var prev = source_series[0];
49 var result = [];
50 for (i = 1; i < source_series.length; i++) {
51 var cur = source_series[i];
52 var tdelta = cur[0] - prev[0];
53 var vdelta = cur[1] - prev[1];
54 var rate = vdelta / tdelta;
55
56 result.push({
57 x: cur[0] * 1000,
58 y: rate
59 });
60
61 prev = cur;
62 }
63 return result;
64 };
65
66 var charts = {};
67
68 var lhs_counter = 'mds.inodes';
69 var lhs_transform = convert_timeseries;
70 var rhs_counter = "mds_server.handle_client_request";
71 var rhs_transform = delta_timeseries;
72
73 var draw_chart = function() {
74 $.get("/mds_counters/" + content_data.fs_status.filesystem.id + "/", function(data) {
75 var top_chart = true;
76
77 // Cull any chart elements that correspond to MDSs no
78 // longer present in the data
79 var existing_mds_names = {};
80 _.each(data, function(mds_data, mds_name) {
81 existing_mds_names[mds_name] = true;
82 });
83
84 $("#mds_charts canvas").each(function(i, e) {
85 var el_mds_name = e.id.replace("mds_chart_", "");
86 if (existing_mds_names[el_mds_name] != true) {
87 e.remove();
88 }
89 });
90
91
92 _.each(data, function(mds_data, mds_name) {
93 if (! $("#mds_chart_" + mds_name).length) {
94 // Construct new chart
95 $("#mds_charts").append(
96 $("<canvas height='64' id='mds_chart_" + mds_name + "'></canvas>")
97 );
98
99 var ctx = $("#mds_chart_" + mds_name);
100 var lhs_data = lhs_transform(mds_data[lhs_counter]);
101 var rhs_data = rhs_transform(mds_data[rhs_counter]);
102
103 var chartInstance = new Chart(ctx, {
104 type: 'line',
105 data: {
106 datasets: [
107 {
108 label: lhs_counter,
109 yAxisID: 'LHS',
110 data: lhs_data,
111 tension: 0.1,
112 borderColor: "#dd2222",
113
114 },
115 {
116 label: rhs_counter,
117 yAxisID: 'RHS',
118 data: rhs_data,
119 tension: 0.1,
120 borderColor: "#2222dd",
121 },
122 ]
123 },
124 options:{
125 legend: {
126 position: 'right',
127 display: top_chart
128 }
129 },
130 options: {
131 scales: {
132 xAxes: [{
133 position: 'top',
134 type: 'time',
135 display: top_chart,
136 time: {
137 displayFormats: {
138 quarter: 'MMM YYYY'
139 }
140 }
141 }],
142 yAxes: [{
143 id: 'LHS',
144 type: 'linear',
145 position: 'left',
146 min: 0
147 }, {
148 id: 'RHS',
149 type: 'linear',
150 position: 'right',
151 min: 0
152 }]
153 }
154 }
155 });
156 charts[mds_name] = chartInstance;
157 } else {
158 // Update existing chart
159 var chart = charts[mds_name];
160 var lhs_data = lhs_transform(mds_data[lhs_counter]);
161 var rhs_data = rhs_transform(mds_data[rhs_counter]);
162 chart.data.datasets[0].data = lhs_data;
163 chart.data.datasets[1].data = rhs_data;
164 chart.update(0);
165 };
166
167 // FIXME: update the visibility of axes etc
168 // when charts come and go.
169 top_chart = false;
170 });
171
172 setTimeout(draw_chart, 5000);
173 });
174 };
175
176 // TODO periodic refresh
177 draw_chart();
178
179 });
180</script>
181
182
183<section class="content-header">
184 <h1>
185 Filesystem {filesystem.name}
186 </h1>
187</section>
188
189<section class="content">
190 <p style="font-size: 1.3em;">
191 <i class="fa fa-desktop"></i>&nbsp;&nbsp;Clients: <span style="font-weight:bold;">{filesystem.client_count}</span>
192 <a rv-href="filesystem.clients_url">Detail...</a>
193 </p>
194
195 <div class="row">
196 <div class="col-sm-6">
197 <div class="box">
198 <div class="box-header">
199 <h3 class="box-title">Ranks</h3>
200 </div>
201 <div class="box-body">
202 <table class="table table-condensed">
203 <thead>
204 <tr>
205 <th>Rank</th>
206 <th>State</th>
207 <th>Daemon</th>
208 <th>Activity</th>
209 <th>Dentries</th>
210 <th>Inodes</th>
211 </tr>
212 </thead>
213 <tbody>
214 <tr rv-each-rank="filesystem.ranks">
215 <td>{rank.rank}</td>
216 <td>{rank.state}</td>
217 <td>{rank.mds}</td>
218 <td>{rank.activity}</td>
219 <td>{rank.dns | dimless}</td>
220 <td>{rank.inos | dimless}</td>
221 </tr>
222 </tbody>
223 </table>
224 </div>
225 </div>
226 </div>
227 <div class="col-sm-6">
228 <div class="box">
229 <div class="box-header">
230 <h3 class="box-title">Pools</h3>
231 </div>
232 <div class="box-body">
233 <table class="table table-condensed">
234 <thead>
235 <tr>
236 <th>Pool</th>
237 <th>Type</th>
238 <th>Used</th>
239 <th>Avail</th>
240 <th></th>
241 </tr>
242 </thead>
243 <tbody>
244 <tr rv-each-pool="filesystem.pools">
245 <td>{pool.pool}</td>
246 <td>{pool.type}</td>
247 <td>{pool.used | dimless}</td>
248 <td>{pool.avail | dimless}</td>
249 <td>
250 <div class="progress"
251 style="width: 100px; height: 20px;">
252 <div class="progress-bar progress-bar-red"
253 rv-style="pool | pool_size_bar"></div>
254 </div>
255 </td>
256 </tr>
257 </tbody>
258 </table>
259 </div>
260 </div>
261 </div>
262
263 </div>
264 <div class="box">
265 <div class="box-header">
266 <h3 class="box-title">Standby daemons</h3>
267 </div>
268 <div class="box-body">
269 <table>
270 <thead>
271 <tr>
272 <th>Daemon</th>
273 </tr>
274 </thead>
275 <tbody>
276 <tr rv-each-standby="standbys">
277 <td>{standby.name}</td>
278 </tr>
279 </tbody>
280 </table>
281 </div>
282 </div>
283
284 <div id="mds_charts">
285 </div>
286
287</section>
288<!-- /.content -->
289
290{% endblock %}