diff --git a/lib/grafana.ts b/lib/grafana.ts index 5e6310a..2c3fd0a 100644 --- a/lib/grafana.ts +++ b/lib/grafana.ts @@ -57,7 +57,7 @@ export const getRootFsUsage = async () => { }) return { - usage: response.results.A.frames[0].data.values[1][15].toFixed(2) + rootFsUsage: response.results.A.frames[0].data.values[1][15].toFixed(2) } } @@ -88,12 +88,72 @@ export const getUptime = async () => { const seconds = response.results.A.frames[0].data.values[1][15] const minutes = (seconds / 60).toFixed(2) const hours = (seconds / 3_600).toFixed(2) + const days = (seconds / 86400).toFixed(2) const weeks = (seconds / 604_800).toFixed(2) return { seconds: (seconds).toFixed(2), minutes, hours, + days, weeks } +} + +export const getRamUsage = async () => { + const response = await fetcher(GRAFANA_URL, { + method: 'POST', + headers: { + Authorization: `Bearer ${GRAFANA_TOKEN}`, + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + "queries": [ + { + "datasource": { + "uid": "4f-R6jgRz", + "type": "prometheus" + }, + "expr": "100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes)", + "maxDataPoints": 100 + } + ], + "from": "now-5m", + "to": "now" + }) + }) + + return { + ramUsage: response.results.A.frames[0].data.values[1][15].toFixed(2) + } +} + +export const getSysLoad = async () => { + const response = await fetcher(GRAFANA_URL, { + method: 'POST', + headers: { + Authorization: `Bearer ${GRAFANA_TOKEN}`, + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + "queries": [ + { + "datasource": { + "uid": "4f-R6jgRz", + "type": "prometheus" + }, + "expr": "avg(node_load5) / count(count(node_cpu_seconds_total) by (cpu)) * 100", + "maxDataPoints": 100 + } + ], + "from": "now-5m", + "to": "now" + }) + }) + + return { + sysLoad: response.results.A.frames[0].data.values[1][15].toFixed(2) + } } \ No newline at end of file diff --git a/pages/api/grafana/ram.ts b/pages/api/grafana/ram.ts new file mode 100644 index 0000000..2dd3a62 --- /dev/null +++ b/pages/api/grafana/ram.ts @@ -0,0 +1,8 @@ +import {NextApiRequest, NextApiResponse} from 'next' +import {getRamUsage} from '@/lib/grafana' + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const response = await getRamUsage() + + return res.status(200).json(response) +} \ No newline at end of file diff --git a/pages/api/grafana/sysload.ts b/pages/api/grafana/sysload.ts new file mode 100644 index 0000000..ef53172 --- /dev/null +++ b/pages/api/grafana/sysload.ts @@ -0,0 +1,8 @@ +import {NextApiRequest, NextApiResponse} from 'next' +import {getSysLoad} from '@/lib/grafana' + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const response = await getSysLoad() + + return res.status(200).json(response) +} \ No newline at end of file diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 3912c06..c587b61 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -16,6 +16,8 @@ const config = { export default function Dashboard({metrics}: { metrics: MetricGroup }) { const {data: tempData} = useSWR('api/grafana/temp', fetcher, config) + const {data: sysLoadData} = useSWR('api/grafana/sysload', fetcher, config) + const {data: ramData} = useSWR('api/grafana/ram', fetcher, config) const {data: rootFsData} = useSWR('api/grafana/rootfs', fetcher, config) const {data: uptimeData} = useSWR('api/grafana/uptime', fetcher, config) @@ -61,7 +63,23 @@ export default function Dashboard({metrics}: { metrics: MetricGroup }) { Temperature - {tempData ? `${tempData.temp} ℃` : "—"} + {tempData ? `${tempData.temp}℃` : "—"} + + + +

+ Sys load (5m avg) +

+ + {sysLoadData ? `${sysLoadData.sysLoad}%` : "—"} + +
+ +

+ RAM usage +

+ + {ramData ? `${ramData.ramUsage}%` : "—"}
@@ -69,15 +87,15 @@ export default function Dashboard({metrics}: { metrics: MetricGroup }) { Root FS usage - {rootFsData ? `${rootFsData.usage} %` : "—"} + {rootFsData ? `${rootFsData.rootFsUsage}%` : "—"}

- Uptime minutes + Uptime days

- {uptimeData ? `${numberFormat(uptimeData.minutes)}` : "—"} + {uptimeData ? `${numberFormat(uptimeData.days)}` : "—"}