diff --git a/.docker/Dockerfile b/.docker/Dockerfile
index ea9ef4754a7..b261c8ee17c 100644
--- a/.docker/Dockerfile
+++ b/.docker/Dockerfile
@@ -1,11 +1,11 @@
ARG MESH_REGISTRY_HOST=docker.gentics.com
ARG MESH_VERSION
-FROM maven:3.8-eclipse-temurin-17 AS build-env
-
ARG MVN_USERNAME
ARG MVN_PASSWORD
+FROM maven:3.8-eclipse-temurin-17 AS build-env
+
ARG MESH_CONNECTOR
ARG MESH_ARTIFACTS_REPO=maven-snapshots
diff --git a/bom/pom.xml b/bom/pom.xml
index d7e072ee72c..64bc0c80b24 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -47,11 +47,17 @@
4.5.2
2.7.3
1.15.5
+ 0.0.3-SNAPSHOT
+
+ com.gentics.vertx
+ vertx-common
+ ${vertx-common.version}
+
org.slf4j
diff --git a/changelog/src/changelog/entries/2026/03/8725.GPU-2237.enhancement b/changelog/src/changelog/entries/2026/03/8725.GPU-2237.enhancement
new file mode 100644
index 00000000000..b2b7c592b78
--- /dev/null
+++ b/changelog/src/changelog/entries/2026/03/8725.GPU-2237.enhancement
@@ -0,0 +1 @@
+Replaces liveness check with new generic liveness check library.
\ No newline at end of file
diff --git a/common/pom.xml b/common/pom.xml
index ef9dd816b8d..e13a0d25cb3 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -31,6 +31,14 @@
+
+ com.gentics
+ cmp-liveness-dagger
+
+
+ com.gentics.vertx
+ vertx-common
+
com.gentics.mesh
mesh-mdm-common
diff --git a/common/src/main/java/com/gentics/mesh/dagger/MeshComponent.java b/common/src/main/java/com/gentics/mesh/dagger/MeshComponent.java
index c88df54d434..d16214dba8c 100644
--- a/common/src/main/java/com/gentics/mesh/dagger/MeshComponent.java
+++ b/common/src/main/java/com/gentics/mesh/dagger/MeshComponent.java
@@ -12,10 +12,10 @@
import com.gentics.mesh.core.endpoint.admin.consistency.ConsistencyCheck;
import com.gentics.mesh.etc.config.MeshOptions;
import com.gentics.mesh.monitor.liveness.EventBusLivenessManager;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import com.gentics.mesh.search.SearchProvider;
import com.gentics.mesh.search.index.BucketManager;
import com.gentics.mesh.util.SearchWaitUtil;
+import com.gentics.monitoring.liveness.LivenessManager;
/**
* Central dagger mesh component which will expose dependencies.
diff --git a/common/src/main/java/com/gentics/mesh/log/RouterLoggerHandlerImpl.java b/common/src/main/java/com/gentics/mesh/log/RouterLoggerHandlerImpl.java
deleted file mode 100644
index c3c79e06356..00000000000
--- a/common/src/main/java/com/gentics/mesh/log/RouterLoggerHandlerImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.gentics.mesh.log;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.vertx.ext.web.handler.LoggerFormat;
-import io.vertx.ext.web.handler.impl.LoggerHandlerImpl;
-
-/**
- * Improved implementation of Vert.x logger handler
- */
-public class RouterLoggerHandlerImpl extends LoggerHandlerImpl {
-
- private static final Logger LOG = LoggerFactory.getLogger(RouterLoggerHandlerImpl.class);
-
- public RouterLoggerHandlerImpl(boolean immediate, LoggerFormat format) {
- super(immediate, format);
- }
-
- public RouterLoggerHandlerImpl(LoggerFormat format) {
- super(format);
- }
-
- @Override
- protected void doLog(int status, String message) {
- if (status >= 500) {
- LOG.error(message);
- } else {
- LOG.info(message);
- }
- }
-}
diff --git a/common/src/main/java/com/gentics/mesh/router/RootRouterImpl.java b/common/src/main/java/com/gentics/mesh/router/RootRouterImpl.java
index be26f0bb289..244c710222f 100644
--- a/common/src/main/java/com/gentics/mesh/router/RootRouterImpl.java
+++ b/common/src/main/java/com/gentics/mesh/router/RootRouterImpl.java
@@ -4,16 +4,15 @@
import com.gentics.mesh.annotation.Getter;
import com.gentics.mesh.etc.config.MeshOptions;
-import com.gentics.mesh.log.RouterLoggerHandlerImpl;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import com.gentics.mesh.router.route.DefaultNotFoundHandler;
import com.gentics.mesh.router.route.FailureHandler;
import com.gentics.mesh.router.route.PoweredByHandler;
import com.gentics.mesh.router.route.SecurityLoggingHandler;
+import com.gentics.monitoring.liveness.LivenessManager;
+import com.gentics.vertx.logging.CmpLoggerHandlerImpl;
import io.vertx.core.Vertx;
import io.vertx.ext.web.Router;
-import io.vertx.ext.web.handler.LoggerFormat;
/**
* @see RootRouter
@@ -35,7 +34,7 @@ public RootRouterImpl(Vertx vertx, RouterStorage storage, MeshOptions options, L
this.vertx = vertx;
this.router = Router.router(vertx);
// Root handlersA
- router.route().handler(new RouterLoggerHandlerImpl(LoggerFormat.SHORT));
+ router.route().handler(new CmpLoggerHandlerImpl());
// TODO add a dedicated error for api router that informs about
// APPLICATION_JSON requirements. This may not be true for other
// routes (eg. custom
diff --git a/common/src/main/java/com/gentics/mesh/router/RouterStorageImpl.java b/common/src/main/java/com/gentics/mesh/router/RouterStorageImpl.java
index 70639c2e93b..28bb61bde94 100644
--- a/common/src/main/java/com/gentics/mesh/router/RouterStorageImpl.java
+++ b/common/src/main/java/com/gentics/mesh/router/RouterStorageImpl.java
@@ -6,6 +6,7 @@
import javax.inject.Inject;
import javax.naming.InvalidNameException;
+import com.gentics.monitoring.liveness.LivenessManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -17,7 +18,6 @@
import com.gentics.mesh.etc.config.MeshOptions;
import com.gentics.mesh.handler.VersionHandler;
import com.gentics.mesh.handler.VersionHandlerImpl;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import dagger.Lazy;
import io.vertx.core.Vertx;
@@ -59,10 +59,10 @@ public class RouterStorageImpl implements RouterStorage {
@Inject
public RouterStorageImpl(Vertx vertx, MeshOptions options, MeshAuthChain authChain, CorsHandler corsHandler, BodyHandlerImpl bodyHandler,
- Lazy boot,
- Lazy db, VersionHandlerImpl versionHandler,
- RouterStorageRegistryImpl routerStorageRegistry,
- LivenessManager liveness, LocalConfigApi localConfigApi) {
+ Lazy boot,
+ Lazy db, VersionHandlerImpl versionHandler,
+ RouterStorageRegistryImpl routerStorageRegistry,
+ LivenessManager liveness, LocalConfigApi localConfigApi) {
this.vertx = vertx;
this.options = options;
this.boot = boot;
diff --git a/common/src/main/java/com/gentics/mesh/router/route/FailureHandler.java b/common/src/main/java/com/gentics/mesh/router/route/FailureHandler.java
index 4661073c63e..e3e8b81276e 100644
--- a/common/src/main/java/com/gentics/mesh/router/route/FailureHandler.java
+++ b/common/src/main/java/com/gentics/mesh/router/route/FailureHandler.java
@@ -8,6 +8,7 @@
import java.util.MissingResourceException;
import java.util.Optional;
+import com.gentics.monitoring.liveness.LivenessManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -22,7 +23,6 @@
import com.gentics.mesh.etc.config.HttpServerConfig;
import com.gentics.mesh.json.JsonUtil;
import com.gentics.mesh.json.MeshJsonException;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import io.vertx.core.Handler;
import io.vertx.core.VertxException;
diff --git a/core/pom.xml b/core/pom.xml
index 1accedbd39e..839c916cedc 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -36,7 +36,6 @@
-
com.gentics.mesh
@@ -61,6 +60,11 @@
mesh-graphql
+
+ com.gentics
+ cmp-liveness-dagger
+
+
io.vertx
@@ -146,6 +150,17 @@
micrometer-registry-prometheus
+
+ io.opentelemetry.instrumentation
+ opentelemetry-micrometer-1.5
+ 2.30.0-alpha
+
+
+ io.opentelemetry
+ opentelemetry-sdk-extension-autoconfigure
+ 1.64.0
+
+
io.vertx
vertx-core
diff --git a/core/src/main/java/com/gentics/mesh/cli/AbstractBootstrapInitializer.java b/core/src/main/java/com/gentics/mesh/cli/AbstractBootstrapInitializer.java
index 4b702e680d0..2945f967004 100644
--- a/core/src/main/java/com/gentics/mesh/cli/AbstractBootstrapInitializer.java
+++ b/core/src/main/java/com/gentics/mesh/cli/AbstractBootstrapInitializer.java
@@ -19,6 +19,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
+import com.gentics.monitoring.liveness.LivenessManager;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@@ -72,7 +73,6 @@
import com.gentics.mesh.etc.config.MonitoringConfig;
import com.gentics.mesh.event.EventBusStore;
import com.gentics.mesh.monitor.liveness.EventBusLivenessManager;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import com.gentics.mesh.plugin.manager.MeshPluginManager;
import com.gentics.mesh.router.RouterStorageRegistryImpl;
import com.gentics.mesh.search.IndexHandlerRegistryImpl;
diff --git a/core/src/main/java/com/gentics/mesh/core/endpoint/handler/MonitoringCrudHandler.java b/core/src/main/java/com/gentics/mesh/core/endpoint/handler/MonitoringCrudHandler.java
index be95d56564b..2f59d74b2f5 100644
--- a/core/src/main/java/com/gentics/mesh/core/endpoint/handler/MonitoringCrudHandler.java
+++ b/core/src/main/java/com/gentics/mesh/core/endpoint/handler/MonitoringCrudHandler.java
@@ -14,9 +14,9 @@
import com.gentics.mesh.core.endpoint.admin.LocalConfigApi;
import com.gentics.mesh.core.rest.admin.localconfig.LocalConfigModel;
import com.gentics.mesh.core.rest.plugin.PluginStatus;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import com.gentics.mesh.plugin.manager.MeshPluginManager;
+import com.gentics.monitoring.liveness.LivenessManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.vertx.ext.web.RoutingContext;
diff --git a/core/src/main/java/com/gentics/mesh/dagger/module/CommonBindModule.java b/core/src/main/java/com/gentics/mesh/dagger/module/CommonBindModule.java
index 5298ee46e87..3abf15fe83a 100644
--- a/core/src/main/java/com/gentics/mesh/dagger/module/CommonBindModule.java
+++ b/core/src/main/java/com/gentics/mesh/dagger/module/CommonBindModule.java
@@ -1,8 +1,5 @@
package com.gentics.mesh.dagger.module;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
import com.gentics.mesh.auth.MeshOAuthService;
import com.gentics.mesh.auth.oauth2.MeshOAuth2ServiceImpl;
import com.gentics.mesh.cache.CacheCollection;
@@ -107,11 +104,9 @@
import com.gentics.mesh.event.impl.EventQueueBatchImpl;
import com.gentics.mesh.handler.RangeRequestHandler;
import com.gentics.mesh.handler.impl.RangeRequestHandlerImpl;
-import com.gentics.mesh.liveness.LivenessManagerImpl;
import com.gentics.mesh.metric.MetricsService;
import com.gentics.mesh.metric.MetricsServiceImpl;
import com.gentics.mesh.monitor.liveness.EventBusLivenessManager;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import com.gentics.mesh.plugin.env.PluginEnvironment;
import com.gentics.mesh.plugin.manager.MeshPluginManager;
import com.gentics.mesh.plugin.manager.MeshPluginManagerImpl;
@@ -148,16 +143,22 @@
import com.gentics.mesh.security.SecurityUtils;
import com.gentics.mesh.security.SecurityUtilsImpl;
import com.gentics.mesh.storage.LocalBinaryStorageImpl;
-
+import com.gentics.monitoring.liveness.dagger.LivenessManagerModule;
import dagger.Binds;
import dagger.Module;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
/**
* Dagger module for common bindings
*/
-@Module
+@Module(includes = {
+ LivenessManagerModule .class,
+ MeshLivenessModule.class
+})
public abstract class CommonBindModule {
+
@Binds
abstract LocalConfigApi localConfigApi(LocalConfigApiImpl e);
@@ -323,9 +324,6 @@ public abstract class CommonBindModule {
@Binds
abstract SecurityUtils bindSecurityUtils(SecurityUtilsImpl e);
- @Binds
- abstract LivenessManager bindLivenessManager(LivenessManagerImpl e);
-
@Binds
abstract EventBusLivenessManager bindEventbusLivenessManager(EventBusLivenessManagerImpl e);
diff --git a/core/src/main/java/com/gentics/mesh/dagger/module/CommonModule.java b/core/src/main/java/com/gentics/mesh/dagger/module/CommonModule.java
index 22f1728f6bc..33441b1b3d9 100644
--- a/core/src/main/java/com/gentics/mesh/dagger/module/CommonModule.java
+++ b/core/src/main/java/com/gentics/mesh/dagger/module/CommonModule.java
@@ -1,11 +1,22 @@
package com.gentics.mesh.dagger.module;
+import com.gentics.monitoring.liveness.dagger.LivenessManagerModule;
import dagger.Module;
/**
* Main module which aggregates all sub modules.
*/
-@Module(includes = { MeshModule.class, PluginModule.class, SearchProviderModule.class, DebugInfoProviderModule.class, MicrometerModule.class,
- DaoTransformableModule.class, CommonBindModule.class, JobProcessingModule.class })
+@Module(includes = {
+ MeshModule.class,
+ PluginModule.class,
+ SearchProviderModule.class,
+ DebugInfoProviderModule.class,
+ MicrometerModule.class,
+ DaoTransformableModule.class,
+ CommonBindModule.class,
+ JobProcessingModule.class,
+ LivenessManagerModule.class,
+ MeshLivenessModule.class
+})
public class CommonModule {
}
diff --git a/core/src/main/java/com/gentics/mesh/dagger/module/MeshLivenessModule.java b/core/src/main/java/com/gentics/mesh/dagger/module/MeshLivenessModule.java
new file mode 100644
index 00000000000..5a0907c5196
--- /dev/null
+++ b/core/src/main/java/com/gentics/mesh/dagger/module/MeshLivenessModule.java
@@ -0,0 +1,41 @@
+package com.gentics.mesh.dagger.module;
+
+import com.gentics.mesh.core.rest.plugin.PluginStatus;
+import com.gentics.mesh.etc.config.MeshOptions;
+import com.gentics.mesh.plugin.manager.MeshPluginManager;
+import com.gentics.monitoring.liveness.LivenessCheck;
+import com.gentics.monitoring.liveness.LivenessManagerOptions;
+import dagger.Lazy;
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.IntoSet;
+
+/**
+ * Mesh-specific liveness configuration including plugin checks.
+ */
+@Module
+public class MeshLivenessModule {
+
+ @Provides
+ static LivenessManagerOptions provideLivenessManagerOptions(MeshOptions options) {
+ return new LivenessManagerOptions(options.getLivePath())
+ .setMemoryLimit(options.getMonitoringOptions().getMemoryLimit())
+ .setGcTimeLimit(options.getMonitoringOptions().getGcTimeLimit());
+ }
+
+ @Provides
+ @IntoSet
+ static LivenessCheck providePluginLivenessCheck(Lazy pluginManager) {
+ return () -> {
+ for (var id: pluginManager.get().getPluginIds()) {
+ var status = pluginManager.get().getStatus(id);
+
+ if (status == PluginStatus.FAILED) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+ }
+}
diff --git a/core/src/main/java/com/gentics/mesh/dagger/module/MicrometerModule.java b/core/src/main/java/com/gentics/mesh/dagger/module/MicrometerModule.java
index d2366872058..27a9b78e978 100644
--- a/core/src/main/java/com/gentics/mesh/dagger/module/MicrometerModule.java
+++ b/core/src/main/java/com/gentics/mesh/dagger/module/MicrometerModule.java
@@ -22,6 +22,9 @@
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.prometheusmetrics.PrometheusConfig;
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.instrumentation.micrometer.v1_5.OpenTelemetryMeterRegistry;
+import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.vertx.core.metrics.MetricsOptions;
import io.vertx.micrometer.Label;
import io.vertx.micrometer.Match;
@@ -35,6 +38,12 @@
@Module
public class MicrometerModule {
+ @Provides
+ @Singleton
+ public static OpenTelemetry openTelemetry() {
+ return AutoConfiguredOpenTelemetrySdk.initialize().getOpenTelemetrySdk();
+ }
+
/**
* Create the meter registry for the given mesh options. The registry will automatically be tagged to include information about the nodeName and cluster
* name.
@@ -44,8 +53,8 @@ public class MicrometerModule {
*/
@Provides
@Singleton
- public static MeterRegistry meterRegistry(MeshOptions options) {
- PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
+ public static MeterRegistry meterRegistry(MeshOptions options, OpenTelemetry openTelemetry) {
+ var registry = OpenTelemetryMeterRegistry.builder(openTelemetry).build();
List tags = Stream.of(
createTag("nodeName", options.getNodeName()),
diff --git a/core/src/main/java/com/gentics/mesh/event/EventBusLivenessManagerImpl.java b/core/src/main/java/com/gentics/mesh/event/EventBusLivenessManagerImpl.java
index 785a5756ed4..f8a8d9c3dc2 100644
--- a/core/src/main/java/com/gentics/mesh/event/EventBusLivenessManagerImpl.java
+++ b/core/src/main/java/com/gentics/mesh/event/EventBusLivenessManagerImpl.java
@@ -14,6 +14,7 @@
import javax.inject.Inject;
import javax.inject.Singleton;
+import com.gentics.monitoring.liveness.LivenessManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,7 +24,6 @@
import com.gentics.mesh.core.rest.admin.cluster.ClusterStatusResponse;
import com.gentics.mesh.etc.config.MeshOptions;
import com.gentics.mesh.monitor.liveness.EventBusLivenessManager;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import dagger.Lazy;
import io.vertx.core.Vertx;
diff --git a/core/src/main/java/com/gentics/mesh/liveness/LivenessManagerImpl.java b/core/src/main/java/com/gentics/mesh/liveness/LivenessManagerImpl.java
deleted file mode 100644
index ba58ed70238..00000000000
--- a/core/src/main/java/com/gentics/mesh/liveness/LivenessManagerImpl.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package com.gentics.mesh.liveness;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.management.GarbageCollectorMXBean;
-import java.lang.management.ManagementFactory;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.gentics.mesh.core.rest.plugin.PluginStatus;
-import com.gentics.mesh.etc.config.MeshOptions;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
-import com.gentics.mesh.plugin.manager.MeshPluginManager;
-
-import dagger.Lazy;
-
-/**
- * Implementation of the {@link LivenessManager}
- */
-@Singleton
-public class LivenessManagerImpl implements LivenessManager {
- private static final Logger log = LoggerFactory.getLogger(LivenessManagerImpl.class);
-
- private final Lazy pluginManager;
-
- protected boolean live = true;
-
- protected boolean memoryOk = true;
-
- protected String error;
-
- protected final File liveFile;
-
- private ScheduledExecutorService executor;
-
- private final long memoryLimit;
-
- private final long gcTimeLimit;
-
- private long lastTimestampMs;
-
- private long lastTotalCollectionTimeMs;
-
- private long lastTotalCollectionCount;
-
- /**
- * Create instance
- * @param options mesh options
- */
- @Inject
- public LivenessManagerImpl(MeshOptions options, Lazy pluginManager) {
- this.pluginManager = pluginManager;
- liveFile = new File(options.getLivePath());
- this.memoryLimit = options.getMonitoringOptions().getMemoryLimit();
- this.gcTimeLimit = options.getMonitoringOptions().getGcTimeLimit();
- File liveFolder = liveFile.getParentFile();
- if (liveFolder != null && !liveFolder.exists() && !liveFolder.mkdirs()) {
- log.warn("Could not create parent folder for livefile {" + liveFolder.getAbsolutePath() + "}");
- }
- try {
- liveFile.createNewFile();
- } catch (IOException e) {
- log.error("Could not create livefile {" + liveFile.getAbsolutePath() + "}", e);
- }
- executor = Executors.newSingleThreadScheduledExecutor();
- executor.scheduleWithFixedDelay(() -> {
- doMemoryChecks();
- if (isLive() && pluginsLive()) {
- // touch file
- liveFile.setLastModified(System.currentTimeMillis());
- }
- }, 10, 10, TimeUnit.SECONDS);
- }
-
- @Override
- public boolean isLive() {
- return live && memoryOk;
- }
-
- @Override
- public String getError() {
- return error;
- }
-
- @Override
- public void setLive(boolean live, String error) {
- this.live = live;
- this.error = error;
- }
-
- @Override
- public void shutdown() {
- if (executor != null) {
- executor.shutdown();
- executor = null;
- }
- liveFile.delete();
- }
-
- /**
- * Check whether the plugins are live (no plugin is in status FAILED)
- * @return true, iff plugins are live
- */
- protected boolean pluginsLive() {
- for (String id : pluginManager.get().getPluginIds()) {
- PluginStatus status = pluginManager.get().getStatus(id);
- if (status == PluginStatus.FAILED) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Get the amount of used memory (percent of max available memory) and amount of time spent in garbage collections (since the last measurement).
- * If both amounts exceed the configured limits, set the flag {@link #memoryOk} to false.
- * If both amounts are below the limits, set the flag {@link #memoryOk} to true.
- * If only one amount exceeds the limit, leave the flag {@link #memoryOk} in its current state.
- */
- protected void doMemoryChecks() {
- if (memoryLimit <= 0 || gcTimeLimit <= 0) {
- return;
- }
- long timestamp = System.currentTimeMillis();
-
- Runtime runtime = Runtime.getRuntime();
- long free = runtime.freeMemory();
- long total = runtime.totalMemory();
- long max = runtime.maxMemory();
- long used = total - free;
- float percUsed = (used * 100f / max);
-
- long totalCollectionCount = 0;
- long totalCollectionTimeMs = 0;
-
- for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
- totalCollectionCount += gc.getCollectionCount();
- totalCollectionTimeMs += gc.getCollectionTime();
- }
-
- String gcInfo = "";
- if (lastTimestampMs > 0) {
- long timeSpentForCollectionsMs = totalCollectionTimeMs - lastTotalCollectionTimeMs;
- long time = timestamp - lastTimestampMs;
- float percCollectionTime = (timeSpentForCollectionsMs * 100f / time);
-
- if (percUsed > memoryLimit && percCollectionTime > gcTimeLimit) {
- memoryOk = false;
- } else if (percUsed <= memoryLimit && percCollectionTime <= gcTimeLimit) {
- memoryOk = true;
- }
-
- gcInfo = ", time spent for GCs: %.2f%% - limit is %d%%".formatted(percCollectionTime, gcTimeLimit);
- } else {
- memoryOk = true;
- }
- lastTimestampMs = timestamp;
- lastTotalCollectionCount = totalCollectionCount;
- lastTotalCollectionTimeMs = totalCollectionTimeMs;
-
- String message = "Memory %s. Used: %s/%s (%.2f%% - limit is %d%%)%s".formatted(memoryOk ? "OK" : "NOT OK",
- mb(used), mb(max), percUsed, memoryLimit, gcInfo);
- if (memoryOk) {
- log.info(message);
- } else {
- log.error(message);
- }
- }
-
- /**
- * Format the given number of bytes as megabytes
- * @param bytes bytes
- * @return bytes formatted as megabytes
- */
- protected String mb(long bytes) {
- return "%sM".formatted(bytes / (1024*1024));
- }
-}
diff --git a/core/src/main/java/com/gentics/mesh/monitor/MonitoringRoutes.java b/core/src/main/java/com/gentics/mesh/monitor/MonitoringRoutes.java
index d612412a4c8..a2db20ecdf2 100644
--- a/core/src/main/java/com/gentics/mesh/monitor/MonitoringRoutes.java
+++ b/core/src/main/java/com/gentics/mesh/monitor/MonitoringRoutes.java
@@ -5,6 +5,7 @@
import javax.inject.Inject;
+import com.gentics.monitoring.liveness.LivenessManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -16,7 +17,6 @@
import com.gentics.mesh.core.endpoint.handler.MonitoringCrudHandler;
import com.gentics.mesh.etc.config.MeshOptions;
import com.gentics.mesh.handler.VersionUtils;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import com.gentics.mesh.router.route.DefaultNotFoundHandler;
import com.gentics.mesh.router.route.FailureHandler;
diff --git a/mdm/common/src/main/java/com/gentics/mesh/monitor/liveness/LivenessManager.java b/mdm/common/src/main/java/com/gentics/mesh/monitor/liveness/LivenessManager.java
deleted file mode 100644
index 7e70500f592..00000000000
--- a/mdm/common/src/main/java/com/gentics/mesh/monitor/liveness/LivenessManager.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.gentics.mesh.monitor.liveness;
-
-/**
- * Liveness manager interface
- */
-public interface LivenessManager {
-
- /**
- * Check whether Mesh is live
- * @return true for live
- */
- boolean isLive();
-
- /**
- * Get the error, which was set when Mesh was set to be "dead"
- * @return error or null
- */
- String getError();
-
- /**
- * Set the liveness flag
- * @param live flag
- * @param error error
- */
- void setLive(boolean live, String error);
-
- /**
- * Shutdown the manager
- */
- void shutdown();
-}
diff --git a/mdm/hibernate-core/src/main/java/com/gentics/mesh/changelog/HibernateBootstrapInitializerImpl.java b/mdm/hibernate-core/src/main/java/com/gentics/mesh/changelog/HibernateBootstrapInitializerImpl.java
index 62465f1cdda..c7b8ec112f9 100644
--- a/mdm/hibernate-core/src/main/java/com/gentics/mesh/changelog/HibernateBootstrapInitializerImpl.java
+++ b/mdm/hibernate-core/src/main/java/com/gentics/mesh/changelog/HibernateBootstrapInitializerImpl.java
@@ -15,6 +15,7 @@
import javax.inject.Inject;
import javax.inject.Singleton;
+import com.gentics.monitoring.liveness.LivenessManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -48,7 +49,6 @@
import com.gentics.mesh.hibernate.data.dao.RoleDaoImpl;
import com.gentics.mesh.hibernate.data.permission.HibPermissionRoots;
import com.gentics.mesh.monitor.liveness.EventBusLivenessManager;
-import com.gentics.mesh.monitor.liveness.LivenessManager;
import com.gentics.mesh.plugin.manager.MeshPluginManager;
import com.gentics.mesh.router.RouterStorageRegistryImpl;
import com.gentics.mesh.search.DevNullSearchProvider;
@@ -102,13 +102,13 @@ public class HibernateBootstrapInitializerImpl extends AbstractBootstrapInitiali
@Inject
public HibernateBootstrapInitializerImpl(ServerSchemaStorageImpl schemaStorage, HibernateDatabase db,
- SearchProvider searchProvider, BCryptPasswordEncoder encoder, DistributedEventManager eventManager,
- Lazy indexHandlerRegistry, Lazy loader,
- HighLevelChangelogSystem highlevelChangelogSystem, CacheRegistry cacheRegistry, MeterRegistry meterRegistry,
- MeshPluginManager pluginManager, MeshOptions options, RouterStorageRegistryImpl routerStorageRegistry,
- MetricsOptions metricsOptions, LocalConfigApiImpl localConfigApi, BCryptPasswordEncoder passwordEncoder,
- MasterElector coordinatorMasterElector, LivenessManager liveness, EventBusLivenessManager eventbusLiveness,
- EventBusStore eventBusStore, ContentCachedStorage contentCachedStorage, HibPermissionRoots permRoots, RootResolver rootResolver, ChangelogDao changelogDao) {
+ SearchProvider searchProvider, BCryptPasswordEncoder encoder, DistributedEventManager eventManager,
+ Lazy indexHandlerRegistry, Lazy loader,
+ HighLevelChangelogSystem highlevelChangelogSystem, CacheRegistry cacheRegistry, MeterRegistry meterRegistry,
+ MeshPluginManager pluginManager, MeshOptions options, RouterStorageRegistryImpl routerStorageRegistry,
+ MetricsOptions metricsOptions, LocalConfigApiImpl localConfigApi, BCryptPasswordEncoder passwordEncoder,
+ MasterElector coordinatorMasterElector, LivenessManager liveness, EventBusLivenessManager eventbusLiveness,
+ EventBusStore eventBusStore, ContentCachedStorage contentCachedStorage, HibPermissionRoots permRoots, RootResolver rootResolver, ChangelogDao changelogDao) {
super(schemaStorage, db, searchProvider, passwordEncoder, eventManager, indexHandlerRegistry, loader,
highlevelChangelogSystem, cacheRegistry, meterRegistry, pluginManager, options, routerStorageRegistry, metricsOptions,
localConfigApi, passwordEncoder, coordinatorMasterElector, liveness, eventbusLiveness, eventBusStore);
diff --git a/pom.xml b/pom.xml
index 5792da52ab4..c6184d8c2e1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,6 +16,9 @@
${project.basedir}
${project.version}
${maven.build.timestamp}
+ 0.0.1-SNAPSHOT
+
+ 2.27.0
5.0.12
2.56.2
@@ -103,6 +106,16 @@
performance-tests
+
+
+
+ com.gentics
+ cmp-liveness-dagger
+ ${liveness.version}
+
+
+
+
junit
diff --git a/server/Dockerfile b/server/Dockerfile
index 39719443087..de64066750b 100644
--- a/server/Dockerfile
+++ b/server/Dockerfile
@@ -28,6 +28,7 @@ RUN adduser -D -u 1000 -G root -h /mesh mesh && \
apk update && apk add rsync curl iputils busybox-extras tar nano && rm -rf /var/cache/apk/*
ADD --chown=1000:0 ./live.sh /mesh/live.sh
ADD --chown=1000:0 ./target/mesh-server*jar /mesh/mesh.jar
+ADD --chown=1000:0 ./target/opentelemetry-javaagent.jar /mesh/opentelemetry-javaagent.jar
ADD --chown=1000:0 ./entrypoint.sh /mesh/
RUN chmod u+x,g+x /mesh/entrypoint.sh
diff --git a/server/pom.xml b/server/pom.xml
index f2ac8099b74..9ac6d61fcad 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -103,6 +103,25 @@
${project.build.directory}/mavendependencies-sharedlibs
+
+
+ copy-otel-javaagent
+ prepare-package
+
+ copy
+
+
+
+
+ io.opentelemetry.javaagent
+ opentelemetry-javaagent
+ ${otel.javaagent.version}
+ ${project.build.directory}
+ opentelemetry-javaagent.jar
+
+
+
+