This is an automated email from the ASF dual-hosted git repository. marat pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
commit 46dcfff8bbb3ce893677f1f786907a03d5883c37 Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Fri Jul 14 10:47:40 2023 -0400 logs #817 --- .../karavan/listener/DevModeStatusListener.java | 2 +- .../camel/karavan/bashi/ConductorService.java | 12 ++-- .../apache/camel/karavan/bashi/LoggerService.java | 42 ++++++++++++ .../karavan/bashi/docker/DockerEventListener.java | 8 ++- .../camel/karavan/bashi/docker/DockerService.java | 79 ++++++++++++---------- .../camel/karavan/bashi/docker/LogCallback.java | 18 ++--- .../karavan/datagrid/model/DevModeStatus.java | 21 +++++- .../camel/karavan/datagrid/model/LogLine.java | 17 +++++ 8 files changed, 140 insertions(+), 59 deletions(-) diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeStatusListener.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeStatusListener.java index 15d63519..d8930a39 100644 --- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeStatusListener.java +++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeStatusListener.java @@ -22,7 +22,7 @@ public class DevModeStatusListener { void receiveCommand(JsonObject message) { LOGGER.info("received Status " + message); DevModeStatus status = message.mapTo(DevModeStatus.class); - if (!status.isCodeLoaded() && status.getContainerId() != null) { + if (!status.getCodeLoaded() && status.getContainerId() != null) { camelService.reloadProjectCode(status.getProjectId()); } } diff --git a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java index c9998219..6ca21110 100644 --- a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java +++ b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java @@ -55,6 +55,9 @@ public class ConductorService { @Inject DatagridService datagridService; + @Inject + LoggerService loggerService; + private static final Logger LOGGER = Logger.getLogger(ConductorService.class.getName()); public static final String ADDRESS_INFINISPAN_START = "ADDRESS_INFINISPAN_START"; @@ -80,6 +83,7 @@ public class ConductorService { void startServices(String infinispanHealth){ if (infinispanHealth.equals("healthy")) { datagridService.start(); + datagridService.clearAllStatuses(); } } @@ -121,6 +125,7 @@ public class ConductorService { void receiveCommand(JsonObject message) throws InterruptedException { LOGGER.info("DevMode Command: " + message); DevModeCommand command = message.mapTo(DevModeCommand.class); + datagridService.deleteDevModeCommand(command); switch (command.getCommandName()){ case RUN: runContainer(command); @@ -129,10 +134,9 @@ public class ConductorService { deleteContainer(command); break; case LOG: - logContainer(command); + loggerService.logContainer(command); break; } - datagridService.deleteDevModeCommand(command); } void runContainer(DevModeCommand command) throws InterruptedException { @@ -161,8 +165,4 @@ public class ConductorService { dockerService.deleteContainer(command.getContainerName()); } } - - void logContainer(DevModeCommand command) { - dockerService.logContainer(command.getContainerName()); - } } \ No newline at end of file diff --git a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/LoggerService.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/LoggerService.java new file mode 100644 index 00000000..40fb7a38 --- /dev/null +++ b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/LoggerService.java @@ -0,0 +1,42 @@ +package org.apache.camel.karavan.bashi; + +import org.apache.camel.karavan.bashi.docker.DockerService; +import org.apache.camel.karavan.bashi.docker.LogCallback; +import org.apache.camel.karavan.datagrid.DatagridService; +import org.apache.camel.karavan.datagrid.model.DevModeCommand; +import org.jboss.logging.Logger; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@ApplicationScoped +public class LoggerService { + + private static final Logger LOGGER = Logger.getLogger(LoggerService.class.getName()); + + @Inject + DockerService dockerService; + + @Inject + DatagridService datagridService; + + private final Map<String, LogCallback> loggers = new ConcurrentHashMap<>(); + + void logContainer(DevModeCommand command) { + try { + String containerName = command.getContainerName(); + LogCallback callback = loggers.get(containerName); + if (callback != null) { + callback.close(); + loggers.remove(containerName); + } else { + callback = dockerService.logContainer(containerName); + loggers.put(containerName, callback); + } + } catch (Exception e) { + LOGGER.error(e.getMessage()); + } + } +} \ No newline at end of file diff --git a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java index 9b57dc72..d8961b75 100644 --- a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java +++ b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java @@ -105,9 +105,11 @@ public class DockerEventListener implements ResultCallback<Event> { //update DevModeStatus String containerName = container.getNames()[0].replace("/", ""); DevModeStatus dms = datagridService.getDevModeStatus(container.getLabels().get("projectId")); - dms.setContainerName(containerName); - dms.setContainerId(container.getId()); - datagridService.saveDevModeStatus(dms); + if (dms != null) { + dms.setContainerName(containerName); + dms.setContainerId(container.getId()); + datagridService.saveDevModeStatus(dms); + } } } } catch (Exception exception) { diff --git a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java index b14394a0..a49f8ebf 100644 --- a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java +++ b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java @@ -68,35 +68,43 @@ public class DockerService { } private String formatMemory(Long memory) { - if (memory < (1073741824)) { - return formatMiB.format(memory.doubleValue() / 1048576) + "MiB"; - } else { - return formatGiB.format(memory.doubleValue() / 1073741824) + "GiB"; + try { + if (memory < (1073741824)) { + return formatMiB.format(memory.doubleValue() / 1048576) + "MiB"; + } else { + return formatGiB.format(memory.doubleValue() / 1073741824) + "GiB"; + } + } catch (Exception e) { + return ""; } } private String formatCpu(String containerName, Statistics stats) { - double cpuUsage = 0; - long previousCpu = previousStats.containsKey(containerName) ? previousStats.get(containerName).getItem1() : -1; - long previousSystem = previousStats.containsKey(containerName) ? previousStats.get(containerName).getItem2() : -1; - - CpuStatsConfig cpuStats = stats.getCpuStats(); - if (cpuStats != null) { - CpuUsageConfig cpuUsageConfig = cpuStats.getCpuUsage(); - long systemUsage = cpuStats.getSystemCpuUsage(); - long totalUsage = cpuUsageConfig.getTotalUsage(); - - if (previousCpu != -1 && previousSystem != -1) { - float cpuDelta = totalUsage - previousCpu; - float systemDelta = systemUsage - previousSystem; - - if (cpuDelta > 0 && systemDelta > 0) { - cpuUsage = cpuDelta / systemDelta * cpuStats.getOnlineCpus() * 100; + try { + double cpuUsage = 0; + long previousCpu = previousStats.containsKey(containerName) ? previousStats.get(containerName).getItem1() : -1; + long previousSystem = previousStats.containsKey(containerName) ? previousStats.get(containerName).getItem2() : -1; + + CpuStatsConfig cpuStats = stats.getCpuStats(); + if (cpuStats != null) { + CpuUsageConfig cpuUsageConfig = cpuStats.getCpuUsage(); + long systemUsage = cpuStats.getSystemCpuUsage(); + long totalUsage = cpuUsageConfig.getTotalUsage(); + + if (previousCpu != -1 && previousSystem != -1) { + float cpuDelta = totalUsage - previousCpu; + float systemDelta = systemUsage - previousSystem; + + if (cpuDelta > 0 && systemDelta > 0) { + cpuUsage = cpuDelta / systemDelta * cpuStats.getOnlineCpus() * 100; + } } + previousStats.put(containerName, Tuple2.of(totalUsage, systemUsage)); } - previousStats.put(containerName, Tuple2.of(totalUsage, systemUsage)); + return formatCpu.format(cpuUsage) + "%"; + } catch (Exception e) { + return ""; } - return formatCpu.format(cpuUsage) + "%"; } public void startListeners() { @@ -153,7 +161,7 @@ public class DockerService { } public Container createContainer(String name, String image, List<String> env, String ports, - boolean exposedPort, HealthCheck healthCheck, Map<String, String> labels) throws InterruptedException { + boolean exposedPort, HealthCheck healthCheck, Map<String, String> labels) throws InterruptedException { List<Container> containers = getDockerClient().listContainersCmd().withShowAll(true).withNameFilter(List.of(name)).exec(); if (containers.size() == 0) { pullImage(image); @@ -193,18 +201,25 @@ public class DockerService { startContainer(name); } - public void logContainer(String containerName) { + public LogCallback logContainer(String containerName) { try { Container container = getContainerByName(containerName); if (container != null) { - LogCallback callback = new LogCallback(); + LogCallback callback = new LogCallback(eventBus); getDockerClient().logContainerCmd(container.getId()) - .withStdOut(true).withStdErr(true).withTimestamps(true).exec(callback); + .withStdOut(true) + .withStdErr(true) + .withTimestamps(true) + .withFollowStream(true) + .withTailAll() + .exec(callback); callback.awaitCompletion(); + return callback; } - } catch (InterruptedException e) { - throw new RuntimeException(e); + } catch (Exception e) { + LOGGER.error(e.getMessage()); } + return null; } public void stopContainer(String name) { @@ -225,14 +240,6 @@ public class DockerService { } } - public void killContainer(String name) { - List<Container> containers = getDockerClient().listContainersCmd().withShowAll(true).withNameFilter(List.of(name)).exec(); - if (containers.size() == 1) { - Container container = containers.get(0); - getDockerClient().killContainerCmd(container.getId()).exec(); - } - } - public void pullImage(String image) throws InterruptedException { List<Image> images = getDockerClient().listImagesCmd().withShowAll(true).exec(); if (!images.stream().filter(i -> Arrays.asList(i.getRepoTags()).contains(image)).findFirst().isPresent()) { diff --git a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/LogCallback.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/LogCallback.java index 48c061cd..c3d4ad5a 100644 --- a/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/LogCallback.java +++ b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/LogCallback.java @@ -2,25 +2,19 @@ package org.apache.camel.karavan.bashi.docker; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Frame; - -import java.util.ArrayList; -import java.util.List; +import io.vertx.core.eventbus.EventBus; public class LogCallback extends ResultCallback.Adapter<Frame> { - protected final StringBuffer log = new StringBuffer(); - List<Frame> collectedFrames = new ArrayList<>(); + private final EventBus eventBus; - boolean collectFrames = false; + public LogCallback(EventBus eventBus) { + this.eventBus = eventBus; + } @Override public void onNext(Frame frame) { - if (collectFrames) collectedFrames.add(frame); - log.append(new String(frame.getPayload())); + System.out.println(new String(frame.getPayload())); } - @Override - public String toString() { - return log.toString(); - } } \ No newline at end of file diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java index c040c67e..cae45fbb 100644 --- a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java +++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java @@ -13,13 +13,24 @@ public class DevModeStatus { String containerId; @ProtoField(number = 4) Boolean codeLoaded; + @ProtoField(number = 5) + Boolean logging; @ProtoFactory + public DevModeStatus(String projectId, String containerName, String containerId, Boolean codeLoaded, Boolean logging) { + this.projectId = projectId; + this.containerName = containerName; + this.containerId = containerId; + this.codeLoaded = codeLoaded; + this.logging = logging; + } + public DevModeStatus(String projectId, String containerName, String containerId, Boolean codeLoaded) { this.projectId = projectId; this.containerName = containerName; this.containerId = containerId; this.codeLoaded = codeLoaded; + this.logging = false; } public String getProjectId() { @@ -46,11 +57,19 @@ public class DevModeStatus { this.containerId = containerId; } - public Boolean isCodeLoaded() { + public Boolean getCodeLoaded() { return codeLoaded; } public void setCodeLoaded(Boolean codeLoaded) { this.codeLoaded = codeLoaded; } + + public Boolean getLogging() { + return logging; + } + + public void setLogging(Boolean logging) { + this.logging = logging; + } } diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/LogLine.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/LogLine.java new file mode 100644 index 00000000..24f997c4 --- /dev/null +++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/LogLine.java @@ -0,0 +1,17 @@ +package org.apache.camel.karavan.datagrid.model; + +import org.infinispan.protostream.annotations.ProtoFactory; +import org.infinispan.protostream.annotations.ProtoField; + +public class LogLine { + + public static final String CACHE = "log-lines"; + @ProtoField(number = 1) + String line; + + @ProtoFactory + + public LogLine(String line) { + this.line = line; + } +}