import React, { useState, useEffect } from 'react'; import axios from 'axios'; import './App.css'; function SLA() { const [slaData, setSlaData] = useState([]); const [days, setDays] = 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); useEffect(() => { loadSLAData(); }, [days, currentPage, pageSize]); const loadSLAData = 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); setLoading(false); } catch (error) { console.error('Error loading SLA data:', error); setError(error.message); setLoading(false); } }; const acknowledgeIncident = async (incidentId) => { try { await axios.post(`/api/incidents/${incidentId}/acknowledge`, { acknowledged_by: 'User' }); alert('Incident acknowledged'); } catch (error) { console.error('Error acknowledging incident:', error); alert('Error acknowledging incident'); } }; if (loading) return
Loading SLA data...
; if (error) return
Error loading SLA data: {error}
; const overallStats = slaData && Array.isArray(slaData) && slaData.length > 0 ? { totalResources: slaData.length, meetingTarget: slaData.filter(s => s.meets_target).length, avgUptime: (slaData.reduce((sum, s) => sum + parseFloat(s.actual_uptime), 0) / slaData.length).toFixed(2), totalIncidents: slaData.reduce((sum, s) => sum + s.incidents, 0), totalDowntime: slaData.reduce((sum, s) => sum + s.downtime_minutes, 0), } : null; return (

SLA Dashboard

{[7, 14, 30, 90].map((d) => ( ))}
{overallStats && (

{overallStats.totalResources}

Total Resources

{overallStats.meetingTarget}/{overallStats.totalResources}

Meeting SLA Target

{overallStats.avgUptime}%

Average Uptime

{overallStats.totalIncidents}

Total Incidents

{Math.round(overallStats.totalDowntime)}m

Total Downtime

)} {slaData.length === 0 ? (

No SLA data available

Add resources to start tracking SLA metrics

) : (
{slaData.map((item, idx) => ( ))}
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 ? '#ff9800' : '#666' }}> {item.incidents} {item.downtime_minutes > 0 ? `${item.downtime_minutes}m` : '-'}
{totalItems > pageSize && (
Page { const page = Math.max(1, Math.min(Math.ceil(totalItems / pageSize), parseInt(e.target.value) || 1)); setCurrentPage(page); }} style={{ width: '50px', padding: '0.5rem', border: '1px solid #ddd', borderRadius: '4px', textAlign: 'center' }} /> of {Math.ceil(totalItems / pageSize)}
)}
)}

SLA Report Summary

This report shows the Service Level Agreement (SLA) performance for all monitored resources over the last {days} 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.

); } export default SLA;