diff --git a/libs/stats.js b/libs/stats.js new file mode 100644 index 0000000..e73980c --- /dev/null +++ b/libs/stats.js @@ -0,0 +1,21 @@ +const stats = { + apiqps: 0, + lastAccess: 0, +}; + +const addAPIQPS = () => { + stats.apiqps++; + clearStats(); +}; + +const clearStats = () => { + const now = Date.now(); + if (stats.lastAccess + 1000 < now) { + const now_formated = new Date(now).toISOString(); + console.log(`${now_formated} - APIQPS: ${stats.apiqps}`); + stats.apiqps = parseInt(stats.apiqps / 3); + stats.lastAccess = now; + } +}; + +export { stats, addAPIQPS }; diff --git a/pages/api/stats.js b/pages/api/stats.js new file mode 100644 index 0000000..0c69cfe --- /dev/null +++ b/pages/api/stats.js @@ -0,0 +1,7 @@ +import { stats, addAPIQPS } from "../../libs/stats"; + +export default function handler(req, res) { + addAPIQPS(); + res.setHeader("Cache-Control", "no-cache no-store must-revalidate"); + res.status(200).json(stats); +} diff --git a/pages/api/time/limit.js b/pages/api/time/limit.js index 6ee568b..97505ba 100644 --- a/pages/api/time/limit.js +++ b/pages/api/time/limit.js @@ -1,6 +1,8 @@ import { authenticate, setLimit, getLimit } from "../../../libs/db"; +import { addAPIQPS } from "../../../libs/stats"; export default function handler(req, res) { + addAPIQPS(); // put method if (req.method === "PUT") { const { token, limit } = req.body; diff --git a/pages/api/time/ranges.js b/pages/api/time/ranges.js index 158bc8a..fbfc92f 100644 --- a/pages/api/time/ranges.js +++ b/pages/api/time/ranges.js @@ -1,6 +1,9 @@ import { authenticate, getTimeRanges, insertTimeRange } from "../../../libs/db"; +import { addAPIQPS } from "../../../libs/stats"; + export default function handler(req, res) { + addAPIQPS(); // get method if (req.method === "GET") { res.setHeader("Cache-Control", "no-cache no-store must-revalidate"); diff --git a/pages/api/time/ranges/[id].js b/pages/api/time/ranges/[id].js index 139b9f4..36a540a 100644 --- a/pages/api/time/ranges/[id].js +++ b/pages/api/time/ranges/[id].js @@ -5,7 +5,10 @@ import { updateUsernameWithLimit, } from "../../../../libs/db"; +import { addAPIQPS } from '../../../../libs/stats'; + export default function handler(req, res) { + addAPIQPS(); // check if id is valid const { id } = req.query; if (id === undefined) { diff --git a/pages/api/time/started.js b/pages/api/time/started.js index 379f67a..eb5fb5b 100644 --- a/pages/api/time/started.js +++ b/pages/api/time/started.js @@ -1,6 +1,8 @@ import { authenticate, getStarted, setStarted } from "../../../libs/db"; +import { addAPIQPS } from "../../../libs/stats"; export default function handler(req, res) { + addAPIQPS(); // get method if (req.method === "GET") { res.setHeader("Cache-Control", "no-cache no-store must-revalidate"); diff --git a/pages/time.js b/pages/time.js index 878fa21..bc4b44c 100644 --- a/pages/time.js +++ b/pages/time.js @@ -16,9 +16,9 @@ import { } from "@mui/material"; import { useEffect, useState } from "react"; import { useRouter } from "next/router"; -import config from '../next.config'; +import config from "../next.config"; -const prefix = config.basePath ? config.basePath : ''; +const prefix = config.basePath ? config.basePath : ""; export default function Time(props) { const [ranges, setRanges] = useState([]); @@ -29,9 +29,20 @@ export default function Time(props) { const [snackbarSuccess, setSnackbarSuccess] = useState(false); const [limit, setLimit] = useState(1); const [token, setToken] = useState(""); + const [stats, setStats] = useState({}); const router = useRouter(); + const getStats = () => { + fetch(`${prefix}/api/stats`, { + method: "GET", + }) + .then((res) => res.json()) + .then((res) => { + setStats(res); + }); + }; + const setStarted = (started) => { fetch(`${prefix}/api/time/started`, { method: "PUT", @@ -98,6 +109,7 @@ export default function Time(props) { const refreshRanges = () => { getLimit(); + getStats(); fetch(`${prefix}/api/time/ranges`) .then((res) => res.json()) .then((res) => { @@ -275,13 +287,20 @@ export default function Time(props) { }} > - 当前每人排班数量上限:{limit} + + 当前每人数量上限: {limit} +
+ 服务器负载 (QPS): {stats.apiqps} +