diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthStatus.java b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthStatus.java index 5398ac1571..bcbc70b746 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthStatus.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthStatus.java @@ -46,4 +46,8 @@ public class HealthStatus implements Serializable { public String getResource() { return resource; } + + public String toString(){ + return healthId + ": " + level + " " + message + " from " + resource; + } } diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthView.java b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthView.java index 2a0876f534..8909378534 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthView.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/HealthView.java @@ -16,15 +16,21 @@ */ package org.apache.activemq.broker.jmx; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import javax.management.ObjectName; import javax.management.openmbean.CompositeDataSupport; import javax.management.openmbean.CompositeType; import javax.management.openmbean.TabularData; import javax.management.openmbean.TabularDataSupport; import javax.management.openmbean.TabularType; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import org.apache.activemq.broker.BrokerService; +import org.apache.activemq.broker.scheduler.JobSchedulerStore; +import org.apache.activemq.store.PersistenceAdapter; +import org.apache.activemq.usage.SystemUsage; public class HealthView implements HealthViewMBean { @@ -60,6 +66,112 @@ public class HealthView implements HealthViewMBean { answer.add(new HealthStatus("org.apache.activemq.noConsumer", "WARNING", message, key.toString())); } } + + /** + * Check persistence store directory limits + * + */ + BrokerService brokerService = broker.getBrokerService(); + if (brokerService != null && brokerService.getPersistenceAdapter() != null) { + PersistenceAdapter adapter = brokerService.getPersistenceAdapter(); + File dir = adapter.getDirectory(); + if (brokerService.isPersistent()) { + SystemUsage usage = brokerService.getSystemUsage(); + if (dir != null && usage != null) { + String dirPath = dir.getAbsolutePath(); + if (!dir.isAbsolute()) { + dir = new File(dirPath); + } + + + while (dir != null && !dir.isDirectory()) { + dir = dir.getParentFile(); + } + long storeSize = adapter.size(); + long storeLimit = usage.getStoreUsage().getLimit(); + long dirFreeSpace = dir.getUsableSpace(); + + if (storeSize != 0) { + int val = (int) ((storeSize * 100) / storeLimit); + if (val > 90) { + answer.add(new HealthStatus("org.apache.activemq.StoreLimit", "WARNING", "Message Store size is within " + val + "% of its limit", adapter.toString())); + } + } + + + if ((storeLimit - storeSize) > dirFreeSpace) { + String message = "Store limit is " + storeLimit / (1024 * 1024) + + " mb, whilst the data directory: " + dir.getAbsolutePath() + + " only has " + dirFreeSpace / (1024 * 1024) + " mb of usable space"; + answer.add(new HealthStatus("org.apache.activemq.FreeDiskSpaceLeft", "WARNING", message, adapter.toString())); + } + + + } + File tmpDir = brokerService.getTmpDataDirectory(); + if (tmpDir != null) { + + String tmpDirPath = tmpDir.getAbsolutePath(); + if (!tmpDir.isAbsolute()) { + tmpDir = new File(tmpDirPath); + } + + long storeSize = usage.getTempUsage().getUsage(); + long storeLimit = usage.getTempUsage().getLimit(); + while (tmpDir != null && !tmpDir.isDirectory()) { + tmpDir = tmpDir.getParentFile(); + } + + int val = (int) ((storeSize * 100) / storeLimit); + if (val > 90) { + answer.add(new HealthStatus("org.apache.activemq.TempStoreLimit", "WARNING", "TempMessage Store size is within " + val + "% of its limit", adapter.toString())); + } + + + } + + + } + } + + if (brokerService != null && brokerService.getJobSchedulerStore() != null) { + JobSchedulerStore scheduler = brokerService.getJobSchedulerStore(); + File dir = scheduler.getDirectory(); + if (brokerService.isPersistent()) { + SystemUsage usage = brokerService.getSystemUsage(); + if (dir != null && usage != null) { + String dirPath = dir.getAbsolutePath(); + if (!dir.isAbsolute()) { + dir = new File(dirPath); + } + + + while (dir != null && !dir.isDirectory()) { + dir = dir.getParentFile(); + } + long storeSize = scheduler.size(); + long storeLimit = usage.getJobSchedulerUsage().getLimit(); + long dirFreeSpace = dir.getUsableSpace(); + + if (storeSize != 0) { + int val = (int) ((storeSize * 100) / storeLimit); + if (val > 90) { + answer.add(new HealthStatus("org.apache.activemq.JobSchedulerLimit", "WARNING", "JobSchedulerMessage Store size is within " + val + "% of its limit", scheduler.toString())); + } + } + + + if ((storeLimit - storeSize) > dirFreeSpace) { + String message = "JobSchedulerStore limit is " + storeLimit / (1024 * 1024) + + " mb, whilst the data directory: " + dir.getAbsolutePath() + + " only has " + dirFreeSpace / (1024 * 1024) + " mb of usable space"; + answer.add(new HealthStatus("org.apache.activemq.FreeDiskSpaceLeft", "WARNING", message, scheduler.toString())); + } + + } + } + } + return answer; }