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