From ada07a100ad46fff7fb23213208ab6a660a7f7af Mon Sep 17 00:00:00 2001 From: DevJuanCR Date: Wed, 26 Aug 2026 16:42:48 +0000 Subject: [PATCH] alertas por umbral de cpu y ram configurable --- .../monitor/controller/AlertController.java | 27 ++++++++++++ .../com/sysadmin/monitor/dto/AlertDTO.java | 18 ++++++++ .../monitor/service/MetricService.java | 44 +++++++++++++++++++ .../src/main/resources/application.properties | 6 ++- 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/sysadmin/monitor/controller/AlertController.java create mode 100644 backend/src/main/java/com/sysadmin/monitor/dto/AlertDTO.java diff --git a/backend/src/main/java/com/sysadmin/monitor/controller/AlertController.java b/backend/src/main/java/com/sysadmin/monitor/controller/AlertController.java new file mode 100644 index 0000000..8e04d93 --- /dev/null +++ b/backend/src/main/java/com/sysadmin/monitor/controller/AlertController.java @@ -0,0 +1,27 @@ +package com.sysadmin.monitor.controller; + +import com.sysadmin.monitor.dto.AlertDTO; +import com.sysadmin.monitor.service.MetricService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/alerts") +@CrossOrigin("*") +@RequiredArgsConstructor +public class AlertController { + + private final MetricService metricService; + + @GetMapping + public ResponseEntity> getAlerts() { + List alerts = metricService.getAlerts(); + return ResponseEntity.ok(alerts); + } +} diff --git a/backend/src/main/java/com/sysadmin/monitor/dto/AlertDTO.java b/backend/src/main/java/com/sysadmin/monitor/dto/AlertDTO.java new file mode 100644 index 0000000..28ac66c --- /dev/null +++ b/backend/src/main/java/com/sysadmin/monitor/dto/AlertDTO.java @@ -0,0 +1,18 @@ +package com.sysadmin.monitor.dto; + +import lombok.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AlertDTO { + + private String hostname; + + private String metric; + + private Double value; + + private Double threshold; +} diff --git a/backend/src/main/java/com/sysadmin/monitor/service/MetricService.java b/backend/src/main/java/com/sysadmin/monitor/service/MetricService.java index f17a81c..be38bf1 100644 --- a/backend/src/main/java/com/sysadmin/monitor/service/MetricService.java +++ b/backend/src/main/java/com/sysadmin/monitor/service/MetricService.java @@ -1,16 +1,19 @@ package com.sysadmin.monitor.service; +import com.sysadmin.monitor.dto.AlertDTO; import com.sysadmin.monitor.dto.MetricSummaryDTO; import com.sysadmin.monitor.dto.SystemMetricDTO; import com.sysadmin.monitor.entity.SystemMetric; import com.sysadmin.monitor.repository.SystemMetricRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; @Service @@ -22,6 +25,12 @@ public class MetricService { private final SystemMetricRepository metricRepository; + @Value("${monitor.alerts.cpu:85}") + private double cpuThreshold; + + @Value("${monitor.alerts.ram:90}") + private double ramThreshold; + public SystemMetric saveMetric(SystemMetricDTO dto) { SystemMetric metric = SystemMetric.builder() @@ -75,6 +84,41 @@ public List getSummary() { return metricRepository.findSummaryByHost(); } + public List getAlerts() { + List alerts = new ArrayList<>(); + Pageable pageable = PageRequest.of(0, 1); + + for (String hostname : metricRepository.findDistinctHostnames()) { + List metrics = metricRepository.findByHostnameOrderByTimestampDesc(hostname, pageable); + + if (metrics.isEmpty()) { + continue; + } + + SystemMetric metric = metrics.get(0); + + if (metric.getCpuUsage() != null && metric.getCpuUsage() > cpuThreshold) { + alerts.add(AlertDTO.builder() + .hostname(hostname) + .metric("cpu") + .value(metric.getCpuUsage()) + .threshold(cpuThreshold) + .build()); + } + + if (metric.getRamUsage() != null && metric.getRamUsage() > ramThreshold) { + alerts.add(AlertDTO.builder() + .hostname(hostname) + .metric("ram") + .value(metric.getRamUsage()) + .threshold(ramThreshold) + .build()); + } + } + + return alerts; + } + public List getHostnames() { return metricRepository.findDistinctHostnames(); } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 83babae..2ce99ff 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -5,4 +5,8 @@ server.port=8080 spring.profiles.active=dev spring.jpa.show-sql=true -spring.jpa.properties.hibernate.format_sql=true \ No newline at end of file +spring.jpa.properties.hibernate.format_sql=true + +# umbrales de alerta en porcentaje +monitor.alerts.cpu=85 +monitor.alerts.ram=90