You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/07/14 20:27:07 UTC

[camel-karavan] 01/02: logs #817

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 <ma...@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;
+    }
+}