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
{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
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 ? '#ff9800' : '#666' }}> {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 {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.