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;
+ }
+}