️ 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;
import dev.dinauer.service.DeploymentService;
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 java.util.List;
import jakarta.inject.Inject;
import jakarta.ws.rs.*;
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")
@Authenticated

View File

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

View File

@ -2,19 +2,17 @@ package dev.dinauer;
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.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import io.quarkus.runtime.Startup;
import io.quarkus.security.Authenticated;
import io.smallrye.common.annotation.Blocking;
import dev.dinauer.inspect.env.EnvVar;
import dev.dinauer.inspect.env.EnvironmentVariableService;
import dev.dinauer.service.PodService;
@Path("/pods")

View File

@ -1,13 +1,15 @@
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.List;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import io.fabric8.kubernetes.api.model.Pod;
import dev.dinauer.utils.ProcessRunner;
@ApplicationScoped
public class EnvironmentVariableService
{

View File

@ -1,13 +1,10 @@
package dev.dinauer.inspect.log;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import dev.dinauer.service.PodService;
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 java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.websocket.OnClose;
@ -15,26 +12,29 @@ import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.eclipse.microprofile.context.ManagedExecutor;
import org.jboss.logging.Logger;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import io.fabric8.kubernetes.api.model.Pod;
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;
@ServerEndpoint("/logs/deployments/{namespace}/{name}")
@ApplicationScoped
public class DeploymentLogWebsocket
{
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
Logger LOG;
@ -42,16 +42,13 @@ public class DeploymentLogWebsocket
@Inject
ClientProvider clientProvider;
@Inject
ManagedExecutor executor;
@Inject
PodService podService;
@OnOpen
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<KubernetesLog> existingLogs = new ArrayList<>();
for (Pod pod : pods)
@ -61,37 +58,27 @@ public class DeploymentLogWebsocket
}
send(session, existingLogs.stream().sorted(KubernetesLog::orderByTimestamp).toList());
sessions.put(session, new LinkedList<>());
for (Pod pod : pods)
{
CompletableFuture.runAsync(() -> {
LogWatch watch = clientProvider.getClient().pods().inNamespace(pod.getMetadata().getNamespace()).withName(pod.getMetadata().getName()).usingTimestamps().tailingLines(0).watchLog();
sessions.put(session, watch);
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());
}
});
PodResource resource = clientProvider.getClient().pods().inNamespace(pod.getMetadata().getNamespace()).withName(pod.getMetadata().getName());
sessions.get(session).add(podService.watchLogs(resource, (log) -> {
send(session, log);
}));
}
});
}).runSubscriptionOn(Infrastructure.getDefaultWorkerPool()).subscribe().with(result -> {}, error -> {});
}
@OnClose
public void onClose(Session session) throws IOException
{
LogWatch watch = sessions.remove(session);
if (watch != null)
List<LogWatch> watches = sessions.remove(session);
if (watches != null)
{
watch.close();
for (LogWatch watch : watches)
{
watch.close();
}
}
session.close();
}

View File

@ -1,17 +1,10 @@
package dev.dinauer.inspect.log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
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.inject.Inject;
import jakarta.websocket.OnClose;
@ -27,7 +20,12 @@ import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
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;
@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.ZoneOffset;

View File

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

View File

@ -48,6 +48,10 @@ public class MonitoringJobRunner
@PostConstruct
public void run()
{
if (true)
{
return;
}
List<MonitoringConfig> configs = monitoringRepo.listAll();
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.Pod;
import dev.dinauer.utils.ProcessRunner;
import dev.dinauer.monitoring.nodes.MonitoredNode;
import dev.dinauer.monitoring.nodes.NodeMetrics;
import dev.dinauer.monitoring.nodes.client.NodeDiskMetrics;
import dev.dinauer.monitoring.nodes.client.NodeDiskService;
import dev.dinauer.service.PodService;
import dev.dinauer.utils.ClientProvider;
import dev.dinauer.utils.ProcessRunner;
@ApplicationScoped
public class TopNodesService

View File

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

View File

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

View File

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

View File

@ -1,16 +1,17 @@
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.format.DateTimeFormatter;
import java.util.ArrayList;
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
public class LogParser
{

View File

@ -6,20 +6,21 @@ import java.util.Map;
import java.util.Optional;
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.inject.Inject;
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.client.Watch;
import io.fabric8.kubernetes.client.Watcher;
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;
@ApplicationScoped
@ -139,7 +140,13 @@ public class PodService implements ResourceService<Pod>
public LogWatch watchLogs(PodResource resource, Consumer<List<KubernetesLog>> consume)
{
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;
}
}