diff --git a/static/js/custom.js b/static/js/custom.js index 494b19977..3ce846cf3 100644 --- a/static/js/custom.js +++ b/static/js/custom.js @@ -158,5 +158,85 @@ function readingTime() { times[i].innerText = `${time} minute read`; } } + +const urls = [ + "https://gridproxy.grid.tf/stats?status=up", + "https://gridproxy.dev.grid.tf/stats?status=up", + "https://gridproxy.test.grid.tf/stats?status=up", + "https://gridproxy.grid.tf/stats?status=standby", + "https://gridproxy.dev.grid.tf/stats?status=standby", + "https://gridproxy.test.grid.tf/stats?status=standby", +]; + +async function getStats() { + try { + const stats = await Promise.all( + urls.map((url) => fetch(url).then((resp) => resp.json())) + ); + return mergeStatsData(stats); + } catch (error) { + throw new Error( + `Failed to retrieve data from network statistics: ${error}` + ); + } +} + +function mergeStatsData(stats) { + const res = stats[0]; + for (let i = 1; i < stats.length; i++) { + res.nodes += stats[i].nodes; + res.totalCru += stats[i].totalCru; + res.totalHru += stats[i].totalHru; + res.totalSru += stats[i].totalSru; + res.nodesDistribution = mergeNodeDistribution([ + res.nodesDistribution, + stats[i].nodesDistribution, + ]); + res.countries = Object.keys(res.nodesDistribution).length; + } + let capacity = toTeraOrGiga(res.totalHru + res.totalSru); + document.getElementById("capacity").innerHTML = capacity; + document.getElementById("nodes").innerHTML = res.nodes; + document.getElementById("countries").innerHTML = res.countries; + document.getElementById("cores").innerHTML = res.totalCru + .toString() + .replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + +function mergeNodeDistribution(stats) { + const keys = new Set(stats.map((obj) => Object.keys(obj)).flat()); + + return Array.from(keys).reduce((res, key) => { + res[key] = 0; + stats.forEach((country) => { + res[key] += country[key] ?? 0; + }); + return res; + }, {}); +} + +function toTeraOrGiga(value) { + const giga = 1024 ** 3; + + if (!value) return "0"; + + const val = +value; + if (val === 0 || isNaN(val)) return "0"; + + if (val < giga) return val.toString(); + + let gb = val / giga; + + if (gb < 1024) return `${gb.toFixed(2)} GB`; + + gb = gb / 1024; + + if (gb < 1024) return `${gb.toFixed(2)} TB`; + + gb = gb / 1024; + return `${gb.toFixed(2)} PB`; +} + readingTime(); +getStats(); document.getElementById("year").innerHTML = new Date().getFullYear(); diff --git a/templates/shortcodes/grid_stats.html b/templates/shortcodes/grid_stats.html index 5e30c6dce..238dbd5e8 100644 --- a/templates/shortcodes/grid_stats.html +++ b/templates/shortcodes/grid_stats.html @@ -1,70 +1,63 @@ {% set styles = "background-image: url('images/V3.png');" %} -{% set data = load_data(url="https://gridproxy.grid.tf/stats?status=up", required=false, format="json") %} -{% if data %} -{% set capacity = (data.totalHru + data.totalSru) / 1024 / 1024 / 1024 / 1024 / 1024 %} -{% set nodes = data.nodes %} - {% set countries = data.countries %} - {% set cores = data.totalCru %} -{% endif %} - -{% if data %}
{{body | markdown | safe }} -
- - -
- -
- {{ capacity | round(precision=2) }}PB +
+ +
capacity
-
- - -
- -
- {{ nodes }} +
+ +
nodes
-
- - - -
- -
- {{ countries }} +
+ +
countries
-
- - -
- -
- {{ cores | num_format }} - cores + +
+ +
+ cores
- - -
- - - +
-{% endif %} \ No newline at end of file +