annotate console/src/main.ts @ 6:b1043d39e493

start web console
author drewp@bigasterisk.com
date Mon, 13 Mar 2023 18:53:45 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
1 import { startOfDay, subDays, differenceInMinutes, getUnixTime, addDays, format, min, formatISO } from "date-fns";
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
2 import * as echarts from "echarts";
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
3 import { TabulatorFull as Tabulator } from "tabulator-tables";
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
4
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
5 const QUERY_RANGE = "https://bigasterisk.com/m/prometheus/api/v1/query_range";
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
6 const MAC = new Map([
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
7 ]);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
8
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
9 function progQueryUrl(prog: string, s: Date, e: Date): URL {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
10 const rangeMins = differenceInMinutes(e, s);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
11 const out = new URL(QUERY_RANGE);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
12
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
13 const host = "Kelsis-iMac";
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
14 const isRunningQl = `racc_running{prog="${prog}",host="${host}"}`;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
15 const isNonIdleQl = `max(racc_idle{host="${host}"}) < 100`;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
16 const countedTimeQl = `(${isRunningQl}) if (${isNonIdleQl})`;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
17 const integralQl = `integrate((${countedTimeQl})[${rangeMins}m])`;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
18 const hoursQl = `${integralQl}/1h`;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
19
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
20 out.searchParams.append("query", hoursQl);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
21 out.searchParams.append("start", "" + getUnixTime(s));
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
22 out.searchParams.append("end", "" + getUnixTime(e));
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
23 out.searchParams.append("step", "1m");
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
24 return out;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
25 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
26
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
27 async function queryLastRow(queryUrl: URL): Promise<string> {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
28 const response = await fetch(queryUrl);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
29 const body = await response.json();
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
30 if (!body?.data?.result) {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
31 return "0";
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
32 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
33 const m = body.data.result[0];
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
34 if (m?.values?.length) {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
35 const lastRow = m.values[m.values.length - 1];
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
36 return parseFloat(lastRow[1]).toFixed(2);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
37 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
38 return "0";
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
39 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
40
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
41 async function makeSeries(now: Date, meas: string, prog: string, numDays: number): Promise<echarts.BarSeriesOption> {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
42 const rows = [];
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
43 const sod = startOfDay(now);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
44
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
45 for (let i = numDays-1 ; i >= 0; i--) {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
46 const s = subDays(sod, i);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
47 const e = min([now, addDays(s, 1)]);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
48 console.log(i, formatISO(s), formatISO(e));
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
49 rows.push(queryLastRow(progQueryUrl(prog, s, e)));
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
50 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
51 const mc = await Promise.all(rows);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
52
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
53 return {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
54 name: meas,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
55 type: "bar",
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
56 animation: false,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
57 data: mc,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
58 emphasis: { focus: "series" },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
59 label: { show: true },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
60 stack: "total",
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
61
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
62 };
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
63 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
64
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
65 function dateRowLabels(now: Date, days: number) {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
66 const rowNames = [];
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
67 for (let d = subDays(now, days - 1); d < now; d = addDays(d, 1)) {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
68 rowNames.push(format(d, "MM/dd EEE"));
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
69 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
70 rowNames.push(format(now, "MM/dd EEE") + " (today)");
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
71 return rowNames;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
72 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
73
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
74 function fillDebugTable(el: HTMLElement) {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
75 var rows = [];
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
76
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
77 const vmui = (expr: string, range: string): string =>
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
78 "https://bigasterisk.com/m/vmui/?" +
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
79 "g0.expr=" +
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
80 encodeURIComponent(expr) + //
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
81 "&g0.range_input=" +
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
82 encodeURIComponent(range);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
83 const view = (url: string): string => `<a href="${url}">view</a>`;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
84 for (let host of ["Kelsis-iMac", "dash", "dot", "plus"]) {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
85 rows.push({
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
86 id: rows.length,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
87 host: host,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
88 metrics: view(`http://${host}:5150/metrics`),
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
89 uptime: view(vmui(`python_info{job="racc",instance="${host}:5150"}`, "14d")),
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
90 traffic: view(vmui(`rate(lan_bytes_sent_from_total{mac="${MAC.get(host)}"})`, "6h")),
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
91 });
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
92 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
93 var table = new Tabulator(el, {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
94 data: rows,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
95 columns: [
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
96 { title: "Host", field: "host" },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
97 { title: "current /metrics", field: "metrics", formatter: "html" },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
98 { title: "racc uptime history", field: "uptime", formatter: "html" },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
99 { title: "outgoing net traffic", field: "traffic", formatter: "html" },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
100 ],
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
101 });
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
102 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
103
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
104 async function main() {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
105 fillDebugTable(document.getElementById("debug1")!);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
106
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
107 const now = new Date();
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
108
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
109 const chartDom = document.getElementById("chart1")!;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
110 const chart = echarts.init(chartDom);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
111
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
112 const nDays = 8;
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
113 const rowNames = dateRowLabels(now, nDays);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
114
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
115 const option: echarts.EChartsOption = {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
116 tooltip: {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
117 trigger: "axis",
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
118 axisPointer: {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
119 type: "shadow",
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
120 },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
121 },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
122 legend: {},
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
123 grid: {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
124 left: "0%",
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
125 containLabel: true,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
126 },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
127 xAxis: {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
128 type: "value",
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
129 max: 10,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
130 },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
131 yAxis: {
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
132 type: "category",
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
133 data: rowNames,
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
134 },
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
135 series: await Promise.all([
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
136 makeSeries(now, "Minecraft hours", "minecraft", nDays), //
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
137 makeSeries(now, "Roblox hours", "roblox", nDays),
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
138 ]),
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
139 };
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
140 console.log(option);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
141 chart.setOption(option);
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
142 }
b1043d39e493 start web console
drewp@bigasterisk.com
parents:
diff changeset
143 main();