Files
DynamoDNS/client/src/pages/metrics.tsx
T
alphaeusmote cba930e4d3 Implement initial application structure and UI.
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 9111ef36-26c8-4085-84ca-a35dc1fec1b5
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7083d608-d6d3-4a6a-9a27-6286c5109627/54918520-d42c-44cd-b4f4-9e5a42eb5be1.jpg
2025-04-09 21:34:26 +00:00

267 lines
9.8 KiB
TypeScript

import { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import { MainLayout } from "@/components/layouts/main-layout";
import { DnsUpdateChart } from "@/components/charts/dns-update-chart";
import { ProviderDistributionChart } from "@/components/charts/provider-distribution-chart";
import { RecordTypeChart } from "@/components/charts/record-type-chart";
import { Domain, DnsRecord } from "@shared/schema";
import { useOrganization } from "@/context/organization-context";
import {
Card,
CardContent,
CardHeader,
CardTitle,
CardDescription,
} from "@/components/ui/card";
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { BarChart, LineChart, PieChart, Home, BarChart2, Activity, Clock } from "lucide-react";
export default function MetricsPage() {
const { currentOrganization } = useOrganization();
const [selectedTimeframe, setSelectedTimeframe] = useState("day");
const [selectedDomain, setSelectedDomain] = useState<string>("all");
// Fetch domains for filter
const { data: domains = [] } = useQuery<Domain[]>({
queryKey: ["/api/domains", currentOrganization?.id],
enabled: !!currentOrganization?.id,
});
// Fetch DNS records stats (would be from actual API)
const { data: recordsStats } = useQuery({
queryKey: ["/api/metrics/records", selectedTimeframe, selectedDomain],
enabled: false, // Would be enabled in a real implementation
});
return (
<MainLayout
title="Metrics & Statistics"
description="View performance metrics for your DNS configuration."
>
{/* Filter controls */}
<div className="flex flex-col sm:flex-row justify-between mb-6 gap-4">
<div className="flex items-center space-x-4">
<Select
value={selectedDomain}
onValueChange={setSelectedDomain}
>
<SelectTrigger className="w-[200px]">
<SelectValue placeholder="Select domain" />
</SelectTrigger>
<SelectContent>
<SelectItem value="all">All Domains</SelectItem>
{domains.map(domain => (
<SelectItem key={domain.id} value={domain.id.toString()}>
{domain.name}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div>
{/* Update Activity Chart */}
<Card className="mb-8">
<CardHeader>
<div className="flex flex-col sm:flex-row justify-between items-start sm:items-center">
<div>
<CardTitle>DNS Update Activity</CardTitle>
<CardDescription>
Frequency of DNS record updates over time
</CardDescription>
</div>
<Tabs defaultValue="day" className="mt-2 sm:mt-0">
<TabsList>
<TabsTrigger
value="day"
onClick={() => setSelectedTimeframe("day")}
>
Day
</TabsTrigger>
<TabsTrigger
value="week"
onClick={() => setSelectedTimeframe("week")}
>
Week
</TabsTrigger>
<TabsTrigger
value="month"
onClick={() => setSelectedTimeframe("month")}
>
Month
</TabsTrigger>
</TabsList>
</Tabs>
</div>
</CardHeader>
<CardContent>
<div className="h-80">
<DnsUpdateChart timeframe={selectedTimeframe} domainId={selectedDomain !== "all" ? parseInt(selectedDomain) : undefined} />
</div>
</CardContent>
</Card>
{/* Distribution Charts */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
<Card>
<CardHeader>
<CardTitle>DNS Provider Distribution</CardTitle>
<CardDescription>
Breakdown of domains by DNS provider
</CardDescription>
</CardHeader>
<CardContent>
<div className="h-72">
<ProviderDistributionChart />
</div>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Record Type Distribution</CardTitle>
<CardDescription>
Breakdown of DNS records by type
</CardDescription>
</CardHeader>
<CardContent>
<div className="h-72">
<RecordTypeChart />
</div>
</CardContent>
</Card>
</div>
{/* Performance Metrics */}
<Card className="mb-8">
<CardHeader>
<CardTitle>DNS Performance Metrics</CardTitle>
<CardDescription>
Key metrics for your DNS configuration
</CardDescription>
</CardHeader>
<CardContent>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<div className="bg-muted/30 rounded-lg p-4">
<div className="flex items-center mb-2">
<Activity className="mr-2 h-5 w-5 text-primary" />
<h3 className="text-sm font-medium">Avg. Response Time</h3>
</div>
<p className="text-2xl font-bold">38 ms</p>
<p className="text-xs text-muted-foreground mt-1">5% faster than last week</p>
</div>
<div className="bg-muted/30 rounded-lg p-4">
<div className="flex items-center mb-2">
<Clock className="mr-2 h-5 w-5 text-primary" />
<h3 className="text-sm font-medium">Uptime</h3>
</div>
<p className="text-2xl font-bold">99.98%</p>
<p className="text-xs text-muted-foreground mt-1">Last 30 days</p>
</div>
<div className="bg-muted/30 rounded-lg p-4">
<div className="flex items-center mb-2">
<BarChart className="mr-2 h-5 w-5 text-primary" />
<h3 className="text-sm font-medium">Update Frequency</h3>
</div>
<p className="text-2xl font-bold">4.2/day</p>
<p className="text-xs text-muted-foreground mt-1">Avg. updates per day</p>
</div>
<div className="bg-muted/30 rounded-lg p-4">
<div className="flex items-center mb-2">
<BarChart2 className="mr-2 h-5 w-5 text-primary" />
<h3 className="text-sm font-medium">Propagation Time</h3>
</div>
<p className="text-2xl font-bold">43 sec</p>
<p className="text-xs text-muted-foreground mt-1">Avg. global propagation</p>
</div>
</div>
</CardContent>
</Card>
{/* DNS Records Health */}
<Card>
<CardHeader>
<CardTitle>DNS Records Health</CardTitle>
<CardDescription>
Health status of your DNS records
</CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-4">
<div className="flex items-center justify-between pb-4 border-b">
<div className="flex items-center">
<Home className="mr-3 h-5 w-5 text-primary" />
<div>
<p className="font-medium">example.com</p>
<p className="text-sm text-muted-foreground">A, CNAME, MX records</p>
</div>
</div>
<div className="flex items-center">
<span className="inline-block w-2 h-2 bg-success rounded-full mr-2"></span>
<span className="text-sm font-medium">Healthy</span>
</div>
</div>
<div className="flex items-center justify-between pb-4 border-b">
<div className="flex items-center">
<Home className="mr-3 h-5 w-5 text-primary" />
<div>
<p className="font-medium">api.example.org</p>
<p className="text-sm text-muted-foreground">A, CNAME records</p>
</div>
</div>
<div className="flex items-center">
<span className="inline-block w-2 h-2 bg-warning rounded-full mr-2"></span>
<span className="text-sm font-medium">Outdated</span>
</div>
</div>
<div className="flex items-center justify-between pb-4 border-b">
<div className="flex items-center">
<Home className="mr-3 h-5 w-5 text-primary" />
<div>
<p className="font-medium">cdn.testsite.com</p>
<p className="text-sm text-muted-foreground">A, AAAA records</p>
</div>
</div>
<div className="flex items-center">
<span className="inline-block w-2 h-2 bg-destructive rounded-full mr-2"></span>
<span className="text-sm font-medium">Error</span>
</div>
</div>
<div className="flex items-center justify-between">
<div className="flex items-center">
<Home className="mr-3 h-5 w-5 text-primary" />
<div>
<p className="font-medium">prod-db.example.net</p>
<p className="text-sm text-muted-foreground">A record</p>
</div>
</div>
<div className="flex items-center">
<span className="inline-block w-2 h-2 bg-success rounded-full mr-2"></span>
<span className="text-sm font-medium">Healthy</span>
</div>
</div>
</div>
</CardContent>
</Card>
</MainLayout>
);
}