From e48aee4c2e060302697731db0832b1e3882968a5 Mon Sep 17 00:00:00 2001 From: madness-inc Date: Mon, 6 Dec 2021 10:41:08 +0100 Subject: [PATCH] MGR-126 --- .../manager/business/Environment.java | 68 +++++++++---------- .../manager/business/EnvironmentTest.java | 62 +++++++++++++++++ .../EnvironmentTest-validateJvmArguments.xml | 35 ++++++++++ .../xml/EnvironmentTest-validateMemory.xml | 33 +++++++++ .../xml/EnvironmentTest-validateProcessor.xml | 18 +++++ .../xml/EnvironmentTest-validateSystemEnv.xml | 18 +++++ .../EnvironmentTest-validateSystemProps.xml | 18 +++++ 7 files changed, 217 insertions(+), 35 deletions(-) create mode 100644 src/test/java/org/appng/application/manager/business/EnvironmentTest.java create mode 100644 src/test/resources/xml/EnvironmentTest-validateJvmArguments.xml create mode 100644 src/test/resources/xml/EnvironmentTest-validateMemory.xml create mode 100644 src/test/resources/xml/EnvironmentTest-validateProcessor.xml create mode 100644 src/test/resources/xml/EnvironmentTest-validateSystemEnv.xml create mode 100644 src/test/resources/xml/EnvironmentTest-validateSystemProps.xml diff --git a/src/main/java/org/appng/application/manager/business/Environment.java b/src/main/java/org/appng/application/manager/business/Environment.java index fb2975f..d32cb26 100644 --- a/src/main/java/org/appng/application/manager/business/Environment.java +++ b/src/main/java/org/appng/application/manager/business/Environment.java @@ -33,6 +33,7 @@ import javax.management.openmbean.CompositeData; import org.apache.commons.collections.keyvalue.DefaultMapEntry; +import org.apache.commons.lang3.StringUtils; import org.appng.api.DataContainer; import org.appng.api.DataProvider; import org.appng.api.FieldProcessor; @@ -50,72 +51,69 @@ @Component("env") public class Environment implements DataProvider { - @SuppressWarnings("unchecked") - public DataContainer getData(Site site, Application application, org.appng.api.Environment environment, - Options options, Request request, FieldProcessor fieldProcessor) { - String action = options.getOptionValue("mode", "id"); - DataContainer dataContainer = new DataContainer(fieldProcessor); + private static final double HIGH_TRESHOLD = 0.85d; + private static final double MEDIUM_TRESHOLD = 0.75d; + + public DataContainer getData(Site site, Application app, org.appng.api.Environment env, Options opts, + Request request, FieldProcessor fp) { + String action = opts.getOptionValue("mode", "id"); + DataContainer dataContainer = new DataContainer(fp); Map entryMap = null; if ("env".equals(action)) { entryMap = System.getenv(); } else if ("props".equals(action)) { entryMap = System.getProperties(); } else if ("jvm".equals(action)) { - entryMap = new HashMap(); + Map jvm = new HashMap(); + entryMap = jvm; List inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments(); for (String arg : inputArguments) { int idx = arg.indexOf('='); - String key = arg; - String value = ""; - if (idx > 0) { - key = arg.substring(0, idx); - value = arg.substring(idx + 1); + String key = idx > 0 ? arg.substring(0, idx) : arg; + String value = idx > 0 ? arg.substring(idx + 1) : StringUtils.EMPTY; + if (!jvm.containsKey(key)) { + jvm.put(key, value); + } else { + jvm.replace(key, jvm.get(key) + StringUtils.LF + value); } - ((Map) entryMap).put(key, value); } } else if ("mem".equals(action)) { - entryMap = new HashMap(); - Unit unit = Unit.KB; - long factor = unit.getFactor(); - DecimalFormat format = new DecimalFormat(" #,###,000 " + unit.name()); - DecimalFormat percentFormat = new DecimalFormat("#0.00 %"); - + Map memory = new HashMap(); + entryMap = memory; MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); - addUsage((Map) entryMap, factor, format, percentFormat, mBeanServer, "Heap", "Memory", - null, "HeapMemoryUsage"); - addUsage((Map) entryMap, factor, format, percentFormat, mBeanServer, "Metaspace", - "MemoryPool", "Metaspace", "Usage"); + addUsage(memory, mBeanServer, "Heap", "Memory", null, "HeapMemoryUsage"); + addUsage(memory, mBeanServer, "Metaspace", "MemoryPool", "Metaspace", "Usage"); } else if ("proc".equals(action)) { - entryMap = new HashMap(); + Map proc = new HashMap(); + entryMap = proc; OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean(); - int procs = osMxBean.getAvailableProcessors(); - double load = osMxBean.getSystemLoadAverage(); - ((Map) entryMap).put("Processors", Integer.toString(procs)); - ((Map) entryMap).put("Average Load", Double.toString(load)); + proc.put("Processors", Integer.toString(osMxBean.getAvailableProcessors())); + proc.put("Average Load", Double.toString(osMxBean.getSystemLoadAverage())); } - List> entries = getSortedEntries(entryMap); - dataContainer.setPage(entries, fieldProcessor.getPageable()); + dataContainer.setPage(getSortedEntries(entryMap), fp.getPageable()); return dataContainer; } - protected void addUsage(Map entryMap, long factor, DecimalFormat format, - DecimalFormat percentFormat, MBeanServer mBeanServer, String entryName, String type, String name, - String attributeName) { + protected void addUsage(Map entryMap, MBeanServer mBeanServer, String entryName, String type, + String name, String attributeName) { try { + DecimalFormat format = new DecimalFormat(" #,###,000 " + Unit.KB.name()); ObjectName objectName = new ObjectName("java.lang:type=" + type + (null == name ? "" : (",name=" + name))); CompositeData attribute = (CompositeData) mBeanServer.getAttribute(objectName, attributeName); long committed = (long) attribute.get("committed"); long max = (long) attribute.get("max"); long used = (long) attribute.get("used"); + long factor = Unit.KB.getFactor(); entryMap.put(entryName + " Size", new LeveledEntry(format.format((double) committed / factor))); entryMap.put(entryName + " Max", new LeveledEntry(max < 0 ? "?" : format.format((double) max / factor))); entryMap.put(entryName + " Used", new LeveledEntry(format.format((double) used / factor))); if (max > 0) { double percentage = (double) used / (double) max; - int level = percentage < 0.75d ? LeveledEntry.LOW - : (percentage < 0.85d ? LeveledEntry.MED : LeveledEntry.HIGH); - entryMap.put(entryName + " Used (%)", new LeveledEntry(percentFormat.format(percentage), level)); + int level = percentage < MEDIUM_TRESHOLD ? LeveledEntry.LOW + : (percentage < HIGH_TRESHOLD ? LeveledEntry.MED : LeveledEntry.HIGH); + entryMap.put(entryName + " Used (%)", + new LeveledEntry(new DecimalFormat("#0.00 %").format(percentage), level)); } } catch (OperationsException | ReflectionException | MBeanException e) { log.error("error adding memory usage", e); diff --git a/src/test/java/org/appng/application/manager/business/EnvironmentTest.java b/src/test/java/org/appng/application/manager/business/EnvironmentTest.java new file mode 100644 index 0000000..da2bd3e --- /dev/null +++ b/src/test/java/org/appng/application/manager/business/EnvironmentTest.java @@ -0,0 +1,62 @@ +/* + * Copyright 2011-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.appng.application.manager.business; + +import org.apache.commons.lang3.StringUtils; +import org.appng.api.support.CallableDataSource; +import org.appng.testsupport.validation.WritingXmlValidator; +import org.appng.testsupport.validation.XPathDifferenceHandler; +import org.junit.Test; + +public class EnvironmentTest extends AbstractTest { + + static { + WritingXmlValidator.writeXml = false; + } + + @Test + public void testSystemEnv() throws Exception { + validate("systemEnv"); + } + + @Test + public void testSystemProps() throws Exception { + validate("systemProps"); + } + + @Test + public void testJvmArguments() throws Exception { + validate("jvmArguments"); + } + + @Test + public void testProcessor() throws Exception { + validate("processor"); + } + + @Test + public void testMemory() throws Exception { + validate("memory"); + } + + protected void validate(String dataSource) throws Exception { + CallableDataSource ds = getDataSource(dataSource).getCallableDataSource(); + ds.perform(""); + ds.getDatasource().getData().setResultset(null); + XPathDifferenceHandler dh = new XPathDifferenceHandler(true); + validate(ds.getDatasource(), StringUtils.capitalize(dataSource), dh); + } +} diff --git a/src/test/resources/xml/EnvironmentTest-validateJvmArguments.xml b/src/test/resources/xml/EnvironmentTest-validateJvmArguments.xml new file mode 100644 index 0000000..7024ad0 --- /dev/null +++ b/src/test/resources/xml/EnvironmentTest-validateJvmArguments.xml @@ -0,0 +1,35 @@ + + + + JVM Arguments + + + + + + + + + + + + + + + + + + reload + Do you really want to reload the platform? + + + + + + + goto + + + + + diff --git a/src/test/resources/xml/EnvironmentTest-validateMemory.xml b/src/test/resources/xml/EnvironmentTest-validateMemory.xml new file mode 100644 index 0000000..4c707fe --- /dev/null +++ b/src/test/resources/xml/EnvironmentTest-validateMemory.xml @@ -0,0 +1,33 @@ + + + + Memory + + + + + + + + + + + + spacer + led_green + led_orange + led_red + + + + + + + + + goto + + + + + diff --git a/src/test/resources/xml/EnvironmentTest-validateProcessor.xml b/src/test/resources/xml/EnvironmentTest-validateProcessor.xml new file mode 100644 index 0000000..666dbc9 --- /dev/null +++ b/src/test/resources/xml/EnvironmentTest-validateProcessor.xml @@ -0,0 +1,18 @@ + + + + Processor + + + + + + + + + + + + + + diff --git a/src/test/resources/xml/EnvironmentTest-validateSystemEnv.xml b/src/test/resources/xml/EnvironmentTest-validateSystemEnv.xml new file mode 100644 index 0000000..a217180 --- /dev/null +++ b/src/test/resources/xml/EnvironmentTest-validateSystemEnv.xml @@ -0,0 +1,18 @@ + + + + System Environment + + + + + + + + + + + + + + diff --git a/src/test/resources/xml/EnvironmentTest-validateSystemProps.xml b/src/test/resources/xml/EnvironmentTest-validateSystemProps.xml new file mode 100644 index 0000000..08aa867 --- /dev/null +++ b/src/test/resources/xml/EnvironmentTest-validateSystemProps.xml @@ -0,0 +1,18 @@ + + + + System Properties + + + + + + + + + + + + + +