️ Code Improvements

This commit is contained in:
Andreas Dinauer 2025-12-28 20:51:52 +01:00
parent a6b31b8ca5
commit 2a09bdddd2
15 changed files with 86 additions and 91 deletions

View File

@ -1,17 +1,16 @@
package dev.dinauer; package dev.dinauer;
import dev.dinauer.service.DeploymentService; import java.util.List;
import dev.dinauer.service.NodeService;
import dev.dinauer.service.PodService;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.quarkus.security.Authenticated;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.*; import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import java.util.List; import io.fabric8.kubernetes.api.model.Pod;
import io.quarkus.security.Authenticated;
import dev.dinauer.service.DeploymentService;
import dev.dinauer.service.PodService;
@Path("/resources/deployments") @Path("/resources/deployments")
@Authenticated @Authenticated

View File

@ -2,12 +2,12 @@ package dev.dinauer;
import java.util.List; import java.util.List;
import dev.dinauer.inspect.websocket.ResourceType;
import jakarta.annotation.security.RolesAllowed; import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.*; import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import dev.dinauer.inspect.websocket.ResourceType;
import dev.dinauer.service.*; import dev.dinauer.service.*;
@Path("/resources/nodes") @Path("/resources/nodes")

View File

@ -2,19 +2,17 @@ package dev.dinauer;
import java.util.List; import java.util.List;
import dev.dinauer.inspect.env.EnvVar;
import dev.dinauer.inspect.env.EnvironmentVariableService;
import dev.dinauer.utils.ProcessRunner;
import io.fabric8.kubernetes.api.model.Pod;
import io.quarkus.security.Authenticated;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.*; import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import io.quarkus.runtime.Startup; import io.quarkus.runtime.Startup;
import io.quarkus.security.Authenticated;
import io.smallrye.common.annotation.Blocking; import io.smallrye.common.annotation.Blocking;
import dev.dinauer.inspect.env.EnvVar;
import dev.dinauer.inspect.env.EnvironmentVariableService;
import dev.dinauer.service.PodService; import dev.dinauer.service.PodService;
@Path("/pods") @Path("/pods")

View File

@ -1,13 +1,15 @@
package dev.dinauer.inspect.env; package dev.dinauer.inspect.env;
import dev.dinauer.utils.ProcessRunner;
import io.fabric8.kubernetes.api.model.Pod;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import io.fabric8.kubernetes.api.model.Pod;
import dev.dinauer.utils.ProcessRunner;
@ApplicationScoped @ApplicationScoped
public class EnvironmentVariableService public class EnvironmentVariableService
{ {

View File

@ -1,13 +1,10 @@
package dev.dinauer.inspect.log; package dev.dinauer.inspect.log;
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException;
import com.fasterxml.jackson.databind.SerializationFeature; import java.time.LocalDateTime;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.time.format.DateTimeFormatter;
import dev.dinauer.service.PodService; import java.util.*;
import dev.dinauer.utils.ClientProvider;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.client.dsl.LogWatch;
import io.fabric8.kubernetes.client.dsl.PodResource;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.websocket.OnClose; import jakarta.websocket.OnClose;
@ -15,26 +12,29 @@ import jakarta.websocket.OnOpen;
import jakarta.websocket.Session; import jakarta.websocket.Session;
import jakarta.websocket.server.PathParam; import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint; import jakarta.websocket.server.ServerEndpoint;
import org.eclipse.microprofile.context.ManagedExecutor;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import java.io.BufferedReader; import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException; import com.fasterxml.jackson.databind.SerializationFeature;
import java.io.InputStreamReader; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import io.fabric8.kubernetes.api.model.Pod;
import java.util.ArrayList; import io.fabric8.kubernetes.client.dsl.LogWatch;
import java.util.HashMap; import io.fabric8.kubernetes.client.dsl.PodResource;
import java.util.List; import io.smallrye.mutiny.Uni;
import java.util.Map; import io.smallrye.mutiny.infrastructure.Infrastructure;
import java.util.concurrent.CompletableFuture;
import dev.dinauer.inspect.log.model.KubernetesLog;
import dev.dinauer.service.PodService;
import dev.dinauer.utils.ClientProvider;
@ServerEndpoint("/logs/deployments/{namespace}/{name}") @ServerEndpoint("/logs/deployments/{namespace}/{name}")
@ApplicationScoped @ApplicationScoped
public class DeploymentLogWebsocket public class DeploymentLogWebsocket
{ {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
private final Map<Session, LogWatch> sessions = new HashMap<>(); private final Map<Session, List<LogWatch>> sessions = new HashMap<>();
@Inject @Inject
Logger LOG; Logger LOG;
@ -42,16 +42,13 @@ public class DeploymentLogWebsocket
@Inject @Inject
ClientProvider clientProvider; ClientProvider clientProvider;
@Inject
ManagedExecutor executor;
@Inject @Inject
PodService podService; PodService podService;
@OnOpen @OnOpen
public void onOpen(Session session, @PathParam("namespace") String namespace, @PathParam("name") String name) public void onOpen(Session session, @PathParam("namespace") String namespace, @PathParam("name") String name)
{ {
executor.submit(() -> { Uni.createFrom().voidItem().invoke(() -> {
List<Pod> pods = podService.findByDeployment(namespace, name); List<Pod> pods = podService.findByDeployment(namespace, name);
List<KubernetesLog> existingLogs = new ArrayList<>(); List<KubernetesLog> existingLogs = new ArrayList<>();
for (Pod pod : pods) for (Pod pod : pods)
@ -61,37 +58,27 @@ public class DeploymentLogWebsocket
} }
send(session, existingLogs.stream().sorted(KubernetesLog::orderByTimestamp).toList()); send(session, existingLogs.stream().sorted(KubernetesLog::orderByTimestamp).toList());
sessions.put(session, new LinkedList<>());
for (Pod pod : pods) for (Pod pod : pods)
{ {
CompletableFuture.runAsync(() -> { PodResource resource = clientProvider.getClient().pods().inNamespace(pod.getMetadata().getNamespace()).withName(pod.getMetadata().getName());
LogWatch watch = clientProvider.getClient().pods().inNamespace(pod.getMetadata().getNamespace()).withName(pod.getMetadata().getName()).usingTimestamps().tailingLines(0).watchLog(); sessions.get(session).add(podService.watchLogs(resource, (log) -> {
sessions.put(session, watch); send(session, log);
}));
try (BufferedReader reader = new BufferedReader(new InputStreamReader(watch.getOutput())))
{
String line;
while ((line = reader.readLine()) != null && !Thread.currentThread().isInterrupted())
{
send(session, toLog(List.of(line), pod.getMetadata().getName()));
}
LOG.info("Ended");
}
catch (Exception e)
{
LOG.errorf("Error reading output of log watch: %s", e.getMessage());
}
});
} }
}); }).runSubscriptionOn(Infrastructure.getDefaultWorkerPool()).subscribe().with(result -> {}, error -> {});
} }
@OnClose @OnClose
public void onClose(Session session) throws IOException public void onClose(Session session) throws IOException
{ {
LogWatch watch = sessions.remove(session); List<LogWatch> watches = sessions.remove(session);
if (watch != null) if (watches != null)
{ {
watch.close(); for (LogWatch watch : watches)
{
watch.close();
}
} }
session.close(); session.close();
} }

View File

@ -1,17 +1,10 @@
package dev.dinauer.inspect.log; package dev.dinauer.inspect.log;
import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import dev.dinauer.inspect.utils.InputStreamWatcher;
import dev.dinauer.service.PodService;
import io.fabric8.kubernetes.client.dsl.PodResource;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.infrastructure.Infrastructure;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.websocket.OnClose; import jakarta.websocket.OnClose;
@ -27,7 +20,12 @@ import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import io.fabric8.kubernetes.client.dsl.LogWatch; import io.fabric8.kubernetes.client.dsl.LogWatch;
import io.fabric8.kubernetes.client.dsl.PodResource;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.infrastructure.Infrastructure;
import dev.dinauer.inspect.log.model.KubernetesLog;
import dev.dinauer.service.PodService;
import dev.dinauer.utils.ClientProvider; import dev.dinauer.utils.ClientProvider;
@ServerEndpoint("/logs/pods/{namespace}/{name}") @ServerEndpoint("/logs/pods/{namespace}/{name}")

View File

@ -1,4 +1,4 @@
package dev.dinauer.inspect.log; package dev.dinauer.inspect.log.model;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;

View File

@ -1,12 +1,12 @@
package dev.dinauer.inspect.utils; package dev.dinauer.inspect.utils;
import org.jboss.logging.Logger;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.jboss.logging.Logger;
public class InputStreamWatcher public class InputStreamWatcher
{ {
private static final Logger LOG = Logger.getLogger(InputStreamWatcher.class); private static final Logger LOG = Logger.getLogger(InputStreamWatcher.class);

View File

@ -48,6 +48,10 @@ public class MonitoringJobRunner
@PostConstruct @PostConstruct
public void run() public void run()
{ {
if (true)
{
return;
}
List<MonitoringConfig> configs = monitoringRepo.listAll(); List<MonitoringConfig> configs = monitoringRepo.listAll();
for (MonitoringConfig config : configs) for (MonitoringConfig config : configs)
{ {

View File

@ -8,13 +8,13 @@ import jakarta.inject.Inject;
import io.fabric8.kubernetes.api.model.Node; import io.fabric8.kubernetes.api.model.Node;
import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.Pod;
import dev.dinauer.utils.ProcessRunner;
import dev.dinauer.monitoring.nodes.MonitoredNode; import dev.dinauer.monitoring.nodes.MonitoredNode;
import dev.dinauer.monitoring.nodes.NodeMetrics; import dev.dinauer.monitoring.nodes.NodeMetrics;
import dev.dinauer.monitoring.nodes.client.NodeDiskMetrics; import dev.dinauer.monitoring.nodes.client.NodeDiskMetrics;
import dev.dinauer.monitoring.nodes.client.NodeDiskService; import dev.dinauer.monitoring.nodes.client.NodeDiskService;
import dev.dinauer.service.PodService; import dev.dinauer.service.PodService;
import dev.dinauer.utils.ClientProvider; import dev.dinauer.utils.ClientProvider;
import dev.dinauer.utils.ProcessRunner;
@ApplicationScoped @ApplicationScoped
public class TopNodesService public class TopNodesService

View File

@ -9,11 +9,11 @@ import jakarta.inject.Inject;
import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.Pod;
import dev.dinauer.utils.ProcessRunner;
import dev.dinauer.monitoring.MonitoringService; import dev.dinauer.monitoring.MonitoringService;
import dev.dinauer.monitoring.entity.MonitoringConfig; import dev.dinauer.monitoring.entity.MonitoringConfig;
import dev.dinauer.monitoring.entity.MonitoringType; import dev.dinauer.monitoring.entity.MonitoringType;
import dev.dinauer.monitoring.indexing.BigBucketService; import dev.dinauer.monitoring.indexing.BigBucketService;
import dev.dinauer.utils.ProcessRunner;
@ApplicationScoped @ApplicationScoped
public class MemoryMonitoringJobRunner public class MemoryMonitoringJobRunner

View File

@ -15,11 +15,11 @@ import org.jboss.logging.Logger;
import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.Pod;
import dev.dinauer.utils.ProcessRunner;
import dev.dinauer.monitoring.MonitoringService; import dev.dinauer.monitoring.MonitoringService;
import dev.dinauer.monitoring.entity.MonitoringConfig; import dev.dinauer.monitoring.entity.MonitoringConfig;
import dev.dinauer.monitoring.entity.MonitoringType; import dev.dinauer.monitoring.entity.MonitoringType;
import dev.dinauer.monitoring.indexing.BigBucketService; import dev.dinauer.monitoring.indexing.BigBucketService;
import dev.dinauer.utils.ProcessRunner;
@ApplicationScoped @ApplicationScoped
public class VolumeMonitoringJobRunner public class VolumeMonitoringJobRunner

View File

@ -1,7 +1,6 @@
package dev.dinauer.monitoring.volume; package dev.dinauer.monitoring.volume;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;

View File

@ -1,16 +1,17 @@
package dev.dinauer.service; package dev.dinauer.service;
import dev.dinauer.inspect.log.KubernetesLog;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.jboss.logging.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.jboss.logging.Logger;
import dev.dinauer.inspect.log.model.KubernetesLog;
@ApplicationScoped @ApplicationScoped
public class LogParser public class LogParser
{ {

View File

@ -6,20 +6,21 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import dev.dinauer.inspect.log.KubernetesLog;
import dev.dinauer.inspect.utils.InputStreamWatcher;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.client.dsl.LogWatch;
import io.fabric8.kubernetes.client.dsl.PodResource;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.api.model.apps.StatefulSet; import io.fabric8.kubernetes.api.model.apps.StatefulSet;
import io.fabric8.kubernetes.client.Watch; import io.fabric8.kubernetes.client.Watch;
import io.fabric8.kubernetes.client.Watcher; import io.fabric8.kubernetes.client.Watcher;
import io.fabric8.kubernetes.client.dsl.AppsAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.AppsAPIGroupDSL;
import io.fabric8.kubernetes.client.dsl.LogWatch;
import io.fabric8.kubernetes.client.dsl.PodResource;
import io.smallrye.mutiny.Uni;
import dev.dinauer.inspect.log.model.KubernetesLog;
import dev.dinauer.inspect.utils.InputStreamWatcher;
import dev.dinauer.utils.ClientProvider; import dev.dinauer.utils.ClientProvider;
@ApplicationScoped @ApplicationScoped
@ -139,7 +140,13 @@ public class PodService implements ResourceService<Pod>
public LogWatch watchLogs(PodResource resource, Consumer<List<KubernetesLog>> consume) public LogWatch watchLogs(PodResource resource, Consumer<List<KubernetesLog>> consume)
{ {
LogWatch watch = resource.usingTimestamps().tailingLines(0).watchLog(); LogWatch watch = resource.usingTimestamps().tailingLines(0).watchLog();
InputStreamWatcher.watch(watch.getOutput(), line -> consume.accept(logParser.toLog(line, resource.get().getMetadata().getName()))); Uni.createFrom()
.voidItem()
.invoke(() -> {
InputStreamWatcher.watch(watch.getOutput(), line -> consume.accept(logParser.toLog(line, resource.get().getMetadata().getName())));
})
.subscribe()
.with(result -> {}, error -> {});
return watch; return watch;
} }
} }