import React, { useState, useEffect } from 'react'; import axios from 'axios'; import './App.css'; import './CommandCenterPages.css'; function SLA() { const [slaData, setSlaData] = useState([]); const [days, setDays] = useState(30); const [maxDays, setMaxDays] = useState(30); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [totalItems, setTotalItems] = useState(0); const [effectiveDays, setEffectiveDays] = useState(30); const [limitedByRetention, setLimitedByRetention] = useState(false); useEffect(() => { // Fetch retention setting from server const fetchRetention = async () => { try { const response = await axios.get('/api/settings'); const retentionDays = response.data.retention_days || 30; setMaxDays(parseInt(retentionDays)); // Adjust current days if it exceeds retention if (days > retentionDays) { setDays(parseInt(retentionDays)); } } catch (error) { // Failed to fetch retention setting, use default } }; fetchRetention(); }, []); // eslint-disable-next-line react-hooks/exhaustive-deps const loadSLAData = React.useCallback(async () => { setLoading(true); setError(null); try { const response = await axios.get('/api/sla', { params: { days, page: currentPage, limit: pageSize } }); const data = Array.isArray(response.data.resources) ? response.data.resources : []; setSlaData(data); setTotalItems(response.data.total || data.length); setEffectiveDays(response.data.effective_days || days); setLimitedByRetention(Boolean(response.data.limited_by_retention)); setLoading(false); } catch (error) { setError(error.message); setLoading(false); } }, [days, currentPage, pageSize]); useEffect(() => { loadSLAData(); }, [loadSLAData]); if (loading) return
Total Resources
{overallStats.totalResources}
Meeting SLA Target
{overallStats.meetingTarget}/{overallStats.totalResources}
Average Uptime
{overallStats.avgUptime}%
Total Incidents
{overallStats.totalIncidents}
Total Downtime
{Math.round(overallStats.totalDowntime)}m
Add resources to start tracking SLA metrics
| Resource | Target | Actual | Status | Checks | Incidents | Downtime |
|---|---|---|---|---|---|---|
| {item.resource_name} | {item.sla_target}% | {item.actual_uptime}% | {item.meets_target ? '✓ PASS' : '✗ FAIL'} | {item.successful_checks}/{item.total_checks} | 0 ? '#f59e0b' : '#94a3b8' }}> {item.incidents} | {item.downtime_minutes > 0 ? `${item.downtime_minutes}m` : '-'} |
This report shows the Service Level Agreement (SLA) performance for all monitored resources over the last {effectiveDays} days. Resources meeting their target uptime are marked as PASS, while those below target are marked as FAIL.
Overall performance: {overallStats?.meetingTarget || 0} out of {overallStats?.totalResources || 0} resources ({overallStats ? Math.round((overallStats.meetingTarget / overallStats.totalResources) * 100) : 0}%) are meeting their SLA targets.