Files
fnx_web/res/include/script/admin.js

262 lines
8.6 KiB
JavaScript
Raw Normal View History

2020-08-11 19:52:03 +02:00
let graphViews = drawGraph(document.getElementById("views_chart"), "Views", "number");
let graphBandwidth = drawGraph(document.getElementById("bandwidth_chart"), "Bandwidth", "bytes");
2020-08-18 13:04:26 +02:00
let graphTimeout = null;
2020-12-15 16:25:20 +01:00
function loadGraph(minutes, interval, live) {
2020-06-08 16:17:25 +02:00
if (graphTimeout !== null) { clearTimeout(graphTimeout) }
if (live) {
2020-12-15 16:25:20 +01:00
graphTimeout = setTimeout(() => { loadGraph(minutes, interval, true) }, 10000)
2020-06-08 16:17:25 +02:00
}
2020-05-25 22:31:40 +02:00
let today = new Date()
let start = new Date()
2020-12-15 16:25:20 +01:00
start.setMinutes(start.getMinutes() - minutes)
2020-05-25 22:31:40 +02:00
fetch(
2020-12-15 16:25:20 +01:00
apiEndpoint + "/admin/files/timeseries" +
"?start=" + start.toISOString() +
"&end=" + today.toISOString() +
"&interval=" + interval
2020-05-25 22:31:40 +02:00
).then(resp => {
2020-12-15 16:25:20 +01:00
if (!resp.ok) { return Promise.reject("Error: " + resp.status); }
2020-05-25 22:31:40 +02:00
return resp.json();
}).then(resp => {
2020-08-11 19:52:03 +02:00
resp.views.timestamps.forEach((val, idx) => {
let date = new Date(val);
2020-12-15 16:25:20 +01:00
let dateStr = ("00" + (date.getMonth() + 1)).slice(-2);
dateStr += "-" + ("00" + date.getDate()).slice(-2);
dateStr += " " + ("00" + date.getHours()).slice(-2);
dateStr += ":" + ("00" + date.getMinutes()).slice(-2);
resp.views.timestamps[idx] = " " + dateStr + " "; // Poor man's padding
2020-08-11 19:52:03 +02:00
});
graphViews.data.labels = resp.views.timestamps;
graphViews.data.datasets[0].data = resp.views.amounts;
graphBandwidth.data.labels = resp.views.timestamps;
graphBandwidth.data.datasets[0].data = resp.bandwidth.amounts;
graphViews.update()
graphBandwidth.update();
2020-08-11 19:52:03 +02:00
document.getElementById("time_start").innerText = resp.views.timestamps[0];
document.getElementById("time_end").innerText = resp.views.timestamps.slice(-1)[0];
let total = 0
resp.bandwidth.amounts.forEach(e => { total += e; });
document.getElementById("total_bandwidth").innerText = formatDataVolume(total, 3);
total = 0
resp.views.amounts.forEach(e => { total += e; });
document.getElementById("total_views").innerText = formatThousands(total);
2020-05-25 22:31:40 +02:00
}).catch(e => {
2020-12-15 16:25:20 +01:00
alert("Error requesting time series: " + e);
2020-05-25 22:31:40 +02:00
})
}
2020-06-08 16:17:25 +02:00
2020-12-22 00:07:43 +01:00
loadGraph(10080, 10, false);
2020-08-18 13:04:26 +02:00
2020-12-15 16:25:20 +01:00
function loadGraphDate(start, end, interval) {
2020-08-18 13:04:26 +02:00
fetch(
2020-12-15 16:25:20 +01:00
apiEndpoint + "/admin/files/timeseries" +
"?start=" + start.toISOString() +
"&end=" + end.toISOString() +
"&interval=" + interval
2020-08-18 13:04:26 +02:00
).then(resp => {
2020-12-15 16:25:20 +01:00
if (!resp.ok) { return Promise.reject("Error: " + resp.status); }
2020-08-18 13:04:26 +02:00
return resp.json();
}).then(resp => {
resp.views.timestamps.forEach((val, idx) => {
let date = new Date(val);
let dateStr = date.getUTCFullYear() +
2020-12-15 16:25:20 +01:00
"-" + ("00" + (date.getUTCMonth() + 1)).slice(-2) +
"-" + ("00" + date.getUTCDate()).slice(-2) +
" " + ("00" + date.getUTCHours()).slice(-2) +
":" + ("00" + date.getUTCMinutes()).slice(-2);
resp.views.timestamps[idx] = " " + dateStr + " "; // Poor man's padding
2020-08-18 13:04:26 +02:00
});
graphViews.data.labels = resp.views.timestamps;
graphViews.data.datasets[0].data = resp.views.amounts;
graphBandwidth.data.labels = resp.views.timestamps;
graphBandwidth.data.datasets[0].data = resp.bandwidth.amounts;
graphViews.update()
graphBandwidth.update();
2020-08-11 19:52:03 +02:00
2020-08-18 13:04:26 +02:00
document.getElementById("time_start").innerText = resp.views.timestamps[0];
document.getElementById("time_end").innerText = resp.views.timestamps.slice(-1)[0];
let total = 0
resp.bandwidth.amounts.forEach(e => { total += e; });
document.getElementById("total_bandwidth").innerText = formatDataVolume(total, 3);
total = 0
resp.views.amounts.forEach(e => { total += e; });
document.getElementById("total_views").innerText = formatThousands(total);
}).catch(e => {
2020-12-15 16:25:20 +01:00
alert("Error requesting time series: " + e);
2020-08-18 13:04:26 +02:00
})
2020-08-11 19:52:03 +02:00
}
2020-08-18 13:04:26 +02:00
let tsSpan;
let tsStart;
function loadTimespan(span, base) {
base.setUTCHours(0, 0, 0, 0);
if (span === "day") {
let start = new Date(base);
let end = new Date(base);
end.setUTCHours(23, 59, 59, 999);
tsStart = start;
loadGraphDate(start, end, 1);
} else if (span === "week") {
let monday = new Date(Date.UTC(
base.getUTCFullYear(), base.getUTCMonth(), base.getUTCDate() - base.getUTCDay() + 1
));
let sunday = new Date(Date.UTC(
base.getUTCFullYear(), base.getUTCMonth(), base.getUTCDate() - base.getUTCDay() + 7,
23, 59, 59
));
tsStart = monday;
loadGraphDate(monday, sunday, 60);
} else if (span === "month") {
let start = new Date(Date.UTC(base.getUTCFullYear(), base.getUTCMonth(), 1));
2020-12-15 16:25:20 +01:00
let end = new Date(Date.UTC(base.getUTCFullYear(), base.getUTCMonth() + 1, 0, 23, 59, 59));
2020-08-18 13:04:26 +02:00
tsStart = start;
loadGraphDate(start, end, 60);
} else if (span === "quarter") {
2020-12-15 16:25:20 +01:00
let start = new Date(Date.UTC(base.getUTCFullYear(), 3.0 * Math.floor(base.getUTCMonth() / 3.0), 1));
let end = new Date(Date.UTC(base.getUTCFullYear(), 3.0 * Math.ceil(base.getUTCMonth() / 3.0), 0, 23, 59, 59));
2020-08-18 13:04:26 +02:00
tsStart = start;
loadGraphDate(start, end, 1440);
} else if (span === "year") {
let start = new Date(Date.UTC(base.getUTCFullYear(), 0, 1));
2020-12-15 16:25:20 +01:00
let end = new Date(Date.UTC(base.getUTCFullYear() + 1, 0, 0, 23, 59, 59));
2020-08-18 13:04:26 +02:00
tsStart = start;
loadGraphDate(start, end, 1440);
} else {
console.error("Invalid timespan", ts);
}
tsSpan = span;
}
function navigateTimespan(forward) {
let offYear = 0, offMonth = 0, offDay = 0;
switch (tsSpan) {
2020-12-15 16:25:20 +01:00
case "day":
offDay = 1;
break;
case "week":
offDay = 7;
break;
case "month":
offMonth = 1;
break;
case "quarter":
offMonth = 3;
break;
case "year":
offYear = 1;
break;
2020-08-18 13:04:26 +02:00
}
if (!forward) {
offDay = -offDay;
offMonth = -offMonth;
offYear = -offYear;
}
loadTimespan(
tsSpan,
new Date(Date.UTC(
2020-12-15 16:25:20 +01:00
tsStart.getUTCFullYear() + offYear,
tsStart.getUTCMonth() + offMonth,
tsStart.getUTCDay() + offDay,
2020-08-18 13:04:26 +02:00
))
)
}
2020-05-25 22:31:40 +02:00
// Load performance statistics
2020-11-09 12:27:55 +01:00
let lastOrder;
2020-05-25 22:31:40 +02:00
function getStats(order) {
2020-06-01 14:52:25 +02:00
lastOrder = order
2020-12-15 16:25:20 +01:00
fetch(apiEndpoint + "/status").then(
2020-05-25 22:31:40 +02:00
resp => resp.json()
).then(resp => {
2020-08-31 18:48:54 +02:00
document.getElementById("file_stats_watchers").innerText = resp.stats_watcher_threads;
document.getElementById("file_stats_listeners").innerText = resp.stats_watcher_listeners;
2020-08-31 18:58:32 +02:00
document.getElementById("file_stats_avg").innerText = (
resp.stats_watcher_listeners / resp.stats_watcher_threads
).toPrecision(3);
2020-08-31 18:48:54 +02:00
2020-11-09 12:27:55 +01:00
document.getElementById("local_reads").innerText = resp.local_reads;
document.getElementById("local_read_size").innerText = formatDataVolume(resp.local_read_size, 4);
2020-11-04 20:51:39 +01:00
document.getElementById("remote_reads").innerText = resp.remote_reads;
2020-11-09 12:27:55 +01:00
document.getElementById("remote_read_size").innerText = formatDataVolume(resp.remote_read_size, 4);
2021-01-18 13:40:28 +01:00
document.getElementById("local_reads_rate").innerText = resp.local_reads_per_sec.toPrecision(4) + " / s";
document.getElementById("local_read_size_rate").innerText = formatDataVolume(resp.local_read_size_per_sec, 4) + " / s";
document.getElementById("remote_reads_rate").innerText = resp.remote_reads_per_sec.toPrecision(4) + " / s";
document.getElementById("remote_read_size_rate").innerText = formatDataVolume(resp.remote_read_size_per_sec, 4) + " / s";
2020-11-04 20:51:39 +01:00
2020-12-15 16:25:20 +01:00
document.getElementById("db_time").innerText = printDate(new Date(resp.db_time), true, true, true);
document.getElementById("db_latency").innerText = formatNumber(resp.db_latency / 1000, 3) + " ms";
2020-05-25 22:31:40 +02:00
2020-09-15 14:31:52 +02:00
let p = document.getElementById("tbody_peers")
p.innerHTML = ""
resp.peers.forEach(v => {
let row = document.createElement("tr")
row.innerHTML = `\
<td>${v.address}</td>
<td>${v.position}</td>
<td>${v.reachable}</td>
<td>${v.unreachable_count}</td>
2021-05-05 20:20:34 +02:00
<td>${v.load_1_min}</td>
<td>${v.load_5_min}</td>
<td>${v.load_15_min}</td>
2020-09-15 14:31:52 +02:00
<td>${formatDuration(v.latency)}</td>
<td>${formatDataVolume(v.free_space, 3)}</td>
<td>${formatDataVolume(v.min_free_space, 3)}</td>`
2020-09-15 14:54:24 +02:00
2020-12-15 16:25:20 +01:00
if (v.free_space < v.min_free_space / 2 || !v.reachable) {
2020-09-15 14:54:24 +02:00
row.classList.add("highlight_red")
2020-09-15 15:02:20 +02:00
} else if (v.free_space < v.min_free_space) {
2020-09-15 15:00:08 +02:00
row.classList.add("highlight_blue")
2020-09-15 14:54:24 +02:00
} else {
row.classList.add("highlight_green")
}
2021-04-07 19:30:12 +02:00
row.style.textAlign = "left"
2020-09-15 14:31:52 +02:00
p.appendChild(row)
})
2020-05-25 22:31:40 +02:00
resp.query_statistics.sort((a, b) => {
2020-12-15 16:25:20 +01:00
if (typeof (a[order]) === "number") {
2020-05-25 22:31:40 +02:00
// Sort ints from high to low
return b[order] - a[order]
} else {
// Sort strings alphabetically
return a[order].localeCompare(b[order])
}
})
2020-09-15 14:31:52 +02:00
let t = document.getElementById("tstat_body")
t.innerHTML = ""
2020-05-25 22:31:40 +02:00
resp.query_statistics.forEach((v) => {
let callers = ""
v.callers.sort((a, b) => b.count - a.count)
v.callers.forEach((v1) => {
callers += `${v1.count}x ${v1.name}<br/>`
})
let row = document.createElement("tr")
row.innerHTML = `\
<td>${v.query_name}</td>
<td>${v.calls}</td>
<td>${formatDuration(v.average_duration)}</td>
<td>${formatDuration(v.total_duration)}</td>
<td>${callers}</td>`
t.appendChild(row)
})
})
}
getStats("calls")
2020-06-01 14:52:25 +02:00
2021-05-05 20:20:34 +02:00
setInterval(() => { getStats(lastOrder) }, 10000)