From 4406caf2682c2dc6885e76d1c4b8eb04a5cf6c36 Mon Sep 17 00:00:00 2001 From: Peolite001 Date: Tue, 28 Apr 2026 12:46:34 +0100 Subject: [PATCH] feat: Performance Monitoring Dashboard Real-Time Behavior Metrics refresh every 5 seconds Alerts update automatically No page reload needed --- src/lib/monitoring/alerts.ts | 28 ++++++++++++++++++++ src/lib/monitoring/metrics.ts | 22 ++++++++++++++++ src/lib/monitoring/provider.ts | 27 +++++++++++++++++++ src/pages/admin/monitoring.tsx | 47 ++++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 src/lib/monitoring/alerts.ts create mode 100644 src/lib/monitoring/metrics.ts create mode 100644 src/lib/monitoring/provider.ts create mode 100644 src/pages/admin/monitoring.tsx diff --git a/src/lib/monitoring/alerts.ts b/src/lib/monitoring/alerts.ts new file mode 100644 index 00000000..c372272b --- /dev/null +++ b/src/lib/monitoring/alerts.ts @@ -0,0 +1,28 @@ +import { Metric } from "./provider"; + +export type Alert = { + message: string; + severity: "low" | "high"; +}; + +export function checkAlerts(metrics: Metric[]): Alert[] { + const alerts: Alert[] = []; + + metrics.forEach((m) => { + if (m.name === "response_time" && m.value > 400) { + alerts.push({ + message: "High response time detected", + severity: "high", + }); + } + + if (m.name === "error_rate" && m.value > 3) { + alerts.push({ + message: "Error rate is above threshold", + severity: "high", + }); + } + }); + + return alerts; +} \ No newline at end of file diff --git a/src/lib/monitoring/metrics.ts b/src/lib/monitoring/metrics.ts new file mode 100644 index 00000000..d22bd97e --- /dev/null +++ b/src/lib/monitoring/metrics.ts @@ -0,0 +1,22 @@ +import { useEffect, useState } from "react"; +import { LocalMonitoringProvider, Metric } from "./provider"; + +const provider = new LocalMonitoringProvider(); + +export function useMetrics() { + const [metrics, setMetrics] = useState([]); + + useEffect(() => { + const fetchMetrics = async () => { + const data = await provider.getMetrics(); + setMetrics(data); + }; + + fetchMetrics(); + const interval = setInterval(fetchMetrics, 5000); // real-time updates + + return () => clearInterval(interval); + }, []); + + return metrics; +} \ No newline at end of file diff --git a/src/lib/monitoring/provider.ts b/src/lib/monitoring/provider.ts new file mode 100644 index 00000000..decfc134 --- /dev/null +++ b/src/lib/monitoring/provider.ts @@ -0,0 +1,27 @@ +export type Metric = { + name: string; + value: number; + timestamp: number; +}; + +export interface MonitoringProvider { + getMetrics(): Promise; +} + +// Simple local provider (can swap with Datadog/New Relic later) +export class LocalMonitoringProvider implements MonitoringProvider { + async getMetrics(): Promise { + return [ + { + name: "response_time", + value: Math.random() * 500, + timestamp: Date.now(), + }, + { + name: "error_rate", + value: Math.random() * 5, + timestamp: Date.now(), + }, + ]; + } +} \ No newline at end of file diff --git a/src/pages/admin/monitoring.tsx b/src/pages/admin/monitoring.tsx new file mode 100644 index 00000000..f9875d05 --- /dev/null +++ b/src/pages/admin/monitoring.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import { useMetrics } from "@/lib/monitoring/metrics"; +import { checkAlerts } from "@/lib/monitoring/alerts"; + +const MonitoringDashboard: React.FC = () => { + const metrics = useMetrics(); + const alerts = checkAlerts(metrics); + + return ( +
+

+ Performance Monitoring Dashboard +

+ + {/* Alerts */} + {alerts.length > 0 && ( +
+ {alerts.map((alert, i) => ( +
+ 🚨 {alert.message} +
+ ))} +
+ )} + + {/* Metrics */} +
+ {metrics.map((metric) => ( +
+

{metric.name}

+

+ {metric.value.toFixed(2)} +

+
+ ))} +
+
+ ); +}; + +export default MonitoringDashboard; \ No newline at end of file