This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 2f3604342a6938e87acafe0304fad3c90fe63dc2 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 10 17:05:52 2017 +0100 Un point d'entré pour voir l'état du service REST --- .../pollen/rest/api/PollenRestApiApplication.java | 4 +- .../rest/api/PollenRestApiRequestFilter.java | 4 +- .../{ConfigurationApi.java => TransverseApi.java} | 18 ++- .../src/main/resources/log4j.properties | 1 + .../src/main/resources/pollen-rest-api.properties | 1 + .../java/org/chorem/pollen/services/UnitHuman.java | 5 +- .../chorem/pollen/services/bean/PollenStatus.java | 139 +++++++++++++++++++++ .../services/config/PollenServicesConfig.java | 12 ++ .../services/service/ConfigurationService.java | 18 --- .../services/service/PollenServiceSupport.java | 4 +- .../pollen/services/service/TransverseService.java | 89 +++++++++++++ 11 files changed, 266 insertions(+), 29 deletions(-) diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java index bd133705..32bfed06 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java @@ -41,7 +41,7 @@ import org.chorem.pollen.rest.api.exceptionMappers.TopiaNoResultExceptionMapper; import org.chorem.pollen.rest.api.v1.AuthApi; import org.chorem.pollen.rest.api.v1.ChoiceApi; import org.chorem.pollen.rest.api.v1.CommentApi; -import org.chorem.pollen.rest.api.v1.ConfigurationApi; +import org.chorem.pollen.rest.api.v1.TransverseApi; import org.chorem.pollen.rest.api.v1.DocApi; import org.chorem.pollen.rest.api.v1.FavoriteListApi; import org.chorem.pollen.rest.api.v1.FeedbackApi; @@ -71,7 +71,7 @@ public class PollenRestApiApplication extends Application { new AuthApi(), new ChoiceApi(), new CommentApi(), - new ConfigurationApi(), + new TransverseApi(), new DocApi(), new FavoriteListApi(), new PollApi(), diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java index 35be8b2f..ad2e66b5 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java @@ -35,7 +35,7 @@ import org.chorem.pollen.services.PollenServiceContext; import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.service.ChoiceService; import org.chorem.pollen.services.service.CommentService; -import org.chorem.pollen.services.service.ConfigurationService; +import org.chorem.pollen.services.service.TransverseService; import org.chorem.pollen.services.service.FavoriteListService; import org.chorem.pollen.services.service.FeedService; import org.chorem.pollen.services.service.FeedbackService; @@ -124,7 +124,7 @@ public class PollenRestApiRequestFilter implements ContainerRequestFilter, Conta FeedbackService.class, SocialAuthService.class, GtuService.class, - ConfigurationService.class, + TransverseService.class, MailBoxService.class); diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/ConfigurationApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/TransverseApi.java similarity index 50% rename from pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/ConfigurationApi.java rename to pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/TransverseApi.java index 844d5a0d..928cbf1d 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/ConfigurationApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/TransverseApi.java @@ -1,7 +1,8 @@ package org.chorem.pollen.rest.api.v1; import org.chorem.pollen.services.bean.ConfigurationBean; -import org.chorem.pollen.services.service.ConfigurationService; +import org.chorem.pollen.services.bean.PollenStatus; +import org.chorem.pollen.services.service.TransverseService; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -16,14 +17,23 @@ import javax.ws.rs.core.MediaType; @Path("") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) -public class ConfigurationApi { +public class TransverseApi { @Path("configuration") @GET - public ConfigurationBean getConfiguration(@Context ConfigurationService configurationService) { + public ConfigurationBean getConfiguration(@Context TransverseService transverseService) { - return configurationService.getConfiguration(); + return transverseService.getConfiguration(); } + @Path("/status") + @GET + public PollenStatus getStatus(@Context TransverseService transverseService) { + + return transverseService.getStatus(); + + } + + } diff --git a/pollen-rest-api/src/main/resources/log4j.properties b/pollen-rest-api/src/main/resources/log4j.properties index ca563b4a..71cea7eb 100644 --- a/pollen-rest-api/src/main/resources/log4j.properties +++ b/pollen-rest-api/src/main/resources/log4j.properties @@ -23,6 +23,7 @@ log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{hh:mm:ss} %5p (%F:%L) %m%n log4j.logger.org.chorem.pollen=INFO +log4j.logger.org.chorem.pollen.services.service.mail=DEBUG log4j.logger.org.debux=INFO log4j.logger.org.hibernate.orm.deprecation=ERROR log4j.logger.com.zaxxer.hikari.HikariDataSource=ERROR diff --git a/pollen-rest-api/src/main/resources/pollen-rest-api.properties b/pollen-rest-api/src/main/resources/pollen-rest-api.properties index 4965f75a..fc964804 100644 --- a/pollen-rest-api/src/main/resources/pollen-rest-api.properties +++ b/pollen-rest-api/src/main/resources/pollen-rest-api.properties @@ -25,6 +25,7 @@ hibernate.connection.password=sa hibernate.connection.driver_class=org.h2.Driver #hibernate.hbm2ddl.auto=update pollen.version=${project.version} +pollen.buildDate=${maven.build.timestamp} hibernate.connection.provider_class=org.hibernate.hikaricp.internal.HikariCPConnectionProvider hibernate.hikari.minimumIdle=2 hibernate.hikari.maximumPoolSize=20 diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/UnitHuman.java b/pollen-services/src/main/java/org/chorem/pollen/services/UnitHuman.java index 8e920be7..762dfe8e 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/UnitHuman.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/UnitHuman.java @@ -59,6 +59,9 @@ public enum UnitHuman { return prefix + unit; } - + public static String toHumanString(double value, String unit) { + UnitHuman unitHuman = getUnitHuman(value); + return String.format("%4.2f %s", unitHuman.getUnitValue(value), unitHuman.getUnit(unit)); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenStatus.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenStatus.java new file mode 100644 index 00000000..822d0dda --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenStatus.java @@ -0,0 +1,139 @@ +package org.chorem.pollen.services.bean; + +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class PollenStatus { + + protected String version; + + protected String buildDate; + + protected String encoding; + + protected boolean persistenceOk; + + protected long nbPolls; + + protected List<String> errors; + + protected boolean allOk; + + protected String memoryAllocated; + + protected String memoryUsed; + + protected String memoryFree; + + protected String memoryMax; + + protected double loadAverage; + + protected long duration; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getBuildDate() { + return buildDate; + } + + public void setBuildDate(String buildDate) { + this.buildDate = buildDate; + } + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + public String getEncoding() { + return encoding; + } + + public void setPersistenceOk(boolean persistenceOk) { + this.persistenceOk = persistenceOk; + } + + public boolean isPersistenceOk() { + return persistenceOk; + } + + public void setNbPolls(long nbPolls) { + this.nbPolls = nbPolls; + } + + public long getNbPolls() { + return nbPolls; + } + + public void setErrors(List<String> errors) { + this.errors = errors; + } + + public List<String> getErrors() { + return errors; + } + + public void setAllOk(boolean allOk) { + this.allOk = allOk; + } + + public boolean isAllOk() { + return allOk; + } + + public void setMemoryAllocated(String memoryAllocated) { + this.memoryAllocated = memoryAllocated; + } + + public String getMemoryAllocated() { + return memoryAllocated; + } + + public void setMemoryUsed(String memoryUsed) { + this.memoryUsed = memoryUsed; + } + + public String getMemoryUsed() { + return memoryUsed; + } + + public void setMemoryFree(String memoryFree) { + this.memoryFree = memoryFree; + } + + public String getMemoryFree() { + return memoryFree; + } + + public void setMemoryMax(String memoryMax) { + this.memoryMax = memoryMax; + } + + public String getMemoryMax() { + return memoryMax; + } + + public void setLoadAverage(double loadAverage) { + this.loadAverage = loadAverage; + } + + public double getLoadAverage() { + return loadAverage; + } + + public void setDuration(long duration) { + this.duration = duration; + } + + public long getDuration() { + return duration; + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java b/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java index e68feda5..591be692 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java @@ -50,6 +50,9 @@ import java.util.TimeZone; */ public class PollenServicesConfig extends GeneratedPollenServicesConfig { + public static final String VERSION = "pollen.version"; + public static final String BUILD_DATE = "pollen.buildDate"; + private static final Log log = LogFactory.getLog(PollenServicesConfig.class); public PollenServicesConfig(String filename) { @@ -162,4 +165,13 @@ public class PollenServicesConfig extends GeneratedPollenServicesConfig { public UsersRight getUsersCanCreatePoll() { return UsersRight.valueOf(get().getOption(PollenServicesConfigOption.USERS_CAN_CREATE_POLL.getKey())); } + + public String getVersion() { + return get().getOption(VERSION); + } + + public String getBuildDate() { + return get().getOption(BUILD_DATE); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/ConfigurationService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/ConfigurationService.java deleted file mode 100644 index 74845e1d..00000000 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/ConfigurationService.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.chorem.pollen.services.service; - -import org.chorem.pollen.services.bean.ConfigurationBean; - -/** - * @author Sylvain Bavencoff - bavencoff@codelutin.com - */ -public class ConfigurationService extends PollenServiceSupport { - - public ConfigurationBean getConfiguration() { - ConfigurationBean bean = new ConfigurationBean(); - bean.setUserConnectedRequired(getPollenServiceConfig().isUserConnectedRequired()); - bean.setUsersCanCreatePoll(getPollenServiceConfig().getUsersCanCreatePoll()); - - return bean; - } - -} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java index ddbe62fb..25dc27ab 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java @@ -128,8 +128,8 @@ public abstract class PollenServiceSupport implements PollenService { return newService(CommentService.class); } - protected ConfigurationService getConfigurationService() { - return newService(ConfigurationService.class); + protected TransverseService getConfigurationService() { + return newService(TransverseService.class); } protected FavoriteListService getFavoriteListService() { diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/TransverseService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/TransverseService.java new file mode 100644 index 00000000..36392c7e --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/TransverseService.java @@ -0,0 +1,89 @@ +package org.chorem.pollen.services.service; + +import com.google.common.collect.Lists; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.pollen.services.UnitHuman; +import org.chorem.pollen.services.bean.ConfigurationBean; +import org.chorem.pollen.services.bean.PollenStatus; + +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class TransverseService extends PollenServiceSupport { + + private static final Log log = LogFactory.getLog(TransverseService.class); + + public ConfigurationBean getConfiguration() { + ConfigurationBean bean = new ConfigurationBean(); + bean.setUserConnectedRequired(getPollenServiceConfig().isUserConnectedRequired()); + bean.setUsersCanCreatePoll(getPollenServiceConfig().getUsersCanCreatePoll()); + + return bean; + } + + public PollenStatus getStatus() { + long statusStart = System.currentTimeMillis(); + List<String> errors = Lists.newArrayList(); + + + PollenStatus status = new PollenStatus(); + status.setVersion(getPollenServiceConfig().getVersion()); + status.setBuildDate(getPollenServiceConfig().getBuildDate()); + status.setEncoding(System.getProperty("file.encoding")); + + boolean persistenceOk = false; + long nbPolls = 0; + try { + nbPolls = getPollDao().count(); + persistenceOk = true; + } catch (Exception eee) { + if (log.isWarnEnabled()) { + log.warn("Erreur lors de la lecture du nombre de sondage ", eee); + } + errors.add(eee.getMessage()); + } + status.setPersistenceOk(persistenceOk); + status.setNbPolls(nbPolls); + status.setErrors(errors); + + boolean allOk = persistenceOk && errors.isEmpty(); + status.setAllOk(allOk); + + // Mémoire : Données brutes + Runtime runtime = Runtime.getRuntime(); + long freeMemoryOnAllocated = runtime.freeMemory(); // Mémoire libre (par rapport à la mémoire allouée) + long totalMemory = runtime.totalMemory(); // Mémoire allouée + long maxMemory = runtime.maxMemory(); // Mémoire totale (max) + + // Mémoire : Données déduites + long usedMemory = totalMemory - freeMemoryOnAllocated; // Mémoire utilisée (allouée - libre) + double usedPercent = ((double) usedMemory / maxMemory) * 100d; // Mémoire utilisée en pourcentage du max + long freeMemory = maxMemory - usedMemory; // Mémoire libre (par rapport au max) + double freePercent = 100d - usedPercent; // Mémoire libre en pourcentage du max + + status.setMemoryAllocated(UnitHuman.toHumanString(totalMemory, "o")); + status.setMemoryUsed(String.format("%s (%.2f%s)", UnitHuman.toHumanString(usedMemory, "o"), usedPercent, "%")); + status.setMemoryFree(String.format("%s (%.2f%s)", UnitHuman.toHumanString(freeMemory, "o"), freePercent, "%")); + status.setMemoryMax(UnitHuman.toHumanString(maxMemory, "o")); + + OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); + double systemLoadAverage = os.getSystemLoadAverage(); + status.setLoadAverage(systemLoadAverage); + + long statusEnd = System.currentTimeMillis(); + + status.setDuration(statusEnd - statusStart); + + if (log.isDebugEnabled()) { + log.debug("Status :" + status); + } + + return status; + } + +} -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.