diff --git a/.gitignore b/.gitignore index 9d021b4..c63e487 100755 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ .idea .classpath .project - +.idea +.DS_Store +target/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..1d6e81a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,23 @@ +## Hadoop Monitoring Extension Changelogs + +#### Version 3.0.0 +- Revamped extension to appd-exts-commons 2.2.4 to work with latest agents +- Added seamless Workbench support + +#### Version 2.5.1 +- Updated Licenses + +#### Version 2.5.0 +- Made the list of metrics configurable + +#### Version 2.2.0 +- Added host component states, configuration moved to config.yml + +#### Version 2.0.1 +- Fix to work with Machine Agent 4.x + +#### Version 1.0.4 +- Fixed self-signed certificates issue + +#### Version 1.3.0 +- Updated to support Hadoop 1.x installed by Ambari, as well as Hadoop 2.x \ No newline at end of file diff --git a/README.md b/README.md index 6306471..3ce2c7c 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,10 @@ Metrics include: - Service metrics for HDFS, YARN, MapReduce, HBase, Hive, WebHCat, Oozie, Ganglia, Nagios, and ZooKeeper -Installation -------------- -#### Prerequisites + +Prerequisites +----------- +- Before the extension is installed, the prerequisites mentioned [here](https://community.appdynamics.com/t5/Knowledge-Base/Extensions-Prerequisites-Guide/ta-p/35213) need to be met. Please do not proceed with the extension installation if the specified prerequisites are not met. - Hadoop distribution that features Hadoop YARN. Distributions based on Hadoop 2.x should include YARN - Examples: hadoop-2.x, hadoop-0.23.x, CDH4 from Cloudera, HDP 2 from Hortonworks, and Pivotal HD from Pivotal - Resource Manager hostname and port @@ -32,6 +33,9 @@ OR If the cluster version is 1.x and not installed by Ambari, no metrics can be gathered at this time. +Installation +------------- + #### Steps 1. To build from source, clone this repository and run `mvn clean install`. This will produce a HadoopMonitor-VERSION.zip in the target directory. Alternatively, download the latest release archive from [Github](https://github.com/Appdynamics/hadoop-monitoring-extension/releases/latest). 2. Unzip as "HadoopMonitor" and copy the "HadoopMonitor" directory to `/monitors`. @@ -40,60 +44,77 @@ If the cluster version is 1.x and not installed by Ambari, no metrics can be gat 5. Restart the machine agent. 6. In the AppDynamics Metric Browser, look for: Application Infrastructure Performance | \ | Custom Metrics | Hadoop. +Please place the extension in the "monitors" directory of your Machine Agent installation directory. Do not place the extension in the "extensions" directory of your Machine Agent installation directory. + ## Configuration ## + +### config.yml Note : Please make sure to not use tab (\t) while editing yaml files. You may want to validate the yaml file using a [yaml validator](http://yamllint.com/) -1. Configure the extension by editing the config.yml file in `/monitors/HadoopMonitor/`. - For eg. - ``` - # To enable or diable ResourceManager metrics, set resourceManagerMonitor to "true" or "false" - # The Hadoop version for the cluster you want to monitor using Resource Manager. - # Example: 1.3, 2.2, 0.23 - # RESOURCE MANAGER Web UI CONFIG: Resource Manager is only usable for Hadoop 2.x and Hadoop 0.23.x - - resourceManagerMonitor: true - resourceManagerConfig: - hadoopVersion: "2.3" - host: "localhost" - port: 8088 - username: "" - password: "" - - # application metrics within last X number of minutes to monitor - monitoringTimePeriod: 15 - - # mapReduceJobsToBeMonitored: comma separated jobs to be monitored within time specified by monitoringTimePeriod - # with their state (NEW, NEW_SAVING, SUBMITTED, ACCEPTED, RUNNING, FINISHED, FAILED, KILLED) as integers reported to controller - mapReduceJobsToBeMonitored: ["grep-search","grep-sort"] - - - # To enable or diable Ambari metrics, set ambariMonitor to "true" or "false" - # Ambari metrics are only available for clusters inistalled using Ambari, manual installs are not eligible - # ambariConfig: Only configure if 'ambariMonitor' is set to 'true' - - ambariMonitor: true - ambariConfig: - host: "192.168.0.101" - port: 8080 - username: "admin" - password: "admin" - - numberOfThreads: 10 - - # includeClusters: comma-separated cluster names (case sensitive) you want to gather metrics for. If empty, all clusters are reported - # includeHosts: comma-separated host names (case sensitive) you want to gather metrics for. If empty, all hosts are reported - # includeServices: comma-separated service names (case sensitive) you want to gather metrics for. If empty, all services are reported - includeClusters: [] - includeHosts: [] - includeServices: [] - - #prefix used to show up metrics in AppDynamics - metricPathPrefix: "Custom Metrics|HadoopMonitor|" +#### Configure Metric Prefix +Please follow section 2.1 of the [Document](https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-troubleshoot-missing-custom-metrics-or-extensions/ta-p/28695) to set up metric prefix. +~~~ +# Use this only if SIM is enabled +#metricPrefix: "Custom Metrics|Hadoop|" - ``` +# If SIM is not enabled, then use this +metricPrefix: "Server|Component:|Custom Metrics|Hadoop|" +~~~ -3. Configure the path to the config.yml file by editing the in the monitor.xml file in the `/monitors/HadoopMonitor/` directory. Below is the sample +#### Configure servers section + ``` + #Please ensure that appropriate "type" is configured for all servers. "type" can be any of "resourceManagerMonitor" or "ambariMonitor" only. +servers: + - uri: "http://localhost:8088" + username: "admin" + password: "admin" + encryptedPassword: "" + name: "RM Server" + type: "resourceManagerMonitor" + + #Ambari server can be configured with type as ambariMonitor + - uri: "http://localhost:8088/api/v1" + username: "admin" + password: "admin" + encryptedPassword: "" + name: "Ambari Server" + type: "ambariMonitor" + +#Password Encryption Support. +#encryptionKey: welcome + +connection: + socketTimeout: 20000 + connectTimeout: 20000 + sslCertCheckEnabled: false + sslVerifyHostname: false + + +#Please do not remove any of the below monitor. Just configure the appropriate applications/filters based on type specified for your server. +resourceManagerMonitor: + # This will monitor the type of applications in the monitoringTimePeriod + # Only the aggregate of State and Finished Status will be reported + applications: + - type: "MAPREDUCE" + names: [".*"] + #In Minutes + monitoringTimePeriod: 30 + + +ambariMonitor: + # Regex expressions are supported in the filters + filters: + clusters: + includes: ['.*'] + hosts: + includes: ['.*'] + services: + includes: ['.*'] + + ``` +### monitor.xml +Configure the path to the config.yml file by editing the in the monitor.xml file in the `/monitors/HadoopMonitor/` directory. Below is the sample ``` @@ -193,6 +214,14 @@ https://github.com/apache/ambari/blob/trunk/ambari-server/docs/api/v1/index.md#m | State | Component state +Credentials Encryption +------------------ +Please visit [this page](https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-use-Password-Encryption-with-Extensions/ta-p/29397) to get detailed instructions on password encryption. The steps in this document will guide you through the whole process. + +Extensions Workbench +------------------ +Workbench is an inbuilt feature provided with each extension in order to assist you to fine tune the extension setup before you actually deploy it on the controller. Please review the following document on [How to use the Extensions WorkBench](https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-use-the-Extensions-WorkBench/ta-p/30130). + Custom Dashboard ------------------ #### Hadoop 1 @@ -203,19 +232,37 @@ Custom Dashboard ![](https://raw.github.com/Appdynamics/hadoop-monitoring-extension/master/Hadoop2Dashboard.png) -Contributing ------------- - -Always feel free to fork and contribute any changes directly here on GitHub. +Troubleshooting +------------------ +Please follow the steps listed in this [troubleshooting-document](https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-troubleshoot-missing-custom-metrics-or-extensions/ta-p/28695) in order to troubleshoot your issue. These are a set of common issues that customers might have faced during the installation of the extension. If these don't solve your issue, please follow the last step on the [troubleshooting-document](https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-troubleshoot-missing-custom-metrics-or-extensions/ta-p/28695) to contact the support team. -Community ---------- - -Find out more in the AppSphere. +Support Tickets +------------------ +If after going through the [Troubleshooting Document](https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-troubleshoot-missing-custom-metrics-or-extensions/ta-p/28695) you have not been able to get your extension working, please file a ticket with the following information: -Support -------- +1. Stop the running machine agent. +2. Delete all existing logs under /logs. +3. Please enable debug logging by editing the file /conf/logging/log4j.xml. Change the level value of the following elements to debug. + ``` + + + ``` +4. Start the machine agent and please let it run for 10 mins. Then zip and upload all the logs in the directory /logs/*. + Attach the zipped /conf/* directory. +5. Attach the zipped /monitors/ExtensionFolderYouAreHavingIssuesWith directory. -For any questions or feature request, please contact AppDynamics Center of Excellence. +For any support related questions, you can also contact help@appdynamics.com. +Contributing +------------ +Always feel free to fork and contribute any changes directly here on [GitHub](https://github.com/Appdynamics/hadoop-monitoring-extension). + +## Version +| Name | Version | +|--------------------------|------------| +|Extension Version |3.0.0 | +|Controller Compatibility |4.5 or Later| +|Machine Agent Version |4.5.13+ | +|Product Tested on |2.7.0 | +|Last Update |21/06/2021 | diff --git a/hadoop-monitoring-extension.iml b/hadoop-monitoring-extension.iml index 53ba90f..0dad31d 100644 --- a/hadoop-monitoring-extension.iml +++ b/hadoop-monitoring-extension.iml @@ -1,6 +1,6 @@ - + @@ -10,26 +10,47 @@ - + - - - - - - - - - - - - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - - + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 168edf4..7fb1e38 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.appdynamics.monitors hadoop-monitoring-extension - 2.5.1 + 3.0.0 hadoop-monitoring-extension http://maven.apache.org @@ -24,34 +24,14 @@ com.appdynamics - machine-agent - 3.7.11 + machineagent-repackaged + 4.0.5.1 provided com.appdynamics appd-exts-commons - 1.6.5 - - - org.slf4j - slf4j-api - 1.7.21 - - - org.apache.httpcomponents - httpclient - 4.3.5 - - - commons-io - commons-io - 2.4 - - - org.codehaus.jackson - jackson-mapper-asl - 1.9.13 + 2.2.4 junit @@ -65,10 +45,9 @@ test - org.slf4j - slf4j-log4j12 - 1.7.21 - test + org.javassist + javassist + 3.18.1-GA @@ -80,8 +59,8 @@ maven-compiler-plugin 2.3.2 - 1.5 - 1.5 + 1.8 + 1.8 @@ -138,8 +117,7 @@ - - + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,168 +15,103 @@ * limitations under the License. */ -package com.appdynamics.monitors.hadoop; -import com.appdynamics.extensions.PathResolver; -import com.appdynamics.extensions.StringUtils; -import com.appdynamics.extensions.conf.MonitorConfiguration; -import com.appdynamics.extensions.conf.MonitorConfiguration.ConfItem; -import com.appdynamics.extensions.util.MetricWriteHelper; -import com.appdynamics.extensions.util.MetricWriteHelperFactory; +import com.appdynamics.extensions.ABaseMonitor; +import com.appdynamics.extensions.TasksExecutionServiceProvider; +import com.appdynamics.extensions.conf.MonitorContextConfiguration; +import com.appdynamics.extensions.logging.ExtensionsLoggerFactory; +import com.appdynamics.extensions.util.AssertUtils; +import com.appdynamics.monitors.hadoop.Utility.Constants; + import com.appdynamics.monitors.hadoop.communicator.AmbariMetricsFetcherTask; import com.appdynamics.monitors.hadoop.communicator.ResourceMgrMetricsFetcherTask; import com.appdynamics.monitors.hadoop.input.MetricConfig; +import com.appdynamics.monitors.hadoop.input.MetricStats; import com.google.common.base.Strings; -import com.singularity.ee.agent.systemagent.api.AManagedMonitor; -import com.singularity.ee.agent.systemagent.api.TaskExecutionContext; -import com.singularity.ee.agent.systemagent.api.TaskOutput; -import com.singularity.ee.agent.systemagent.api.exception.TaskExecutionException; + import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.io.File; import java.util.List; import java.util.Map; -public class HadoopMonitor extends AManagedMonitor { - public static final Logger logger = LoggerFactory.getLogger(HadoopMonitor.class); - public static final String CONFIG_ARG = "config-file"; - public static final String RM_METRICS_XML_ARG = "metrics-resource-manager-file"; - public static final String AMBARI_METRICS_XML_ARG = "metrics-ambari-file"; - private MonitorConfiguration ambariMonitorConfig; - private MonitorConfiguration resourceMgrMonitorConfig; - - public HadoopMonitor() { - String msg = "Using Monitor Version [" + getImplementationVersion() + "]"; - logger.info(msg); - System.out.println(msg); - } +public class HadoopMonitor extends ABaseMonitor{ - public void init(Map taskArgs) { - if (resourceMgrMonitorConfig == null) { - this.resourceMgrMonitorConfig = initResourceManagerConfig(taskArgs); - } - if (ambariMonitorConfig == null) { - this.ambariMonitorConfig = initAmbariConfig(taskArgs); - } - } + private static final Logger logger = ExtensionsLoggerFactory.getLogger(HadoopMonitor.class); - protected MonitorConfiguration initAmbariConfig(Map taskArgs) { - logger.info("Initializing the Ambari Monitor Configuration"); - String configFilename = getConfigFilename(taskArgs.get(CONFIG_ARG)); - MetricWriteHelper metricWriteHelper = MetricWriteHelperFactory.create(this); - MonitorConfiguration conf = new MonitorConfiguration("Custom Metrics|HadoopMonitor|Ambari", - new AmbariMonitorExecutor(), metricWriteHelper); - String xmlPath = getPath(taskArgs, AMBARI_METRICS_XML_ARG, "monitors/HadoopMonitor/metrics-ambari.xml"); - conf.setMetricsXml(xmlPath, MetricConfig.class); - conf.setConfigYml(configFilename, "ambariMonitor"); - if (conf.isEnabled()) { - conf.checkIfInitialized(ConfItem.CONFIG_YML, ConfItem.METRIC_PREFIX, - ConfItem.METRIC_WRITE_HELPER, ConfItem.METRICS_XML); - } else { - logger.info("The Ambari Monitor is not enabled"); - } - return conf; - } + private MonitorContextConfiguration monitorContextConfiguration; + private Map configYml; - protected MonitorConfiguration initResourceManagerConfig(Map taskArgs) { - logger.info("Initializing the Resource Manager Monitor Configuration"); - String configFilename = getConfigFilename(taskArgs.get(CONFIG_ARG)); - MetricWriteHelper metricWriteHelper = MetricWriteHelperFactory.create(this); - MonitorConfiguration conf = new MonitorConfiguration("Custom Metrics|HadoopMonitor|ResourceManager", - new RMMonitorExecutor(), metricWriteHelper); - String xmlPath = getPath(taskArgs, RM_METRICS_XML_ARG, "monitors/HadoopMonitor/metrics-resource-manager.xml"); - conf.setMetricsXml(xmlPath, MetricConfig.class); - conf.setConfigYml(configFilename, new ConfigReloader(), "resourceManagerMonitor"); - if (conf.isEnabled()) { - conf.checkIfInitialized(ConfItem.CONFIG_YML, ConfItem.METRIC_PREFIX, ConfItem.METRIC_WRITE_HELPER); - } else{ - logger.info("The Resource Manager Monitor is not enabled"); - } - return conf; + @Override + protected String getDefaultMetricPrefix() { + return Constants.DEFAULT_METRIC_PREFIX; } - private String getPath(Map taskArgs, String pathKey, String defaultValue) { - String path = taskArgs.get(pathKey); - if (StringUtils.hasText(path)) { - return path.trim(); - } else { - return defaultValue; - } + @Override + public String getMonitorName() { + return Constants.MONITOR_NAME; } - private class AmbariMonitorExecutor implements Runnable { + @Override + protected void doRun(TasksExecutionServiceProvider serviceProvider) { + List> servers = (List>) configYml.get(Constants.SERVERS); + AssertUtils.assertNotNull(servers, "The servers section cannot be null"); - public void run() { - Map configYml = ambariMonitorConfig.getConfigYml(); - List servers = (List) configYml.get("servers"); - if (servers != null && !servers.isEmpty()) { - for (Map server : servers) { - AmbariMetricsFetcherTask task = new AmbariMetricsFetcherTask(ambariMonitorConfig, server); - ambariMonitorConfig.getExecutorService().execute(task); - } - } - } - } - - private class RMMonitorExecutor implements Runnable { - - public void run() { - Map configYml = resourceMgrMonitorConfig.getConfigYml(); - List servers = (List) configYml.get("servers"); - if (servers != null && !servers.isEmpty()) { - for (Map server : servers) { - ResourceMgrMetricsFetcherTask task = new ResourceMgrMetricsFetcherTask(resourceMgrMonitorConfig, server); - resourceMgrMonitorConfig.getExecutorService().execute(task); + for(Map server: servers) { + try { + if (!Strings.isNullOrEmpty((String) server.get("type")) && ((String) server.get("type")).equals(Constants.RESOURCE_MANAGER_MONITOR)) { + logger.info("Starting ResourceManagerMonitorTask for server " + (server.get(Constants.DISPLAY_NAME))); + Map resourceManagerMonitor = (Map) configYml.get(Constants.RESOURCE_MANAGER_MONITOR); + AssertUtils.assertNotNull(resourceManagerMonitor, "resourceManagerMonitor cannot be null or empty in config file"); + MetricConfig rmMetricConfig = getMetricConfig(Constants.RESOURCE_MANAGER_MONITOR); + AssertUtils.assertNotNull(rmMetricConfig,"No configurations are provided for " + Constants.RESOURCE_MANAGER_MONITOR + " in metrics.xml file. Not collecting metrics for "+server.get(Constants.DISPLAY_NAME)); + ResourceMgrMetricsFetcherTask resourceMgrMetricsFetcherTask = new ResourceMgrMetricsFetcherTask(monitorContextConfiguration, serviceProvider.getMetricWriteHelper(), server, resourceManagerMonitor, rmMetricConfig); + serviceProvider.submit("ResourceMgrMetricsFetcherTask", resourceMgrMetricsFetcherTask); + } else if (!Strings.isNullOrEmpty((String) server.get("type")) && ((String) server.get("type")).equals(Constants.AMBARI_MONITOR)) { + logger.info("Starting AmbariMonitorTask for server " + (server.get(Constants.DISPLAY_NAME))); + Map ambariMonitor = (Map) configYml.get(Constants.AMBARI_MONITOR); + AssertUtils.assertNotNull(ambariMonitor, "ambariMonitor cannot be null or empty in config file"); + MetricConfig ambariMetricConfig = getMetricConfig(Constants.AMBARI_MONITOR); + AssertUtils.assertNotNull(ambariMetricConfig,"No configurations are provided for " + Constants.AMBARI_MONITOR + " in metrics.xml file. Not collecting metrics for "+server.get(Constants.DISPLAY_NAME)); + AmbariMetricsFetcherTask ambariMetricsFetcherTask = new AmbariMetricsFetcherTask(monitorContextConfiguration, serviceProvider.getMetricWriteHelper(), server, ambariMonitor, ambariMetricConfig); + serviceProvider.submit("AmbariMetricsFetcherTask", ambariMetricsFetcherTask); + } else { + logger.info("Not starting task for server {} as type is incorrectly set in config file", server.get(Constants.DISPLAY_NAME)); } + } catch(Exception ex){ + logger.error("Error occurred while running task for server "+server.get(Constants.DISPLAY_NAME),ex); } } } - - private class ConfigReloader implements MonitorConfiguration.FileWatchListener { - - public void onFileChange(File file) { - try { - //loadConfigYml(file); - } catch (Exception e) { - logger.error("Error while loading the Ambari configuration" + file.getAbsolutePath(), e); - } - } + @Override + protected void initializeMoreStuff(Map args) { + monitorContextConfiguration = getContextConfiguration(); + configYml = monitorContextConfiguration.getConfigYml(); + AssertUtils.assertNotNull(configYml,"The config.yml is not available"); + this.getContextConfiguration().setMetricXml(args.get(Constants.METRIC_FILE), MetricStats.class); } - public TaskOutput execute(Map taskArgs, TaskExecutionContext arg1) - throws TaskExecutionException { - try { - init(taskArgs); - logger.debug("Executing the HadoopMonitor with args {}", taskArgs); - ambariMonitorConfig.executeTask(); - resourceMgrMonitorConfig.executeTask(); - } catch (Exception e) { - logger.error("Exception while running the task", e); - throw new TaskExecutionException(e); - } - return new TaskOutput("Execution Triggered"); + @Override + protected List> getServers() { + return (List>) configYml.get(Constants.SERVERS); } - public static String getConfigFilename(String filename) { - if (filename == null) { - return ""; - } - // for absolute paths - if (new File(filename).exists()) { - return filename; - } - // for relative paths - File jarPath = PathResolver.resolveDirectory(AManagedMonitor.class); - String configFileName = ""; - if (!Strings.isNullOrEmpty(filename)) { - configFileName = jarPath + File.separator + filename; + protected MetricConfig getMetricConfig(String monitorName){ + MetricStats metricStats = (MetricStats) monitorContextConfiguration.getMetricsXml(); + for(MetricConfig metricConfig: metricStats.getMetricConfig()){ + if(metricConfig.getName().equals(monitorName)){ + return metricConfig; + } } - return configFileName; + return null; } - public static String getImplementationVersion() { - return HadoopMonitor.class.getPackage().getImplementationTitle(); - } +// public static void main(String[] args) throws TaskExecutionException { +// +// HadoopMonitor monitor = new HadoopMonitor(); +// final Map taskArgs = new HashMap<>(); +// taskArgs.put("config-file", "src/main/resources/conf/config.yml"); +// taskArgs.put("metric-file", "src/main/resources/conf/metrics.xml"); +// monitor.execute(taskArgs, null); +// } } \ No newline at end of file diff --git a/src/main/java/com/appdynamics/monitors/hadoop/Utility/AntPathMatcher.java b/src/main/java/com/appdynamics/monitors/hadoop/Utility/AntPathMatcher.java new file mode 100644 index 0000000..a52d381 --- /dev/null +++ b/src/main/java/com/appdynamics/monitors/hadoop/Utility/AntPathMatcher.java @@ -0,0 +1,439 @@ +package com.appdynamics.monitors.hadoop.Utility; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.StringTokenizer; + +/** + *

PathMatcher implementation for Ant-style path patterns. + * Examples are provided below.

+ *

+ *

Part of this mapping code has been kindly borrowed from + * Apache Ant. + *

+ *

The mapping matches URLs using the following rules:
+ *

    + *
  • ? matches one character
  • + *
  • * matches zero or more characters
  • + *
  • ** matches zero or more 'directories' in a path
  • + *
+ *

+ *

Some examples:
+ *

    + *
  • com/t?st.jsp - matches com/test.jsp but also + * com/tast.jsp or com/txst.jsp
  • + *
  • com/*.jsp - matches all .jsp files in the + * com directory
  • + *
  • com/**/test.jsp - matches all test.jsp + * files underneath the com path
  • + *
  • org/apache/shiro/**/*.jsp - matches all .jsp + * files underneath the org/apache/shiro path
  • + *
  • org/**/servlet/bla.jsp - matches + * org/apache/shiro/servlet/bla.jsp but also + * org/apache/shiro/testing/servlet/bla.jsp and + * org/servlet/bla.jsp
  • + *
+ *

+ *

N.B.: This class was borrowed (with much appreciation) from the + * Spring Framework with modifications. We didn't want to reinvent the + * wheel of great work they've done, but also didn't want to force every Shiro user to depend on Spring

+ *

+ *

As per the Apache 2.0 license, the original copyright notice and all author and copyright information have + * remained in tact.

+ * + * @since 16.07.2003 + */ +public class AntPathMatcher { + + //TODO - complete JavaDoc + + /** + * Default path separator: "/" + */ + public static final String DEFAULT_PATH_SEPARATOR = "/"; + + private String pathSeparator = DEFAULT_PATH_SEPARATOR; + + + /** + * Set the path separator to use for pattern parsing. + * Default is "/", as in Ant. + */ + public void setPathSeparator(String pathSeparator) { + this.pathSeparator = (pathSeparator != null ? pathSeparator : DEFAULT_PATH_SEPARATOR); + } + + + public boolean isPattern(String path) { + return (path.indexOf('*') != -1 || path.indexOf('?') != -1); + } + + public boolean matches(String pattern, String source) { + return match(pattern, source); + } + + public boolean match(String pattern, String path) { + return doMatch(pattern, path, true); + } + + public boolean matchStart(String pattern, String path) { + return doMatch(pattern, path, false); + } + + + /** + * Actually match the given path against the given pattern. + * + * @param pattern the pattern to match against + * @param path the path String to test + * @param fullMatch whether a full pattern match is required + * (else a pattern match as far as the given base path goes is sufficient) + * @return true if the supplied path matched, + * false if it didn't + */ + protected boolean doMatch(String pattern, String path, boolean fullMatch) { + if (path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) { + return false; + } + + String[] pattDirs = tokenizeToStringArray(pattern, this.pathSeparator,true,true); + String[] pathDirs = tokenizeToStringArray(path, this.pathSeparator,true,true); + + int pattIdxStart = 0; + int pattIdxEnd = pattDirs.length - 1; + int pathIdxStart = 0; + int pathIdxEnd = pathDirs.length - 1; + + // Match all elements up to the first ** + while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) { + String patDir = pattDirs[pattIdxStart]; + if ("**".equals(patDir)) { + break; + } + if (!matchStrings(patDir, pathDirs[pathIdxStart])) { + return false; + } + pattIdxStart++; + pathIdxStart++; + } + + if (pathIdxStart > pathIdxEnd) { + // Path is exhausted, only match if rest of pattern is * or **'s + if (pattIdxStart > pattIdxEnd) { + return (pattern.endsWith(this.pathSeparator) ? + path.endsWith(this.pathSeparator) : !path.endsWith(this.pathSeparator)); + } + if (!fullMatch) { + return true; + } + if (pattIdxStart == pattIdxEnd && pattDirs[pattIdxStart].equals("*") && + path.endsWith(this.pathSeparator)) { + return true; + } + for (int i = pattIdxStart; i <= pattIdxEnd; i++) { + if (!pattDirs[i].equals("**")) { + return false; + } + } + return true; + } else if (pattIdxStart > pattIdxEnd) { + // String not exhausted, but pattern is. Failure. + return false; + } else if (!fullMatch && "**".equals(pattDirs[pattIdxStart])) { + // Path start definitely matches due to "**" part in pattern. + return true; + } + + // up to last '**' + while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) { + String patDir = pattDirs[pattIdxEnd]; + if (patDir.equals("**")) { + break; + } + if (!matchStrings(patDir, pathDirs[pathIdxEnd])) { + return false; + } + pattIdxEnd--; + pathIdxEnd--; + } + if (pathIdxStart > pathIdxEnd) { + // String is exhausted + for (int i = pattIdxStart; i <= pattIdxEnd; i++) { + if (!pattDirs[i].equals("**")) { + return false; + } + } + return true; + } + + while (pattIdxStart != pattIdxEnd && pathIdxStart <= pathIdxEnd) { + int patIdxTmp = -1; + for (int i = pattIdxStart + 1; i <= pattIdxEnd; i++) { + if (pattDirs[i].equals("**")) { + patIdxTmp = i; + break; + } + } + if (patIdxTmp == pattIdxStart + 1) { + // '**/**' situation, so skip one + pattIdxStart++; + continue; + } + // Find the pattern between padIdxStart & padIdxTmp in str between + // strIdxStart & strIdxEnd + int patLength = (patIdxTmp - pattIdxStart - 1); + int strLength = (pathIdxEnd - pathIdxStart + 1); + int foundIdx = -1; + + strLoop: + for (int i = 0; i <= strLength - patLength; i++) { + for (int j = 0; j < patLength; j++) { + String subPat = (String) pattDirs[pattIdxStart + j + 1]; + String subStr = (String) pathDirs[pathIdxStart + i + j]; + if (!matchStrings(subPat, subStr)) { + continue strLoop; + } + } + foundIdx = pathIdxStart + i; + break; + } + + if (foundIdx == -1) { + return false; + } + + pattIdxStart = patIdxTmp; + pathIdxStart = foundIdx + patLength; + } + + for (int i = pattIdxStart; i <= pattIdxEnd; i++) { + if (!pattDirs[i].equals("**")) { + return false; + } + } + + return true; + } + + /** + * Tests whether or not a string matches against a pattern. + * The pattern may contain two special characters:
+ * '*' means zero or more characters
+ * '?' means one and only one character + * + * @param pattern pattern to match against. + * Must not be null. + * @param str string which must be matched against the pattern. + * Must not be null. + * @return true if the string matches against the + * pattern, or false otherwise. + */ + private boolean matchStrings(String pattern, String str) { + char[] patArr = pattern.toCharArray(); + char[] strArr = str.toCharArray(); + int patIdxStart = 0; + int patIdxEnd = patArr.length - 1; + int strIdxStart = 0; + int strIdxEnd = strArr.length - 1; + char ch; + + boolean containsStar = false; + for (char aPatArr : patArr) { + if (aPatArr == '*') { + containsStar = true; + break; + } + } + + if (!containsStar) { + // No '*'s, so we make a shortcut + if (patIdxEnd != strIdxEnd) { + return false; // Pattern and string do not have the same size + } + for (int i = 0; i <= patIdxEnd; i++) { + ch = patArr[i]; + if (ch != '?') { + if (ch != strArr[i]) { + return false;// Character mismatch + } + } + } + return true; // String matches against pattern + } + + + if (patIdxEnd == 0) { + return true; // Pattern contains only '*', which matches anything + } + + // Process characters before first star + while ((ch = patArr[patIdxStart]) != '*' && strIdxStart <= strIdxEnd) { + if (ch != '?') { + if (ch != strArr[strIdxStart]) { + return false;// Character mismatch + } + } + patIdxStart++; + strIdxStart++; + } + if (strIdxStart > strIdxEnd) { + // All characters in the string are used. Check if only '*'s are + // left in the pattern. If so, we succeeded. Otherwise failure. + for (int i = patIdxStart; i <= patIdxEnd; i++) { + if (patArr[i] != '*') { + return false; + } + } + return true; + } + + // Process characters after last star + while ((ch = patArr[patIdxEnd]) != '*' && strIdxStart <= strIdxEnd) { + if (ch != '?') { + if (ch != strArr[strIdxEnd]) { + return false;// Character mismatch + } + } + patIdxEnd--; + strIdxEnd--; + } + if (strIdxStart > strIdxEnd) { + // All characters in the string are used. Check if only '*'s are + // left in the pattern. If so, we succeeded. Otherwise failure. + for (int i = patIdxStart; i <= patIdxEnd; i++) { + if (patArr[i] != '*') { + return false; + } + } + return true; + } + + // process pattern between stars. padIdxStart and patIdxEnd point + // always to a '*'. + while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) { + int patIdxTmp = -1; + for (int i = patIdxStart + 1; i <= patIdxEnd; i++) { + if (patArr[i] == '*') { + patIdxTmp = i; + break; + } + } + if (patIdxTmp == patIdxStart + 1) { + // Two stars next to each other, skip the first one. + patIdxStart++; + continue; + } + // Find the pattern between padIdxStart & padIdxTmp in str between + // strIdxStart & strIdxEnd + int patLength = (patIdxTmp - patIdxStart - 1); + int strLength = (strIdxEnd - strIdxStart + 1); + int foundIdx = -1; + strLoop: + for (int i = 0; i <= strLength - patLength; i++) { + for (int j = 0; j < patLength; j++) { + ch = patArr[patIdxStart + j + 1]; + if (ch != '?') { + if (ch != strArr[strIdxStart + i + j]) { + continue strLoop; + } + } + } + + foundIdx = strIdxStart + i; + break; + } + + if (foundIdx == -1) { + return false; + } + + patIdxStart = patIdxTmp; + strIdxStart = foundIdx + patLength; + } + + // All characters in the string are used. Check if only '*'s are left + // in the pattern. If so, we succeeded. Otherwise failure. + for (int i = patIdxStart; i <= patIdxEnd; i++) { + if (patArr[i] != '*') { + return false; + } + } + + return true; + } + + /** + * Given a pattern and a full path, determine the pattern-mapped part. + *

For example: + *

    + *
  • '/docs/cvs/commit.html' and '/docs/cvs/commit.html -> ''
  • + *
  • '/docs/*' and '/docs/cvs/commit -> 'cvs/commit'
  • + *
  • '/docs/cvs/*.html' and '/docs/cvs/commit.html -> 'commit.html'
  • + *
  • '/docs/**' and '/docs/cvs/commit -> 'cvs/commit'
  • + *
  • '/docs/**\/*.html' and '/docs/cvs/commit.html -> 'cvs/commit.html'
  • + *
  • '/*.html' and '/docs/cvs/commit.html -> 'docs/cvs/commit.html'
  • + *
  • '*.html' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
  • + *
  • '*' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
  • + *
+ *

Assumes that {@link #match} returns true for 'pattern' + * and 'path', but does not enforce this. + */ + public String extractPathWithinPattern(String pattern, String path) { + String[] patternParts = tokenizeToStringArray(pattern, this.pathSeparator,true,true); + String[] pathParts = tokenizeToStringArray(path, this.pathSeparator,true,true); + + StringBuilder buffer = new StringBuilder(); + + // Add any path parts that have a wildcarded pattern part. + int puts = 0; + for (int i = 0; i < patternParts.length; i++) { + String patternPart = patternParts[i]; + if ((patternPart.indexOf('*') > -1 || patternPart.indexOf('?') > -1) && pathParts.length >= i + 1) { + if (puts > 0 || (i == 0 && !pattern.startsWith(this.pathSeparator))) { + buffer.append(this.pathSeparator); + } + buffer.append(pathParts[i]); + puts++; + } + } + + // Append any trailing path parts. + for (int i = patternParts.length; i < pathParts.length; i++) { + if (puts > 0 || i > 0) { + buffer.append(this.pathSeparator); + } + buffer.append(pathParts[i]); + } + + return buffer.toString(); + } + + public static String[] tokenizeToStringArray( + String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) { + + if (str == null) { + return null; + } + StringTokenizer st = new StringTokenizer(str, delimiters); + List tokens = new ArrayList(); + while (st.hasMoreTokens()) { + String token = st.nextToken(); + if (trimTokens) { + token = token.trim(); + } + if (!ignoreEmptyTokens || token.length() > 0) { + tokens.add(token); + } + } + return toStringArray(tokens); + } + + public static String[] toStringArray(Collection collection) { + if (collection == null) { + return null; + } + return (String[]) collection.toArray(new String[collection.size()]); + } + +} diff --git a/src/main/java/com/appdynamics/monitors/hadoop/Utility/Constants.java b/src/main/java/com/appdynamics/monitors/hadoop/Utility/Constants.java new file mode 100644 index 0000000..39f66d9 --- /dev/null +++ b/src/main/java/com/appdynamics/monitors/hadoop/Utility/Constants.java @@ -0,0 +1,13 @@ +package com.appdynamics.monitors.hadoop.Utility; + +public class Constants { + + public static final String DEFAULT_METRIC_PREFIX = "Custom Metrics|HadoopMonitor"; + public static final String MONITOR_NAME = "Hadoop Monitor"; + public static final String METRIC_FILE = "metric-file"; + public static final String SERVERS = "servers"; + public static final String RESOURCE_MANAGER_MONITOR = "resourceManagerMonitor"; + public static final String AMBARI_MONITOR = "ambariMonitor"; + public static final String DISPLAY_NAME = "name"; + public static final String SEPARATOR = "|"; +} diff --git a/src/main/java/com/appdynamics/monitors/hadoop/Utility/MetricUtils.java b/src/main/java/com/appdynamics/monitors/hadoop/Utility/MetricUtils.java new file mode 100644 index 0000000..3fa3cbe --- /dev/null +++ b/src/main/java/com/appdynamics/monitors/hadoop/Utility/MetricUtils.java @@ -0,0 +1,16 @@ +package com.appdynamics.monitors.hadoop.Utility; + +import java.math.BigDecimal; + +public class MetricUtils { + + public static BigDecimal multiplyAndRound(String value, BigDecimal multiplier) { + BigDecimal newValue; + if (multiplier != null) { + newValue = new BigDecimal(value).multiply(multiplier); + } else { + newValue = new BigDecimal(value); + } + return newValue.setScale(0, BigDecimal.ROUND_HALF_UP); + } +} diff --git a/src/main/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTask.java b/src/main/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTask.java index a4cd842..c29c7d3 100644 --- a/src/main/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTask.java +++ b/src/main/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTask.java @@ -7,21 +7,25 @@ package com.appdynamics.monitors.hadoop.communicator; -import com.appdynamics.extensions.NumberUtils; -import com.appdynamics.extensions.StringUtils; -import com.appdynamics.extensions.conf.MonitorConfiguration; +import com.appdynamics.extensions.AMonitorTaskRunnable; +import com.appdynamics.extensions.MetricWriteHelper; + +import com.appdynamics.extensions.conf.MonitorContextConfiguration; import com.appdynamics.extensions.http.HttpClientUtils; import com.appdynamics.extensions.http.UrlBuilder; +import com.appdynamics.extensions.logging.ExtensionsLoggerFactory; +import com.appdynamics.extensions.metrics.PerMinValueCalculator; import com.appdynamics.extensions.util.JsonUtils; -import com.appdynamics.extensions.util.MetricUtils; -import com.appdynamics.extensions.util.PerMinValueCalculator; -import com.appdynamics.extensions.util.ext.AntPathMatcher; +import com.appdynamics.extensions.util.NumberUtils; +import com.appdynamics.extensions.util.StringUtils; +import com.appdynamics.monitors.hadoop.Utility.AntPathMatcher; +import com.appdynamics.monitors.hadoop.Utility.Constants; +import com.appdynamics.monitors.hadoop.Utility.MetricUtils; import com.appdynamics.monitors.hadoop.input.*; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.node.ArrayNode; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.util.Arrays; @@ -31,21 +35,30 @@ /** * Created by abey.tom on 9/7/16. */ -public class AmbariMetricsFetcherTask implements Runnable { - public static final Logger logger = LoggerFactory.getLogger(AmbariMetricsFetcherTask.class); +public class AmbariMetricsFetcherTask implements AMonitorTaskRunnable { + private static final Logger logger = ExtensionsLoggerFactory.getLogger(AmbariMetricsFetcherTask.class); - private MonitorConfiguration configuration; + private MonitorContextConfiguration configuration; + private MetricWriteHelper metricWriteHelper; private Map server; + private Map ambariMonitor; + private String metricPrefix; + private MetricConfig metricConfig; + + private static PerMinValueCalculator calculator = new PerMinValueCalculator(); - public AmbariMetricsFetcherTask(MonitorConfiguration configuration, Map server) { + public AmbariMetricsFetcherTask(MonitorContextConfiguration configuration, MetricWriteHelper metricWriteHelper, Map server, Map ambariMonitor, MetricConfig metricConfig) { this.configuration = configuration; + this.metricWriteHelper=metricWriteHelper; this.server = server; + this.ambariMonitor=ambariMonitor; + this.metricPrefix=configuration.getMetricPrefix()+ Constants.SEPARATOR+Constants.AMBARI_MONITOR+Constants.SEPARATOR+server.get(Constants.DISPLAY_NAME); + this.metricConfig=metricConfig; } public void run() { try { - String url = UrlBuilder.fromYmlServerConfig(server) - .path("clusters").query("fields=Clusters,hosts,services").build(); + String url = UrlBuilder.fromYmlServerConfig(server).path("clusters").query("fields=Clusters,hosts,services").build(); fetchMetrics(url); } catch (Exception e) { logger.error("Unexpected error while fetching the data", e); @@ -62,9 +75,7 @@ private void fetchMetrics(String url) { JsonNode response = getResponseAsJson(url); if (response != null) { String statLabel = getStatLabel(url, stat); - String serverName = (String) server.get("name"); //This name could be null or Empty - String basePrefix = configuration.getMetricPrefix(); - String statMetricPrefix = StringUtils.concatMetricPath(basePrefix, serverName, statLabel); + String statMetricPrefix = StringUtils.concatMetricPath(metricPrefix, statLabel); collectStats(stat, response, statMetricPrefix); } else { logger.info("The url {} didnt return the expected response", url); @@ -78,12 +89,12 @@ private void fetchMetrics(String url) { } protected JsonNode getResponseAsJson(String url) { - return HttpClientUtils.getResponseAsJson(configuration.getHttpClient(), url, JsonNode.class); + return HttpClientUtils.getResponseAsJson(configuration.getContext().getHttpClient(), url, JsonNode.class); } private boolean filterIncludes(Stat stat, String url) { Filter[] filters = stat.getFilters(); - Map filtersConf = (Map) configuration.getConfigYml().get("filters"); + Map filtersConf = (Map) ambariMonitor.get("filters"); if (filters != null && filters.length > 0 & filtersConf != null) { String[] urlSegments = url.split("/"); boolean include = true; @@ -186,8 +197,7 @@ private String getStatLabel(String url, Stat stat) { } private Stat[] getStats() { - MetricConfig statConf = (MetricConfig) configuration.getMetricsXmlConfiguration(); - return statConf.getStats(); + return metricConfig.getStats(); } private void collectStats(Stat stat, JsonNode response, String statMetricPrefix) { @@ -212,11 +222,11 @@ private void collectChildStats(Stat parentStat, JsonNode node, String statMetric if (nested instanceof ArrayNode) { ArrayNode nestedNodes = (ArrayNode) nested; for (JsonNode nestedNode : nestedNodes) { - String url = nestedNode.getTextValue(); + String url = nestedNode.textValue(); triggerMetricsFetch(childStat, url); } } else { - String url = nested.getTextValue(); + String url = nested.textValue(); triggerMetricsFetch(childStat, url); } } @@ -241,7 +251,7 @@ private void collectChildStats(Stat parentStat, JsonNode node, String statMetric private void triggerMetricsFetch(Stat childStat, final String url) { if (filterIncludes(childStat, url)) { - configuration.getExecutorService().submit(new Runnable() { + configuration.getContext().getExecutorService().submit("ChildTask",new Runnable() { public void run() { try { fetchMetrics(url); @@ -261,7 +271,6 @@ private void collectMetrics(Stat stat, JsonNode node, String statMetricPrefix) { collectMetrics(stat, node, statMetricPrefix, metrics); } if (stat.getMetricGroups() != null) { - MetricConfig metricConfig = (MetricConfig) configuration.getMetricsXmlConfiguration(); for (MetricGroup group : stat.getMetricGroups()) { String name = group.getName(); MetricGroup grp = metricConfig.getMetricGroup(name); @@ -291,7 +300,6 @@ private void collectMetric(Stat stat, JsonNode node, String statMetricPrefix, Me String attr = metric.getAttr(); String value = JsonUtils.getTextValue(node, attr.split("\\|")); if (StringUtils.hasText(value)) { - MetricConfig metricConfig = (MetricConfig) configuration.getMetricsXmlConfiguration(); value = metric.convertValue(attr, value, metricConfig); value = value.replace("%", ""); String metricLabel = getMetricLabel(metric, node); @@ -357,20 +365,19 @@ private ArrayNode getChildNodes(JsonNode response, String children) { private void printMetric(String metricPath, BigDecimal value, Metric metric, Stat stat) { String metricType = getMetricType(metric, stat); if (!Boolean.TRUE.equals(metric.getShowOnlyPerMin())) { - configuration.getMetricWriter().printMetric(metricPath, value, metricType); + metricWriteHelper.printMetric(metricPath, value, metricType); } else { logger.debug("Skipping the metric {}, since only perMin is needed", metricPath); } if (Boolean.TRUE.equals(metric.getCalculatePerMin())) { String perMinPath = metricPath + " per Min"; - PerMinValueCalculator calculator = configuration.getPerMinValueCalculator(); BigDecimal perMinValue = calculator.getPerMinuteValue(metricPath, value); if (perMinValue != null) { String perMinMetricType = metric.getPerMinMetricType(); if (perMinMetricType == null) { perMinMetricType = metricType; } - configuration.getMetricWriter().printMetric(perMinPath, perMinValue, perMinMetricType); + metricWriteHelper.printMetric(perMinPath, perMinValue, perMinMetricType); } } } @@ -403,4 +410,8 @@ private Stat getMatchingStat(String url, Stat[] stats) { return null; } + @Override + public void onTaskComplete() { + logger.info("Completed AmbariMetricsFetcherTask for server "+server.get(Constants.DISPLAY_NAME)); + } } diff --git a/src/main/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTask.java b/src/main/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTask.java index 32719f7..1c9c9bf 100644 --- a/src/main/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTask.java +++ b/src/main/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTask.java @@ -7,22 +7,21 @@ package com.appdynamics.monitors.hadoop.communicator; -import com.appdynamics.extensions.NumberUtils; -import com.appdynamics.extensions.StringUtils; -import com.appdynamics.extensions.conf.MonitorConfiguration; +import com.appdynamics.extensions.AMonitorTaskRunnable; +import com.appdynamics.extensions.MetricWriteHelper; +import com.appdynamics.extensions.conf.MonitorContextConfiguration; import com.appdynamics.extensions.http.HttpClientUtils; import com.appdynamics.extensions.http.UrlBuilder; -import com.appdynamics.extensions.util.GroupCounter; -import com.appdynamics.extensions.util.JsonUtils; -import com.appdynamics.extensions.util.MetricUtils; -import com.appdynamics.extensions.util.YmlUtils; +import com.appdynamics.extensions.logging.ExtensionsLoggerFactory; +import com.appdynamics.extensions.util.*; +import com.appdynamics.monitors.hadoop.Utility.Constants; +import com.appdynamics.monitors.hadoop.Utility.MetricUtils; import com.appdynamics.monitors.hadoop.input.Metric; import com.appdynamics.monitors.hadoop.input.MetricConfig; import com.appdynamics.monitors.hadoop.input.Stat; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.node.ArrayNode; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.util.Collections; @@ -33,30 +32,34 @@ /** * Created by abey.tom on 9/22/16. */ -public class ResourceMgrMetricsFetcherTask implements Runnable { +public class ResourceMgrMetricsFetcherTask implements AMonitorTaskRunnable { + private static final Logger logger = ExtensionsLoggerFactory.getLogger(ResourceMgrMetricsFetcherTask.class); + public static final String[] KNOWN_STATUS = {"UNDEFINED", "SUCCEEDED", "FAILED", "KILLED"}; public static final String[] KNOWN_STATES = {"NEW", "NEW_SAVING", "SUBMITTED", "ACCEPTED", "RUNNING", "FINISHED", "FAILED", "KILLED"}; - public static final Logger logger = LoggerFactory.getLogger(ResourceMgrMetricsFetcherTask.class); - private final MonitorConfiguration configuration; - private final Map server; + private MonitorContextConfiguration configuration; + private MetricWriteHelper metricWriteHelper; + private Map server; + private Map resourceManagerMonitor; + private String metricPrefix; + private MetricConfig metricConfig; - public ResourceMgrMetricsFetcherTask(MonitorConfiguration configuration, Map server) { + public ResourceMgrMetricsFetcherTask(MonitorContextConfiguration configuration, MetricWriteHelper metricWriteHelper, Map server, Map resourceManagerMonitor, MetricConfig metricConfig) { this.configuration = configuration; + this.metricWriteHelper=metricWriteHelper; this.server = server; + this.resourceManagerMonitor=resourceManagerMonitor; + this.metricPrefix=configuration.getMetricPrefix()+ Constants.SEPARATOR+Constants.RESOURCE_MANAGER_MONITOR+Constants.SEPARATOR+server.get(Constants.DISPLAY_NAME); + this.metricConfig=metricConfig; } + @Override public void run() { - try { - runTask(); - } catch (Exception e) { - logger.error("Exception while running the task", e); - } - + runTask(); } - private void runTask() { - MetricConfig metricConfig = (MetricConfig) configuration.getMetricsXmlConfiguration(); + public void runTask() { Stat[] stats = metricConfig.getStats(); if (stats != null && stats.length > 0) { for (Stat stat : stats) { @@ -78,19 +81,19 @@ private void runTask() { } protected JsonNode getResponseAsJson(String fullUrl) { - return HttpClientUtils.getResponseAsJson(configuration.getHttpClient() + return HttpClientUtils.getResponseAsJson(configuration.getContext().getHttpClient() , fullUrl, JsonNode.class, Collections.singletonMap("Accept", "application/json")); } protected void printJobTypeMonitoring() { Map config = configuration.getConfigYml(); - int monitoringTimePeriod = YmlUtils.getInt(config.get("monitoringTimePeriod"), 15); + int monitoringTimePeriod = YmlUtils.getInt(resourceManagerMonitor.get("monitoringTimePeriod"), 15); long monitoringPeriod = System.currentTimeMillis() - monitoringTimePeriod * 60 * 1000; - List> applications = (List>) config.get("applications"); + List> applications = (List>) resourceManagerMonitor.get("applications"); if (applications != null) { for (Map application : applications) { String applicationType = (String) application.get("type"); - String prefix = StringUtils.concatMetricPath(getMetricPrefix(), "Current Apps", applicationType); + String prefix = StringUtils.concatMetricPath(metricPrefix, "Current Apps", applicationType); JsonNode response = getAppsOfTypeResponse(monitoringPeriod, application); JsonNode apps = JsonUtils.getNestedObject(response, "apps", "app"); List names = (List) application.get("names"); @@ -121,10 +124,6 @@ protected void printJobTypeMonitoring() { } } - private String getMetricPrefix() { - return StringUtils.concatMetricPath(configuration.getMetricPrefix(), (String) server.get("name")); - } - private boolean matches(String name, List regexes) { if (regexes != null) { for (String regex : regexes) { @@ -148,7 +147,7 @@ private void printAppTypeStates(String prefix, GroupCounter statusCounte val = new BigDecimal(value); } String metricPath = StringUtils.concatMetricPath(prefix, stat); - configuration.getMetricWriter().printMetric(metricPath, val, "OBS.CUR.COL"); + metricWriteHelper.printMetric(metricPath, val, "OBS.CUR.COL"); } } @@ -231,8 +230,7 @@ private void printFairSchedulerQueueMetrics(JsonNode parentQueue, Stat stat, Str } private Stat getStatsByName(String name) { - MetricConfig config = (MetricConfig) configuration.getMetricsXmlConfiguration(); - Stat[] stats = config.getStats(); + Stat[] stats = metricConfig.getStats(); if (stats != null) { for (Stat stat : stats) { if (name != null && name.equals(stat.getName())) { @@ -262,20 +260,19 @@ private void parseResponse(Stat stat, JsonNode response) { } private void reportMetrics(JsonNode node, Stat stat) { - String statPrefix = StringUtils.concatMetricPath(getMetricPrefix(), stat.getLabel()); + String statPrefix = StringUtils.concatMetricPath(metricPrefix, stat.getLabel()); Metric[] metrics = stat.getMetrics(); if (metrics != null) { for (Metric metric : metrics) { String attr = metric.getAttr(); String metricValue = JsonUtils.getTextValue(node, attr.split("\\|")); - MetricConfig config = (MetricConfig) configuration.getMetricsXmlConfiguration(); - metricValue = metric.convertValue(attr, metricValue, config); + metricValue = metric.convertValue(attr, metricValue, metricConfig); if (NumberUtils.isNumber(metricValue)) { BigDecimal val = MetricUtils.multiplyAndRound(metricValue, metric.getMultiplier()); String label = getLabel(metric, node); if (label != null) { String metricPath = StringUtils.concatMetricPath(statPrefix, label); - configuration.getMetricWriter().printMetric(metricPath, val, getMetricType(stat, metric)); + metricWriteHelper.printMetric(metricPath, val, getMetricType(stat, metric)); } } else { logger.debug("The metric path {} didnt return any value", attr); @@ -323,4 +320,12 @@ private String getLabel(Metric metric, JsonNode node) { return metric.getAttr(); } } + + + + @Override + public void onTaskComplete() { + logger.info("Completed ResourceMgrMetricsFetcherTask for server "+server.get(Constants.DISPLAY_NAME)); + } + } diff --git a/src/main/java/com/appdynamics/monitors/hadoop/input/Metric.java b/src/main/java/com/appdynamics/monitors/hadoop/input/Metric.java index 588a57e..f908bb1 100644 --- a/src/main/java/com/appdynamics/monitors/hadoop/input/Metric.java +++ b/src/main/java/com/appdynamics/monitors/hadoop/input/Metric.java @@ -7,7 +7,7 @@ package com.appdynamics.monitors.hadoop.input; -import com.appdynamics.extensions.StringUtils; +import com.appdynamics.extensions.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,7 +26,7 @@ public class Metric { @XmlAttribute private String attr; - @XmlAttribute + @XmlAttribute(name="alias") private String label; @XmlAttribute(name = "calculate-per-min") private Boolean calculatePerMin; diff --git a/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConfig.java b/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConfig.java index 445a3e2..f7e417d 100644 --- a/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConfig.java +++ b/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConfig.java @@ -12,7 +12,7 @@ /** * Created by abey.tom on 9/8/16. */ -@XmlRootElement(name = "metric-config") + @XmlAccessorType(XmlAccessType.FIELD) public class MetricConfig { @XmlElement(name = "stat") @@ -22,6 +22,9 @@ public class MetricConfig { @XmlElement(name = "metric-group") private MetricGroup[] metricGroups; + @XmlAttribute + private String name; + public Stat[] getStats() { return stats; } @@ -56,4 +59,12 @@ public MetricGroup getMetricGroup(String name) { } return null; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConverterGroup.java b/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConverterGroup.java index 4af0049..b5cb223 100644 --- a/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConverterGroup.java +++ b/src/main/java/com/appdynamics/monitors/hadoop/input/MetricConverterGroup.java @@ -7,7 +7,7 @@ package com.appdynamics.monitors.hadoop.input; -import com.appdynamics.extensions.StringUtils; +import com.appdynamics.extensions.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/appdynamics/monitors/hadoop/input/MetricStats.java b/src/main/java/com/appdynamics/monitors/hadoop/input/MetricStats.java new file mode 100644 index 0000000..7b8f9ac --- /dev/null +++ b/src/main/java/com/appdynamics/monitors/hadoop/input/MetricStats.java @@ -0,0 +1,22 @@ +package com.appdynamics.monitors.hadoop.input; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "metricStats") +@XmlAccessorType(XmlAccessType.FIELD) +public class MetricStats { + + @XmlElement(name = "metric-config") + private MetricConfig[] MetricConfig; + + public MetricConfig[] getMetricConfig() { + return MetricConfig; + } + + public void setMetricConfig(MetricConfig[] metricConfig) { + MetricConfig = metricConfig; + } +} diff --git a/src/main/resources/conf/config.yml b/src/main/resources/conf/config.yml index 7701df6..f7ca495 100644 --- a/src/main/resources/conf/config.yml +++ b/src/main/resources/conf/config.yml @@ -1,56 +1,49 @@ -########################################################## -######### START - ResourceManager Monitor ############### -########################################################## -resourceManagerMonitor: - enabled: true - metricPrefix: "Custom Metrics|HadoopMonitor|ResourceManager" - #metricPrefix: "Server|Component:|Custom Metrics|HadoopMonitor|ResourceManager" - servers: - - uri: "http://192.168.1.216:8088" - #username: "admin" - #password: "admin" - #name: "" #Required only if there are multiple servers +# Use this only if SIM is enabled +#metricPrefix: "Custom Metrics|Hadoop|" + +# If SIM is not enabled, then use this +metricPrefix: "Server|Component:|Custom Metrics|Hadoop|" + +#Please ensure that appropriate "type" is configured for all servers. "type" can be any of "resourceManagerMonitor" or "ambariMonitor" only. + +servers: + - uri: "http://localhost:8088" + username: "admin" + password: "admin" + encryptedPassword: "" + name: "RM Server" + type: "resourceManagerMonitor" + + #- uri: "http://localhost:8088/api/v1" + # username: "admin" + # password: "admin" + # encryptedPassword: "" + # name: "Ambari Server" + # type: "ambariMonitor" + +#Password Encryption Support. +#encryptionKey: welcome + +connection: + socketTimeout: 20000 + connectTimeout: 20000 + sslCertCheckEnabled: false + sslVerifyHostname: false + + +#Please do not remove any of the below monitor. Just configure the appropriate applications/filters based on type specified for your server. +resourceManagerMonitor: # This will monitor the type of applications in the monitoringTimePeriod # Only the aggregate of State and Finished Status will be reported applications: - type: "MAPREDUCE" names: [".*"] #In Minutes - monitoringTimePeriod: 15 - - numberOfThreads: 1 - connection: - socketTimeout: 5000 - connectTimeout: 2500 - sslCertCheckEnabled: false - sslVerifyHostname: false - #Run it as a scheduled task instead of running every minute. - #If you want to run this every minute, comment this out - #taskSchedule: - #numberOfThreads: 1 - #taskDelaySeconds: 120 + monitoringTimePeriod: 30 - #Password Encryption Support. - #encryptionKey: welcome -########################################################## -######### END - ResourceManager Monitor ############### -########################################################## - -########################################################## -######### START - AMBARI MONITOR ######################## -########################################################## ambariMonitor: - enabled: true - metricPrefix: "Custom Metrics|HadoopMonitor|Ambari" - #metricPrefix: "Server|Component:|Custom Metrics|HadoopMonitor|Ambari" - servers: - - uri: "http://192.168.1.218:8080/api/v1" - username: "admin" - password: "admin" - #name: "" #Required only if there are multiple servers - # Regex expressions are supported in the filters filters: clusters: @@ -60,21 +53,5 @@ ambariMonitor: services: includes: ['.*'] - numberOfThreads: 1 - connection: - socketTimeout: 10000 - connectTimeout: 2500 - sslCertCheckEnabled: false - sslVerifyHostname: false - #Run it as a scheduled task instead of running every minute. - #If you want to run this every minute, comment this out - #taskSchedule: - #numberOfThreads: 1 - #taskDelaySeconds: 120 - - #Password Encryption Support. - #encryptionKey: welcome +numberOfThreads: 5 -########################################################## -######### END - AMBARI MONITOR ########################## -########################################################## \ No newline at end of file diff --git a/src/main/resources/conf/metrics-ambari.xml b/src/main/resources/conf/metrics-ambari.xml deleted file mode 100644 index a7fdc8c..0000000 --- a/src/main/resources/conf/metrics-ambari.xml +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/conf/metrics-resource-manager.xml b/src/main/resources/conf/metrics-resource-manager.xml deleted file mode 100644 index b7a57ca..0000000 --- a/src/main/resources/conf/metrics-resource-manager.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/conf/metrics.xml b/src/main/resources/conf/metrics.xml new file mode 100644 index 0000000..3ec3d46 --- /dev/null +++ b/src/main/resources/conf/metrics.xml @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/conf/monitor.xml b/src/main/resources/conf/monitor.xml index 3c70035..2c7c3f1 100644 --- a/src/main/resources/conf/monitor.xml +++ b/src/main/resources/conf/monitor.xml @@ -21,10 +21,8 @@ - - + hadoop-monitoring-extension.jar diff --git a/src/test/java/com/appdynamics/monitors/hadoop/HadoopMonitorTest.java b/src/test/java/com/appdynamics/monitors/hadoop/HadoopMonitorTest.java index 66ca5a0..c02c277 100644 --- a/src/test/java/com/appdynamics/monitors/hadoop/HadoopMonitorTest.java +++ b/src/test/java/com/appdynamics/monitors/hadoop/HadoopMonitorTest.java @@ -7,12 +7,10 @@ package com.appdynamics.monitors.hadoop; -import com.appdynamics.extensions.conf.MonitorConfiguration; -import com.google.common.collect.Maps; -import org.junit.Assert; +import com.singularity.ee.agent.systemagent.api.exception.TaskExecutionException; import org.junit.Test; -import java.util.Collections; +import java.util.HashMap; import java.util.Map; /** @@ -20,37 +18,14 @@ */ public class HadoopMonitorTest { - @Test(expected = IllegalArgumentException.class) - public void initAmbariConfigWithNoArgs() throws Exception { - new HadoopMonitor().initAmbariConfig(Collections.emptyMap()); - } @Test - public void initAmbariConfigCorrectArgs() throws Exception { - Map taskArgs = Maps.newHashMap(); - taskArgs.put(HadoopMonitor.CONFIG_ARG, "src/main/resources/conf/config.yml"); - taskArgs.put(HadoopMonitor.AMBARI_METRICS_XML_ARG, "src/main/resources/conf/metrics-ambari.xml"); - MonitorConfiguration config = new HadoopMonitor().initAmbariConfig(taskArgs); - Assert.assertNotNull(config.getConfigYml()); - Assert.assertNotNull(config.getMetricsXmlConfiguration()); - Assert.assertEquals("Custom Metrics|HadoopMonitor|Ambari",config.getMetricPrefix()); - Assert.assertTrue(config.isEnabled()); - } - - @Test(expected = IllegalArgumentException.class) - public void initResourceManagerConfigWithNoArgs() throws Exception { - new HadoopMonitor().initResourceManagerConfig(Collections.emptyMap()); + public void hadoopMonitorTest() throws TaskExecutionException { + HadoopMonitor monitor = new HadoopMonitor(); + final Map taskArgs = new HashMap<>(); + taskArgs.put("config-file", "src/main/resources/conf/config.yml"); + taskArgs.put("metric-file", "src/main/resources/conf/metrics.xml"); + monitor.execute(taskArgs,null); } - @Test - public void initResMgrConfigCorrectArgs() throws Exception { - Map taskArgs = Maps.newHashMap(); - taskArgs.put(HadoopMonitor.CONFIG_ARG, "src/main/resources/conf/config.yml"); - taskArgs.put(HadoopMonitor.RM_METRICS_XML_ARG, "src/main/resources/conf/metrics-resource-manager.xml"); - MonitorConfiguration config = new HadoopMonitor().initResourceManagerConfig(taskArgs); - Assert.assertNotNull(config.getConfigYml()); - Assert.assertNotNull(config.getMetricsXmlConfiguration()); - Assert.assertEquals("Custom Metrics|HadoopMonitor|ResourceManager",config.getMetricPrefix()); - Assert.assertTrue(config.isEnabled()); - } } diff --git a/src/test/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTaskTest.java b/src/test/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTaskTest.java index ae2ff3e..4671a0e 100644 --- a/src/test/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTaskTest.java +++ b/src/test/java/com/appdynamics/monitors/hadoop/communicator/AmbariMetricsFetcherTaskTest.java @@ -7,18 +7,14 @@ package com.appdynamics.monitors.hadoop.communicator; -import com.appdynamics.extensions.conf.MonitorConfiguration; -import com.appdynamics.extensions.util.MetricWriteHelper; -import com.appdynamics.extensions.util.MetricWriteHelperFactory; +import com.appdynamics.extensions.AMonitorJob; +import com.appdynamics.extensions.MetricWriteHelper; +import com.appdynamics.extensions.conf.MonitorContextConfiguration; import com.appdynamics.monitors.hadoop.MetricOutput; -import com.appdynamics.monitors.hadoop.SynchronousExecutorService; import com.appdynamics.monitors.hadoop.input.MetricConfig; -import com.singularity.ee.agent.systemagent.api.AManagedMonitor; -import com.singularity.ee.agent.systemagent.api.TaskExecutionContext; -import com.singularity.ee.agent.systemagent.api.TaskOutput; -import com.singularity.ee.agent.systemagent.api.exception.TaskExecutionException; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.appdynamics.monitors.hadoop.input.MetricStats; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -28,23 +24,24 @@ import org.slf4j.LoggerFactory; import javax.xml.bind.JAXBException; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * Created by abey.tom on 11/10/16. */ -public class AmbariMetricsFetcherTaskTest extends AManagedMonitor { +public class AmbariMetricsFetcherTaskTest { public static final Logger logger = LoggerFactory.getLogger(AmbariMetricsFetcherTaskTest.class); - @Test + @Test(timeout=45000) public void readClustersStat() throws JAXBException, InterruptedException, IOException { Runnable runnable = Mockito.mock(Runnable.class); - MetricWriteHelper writer = MetricWriteHelperFactory.create(this); - writer = Mockito.spy(writer); + MetricWriteHelper writer = Mockito.mock(MetricWriteHelper.class); final List expected = MetricOutput.from("/data/ambari-expected-output.txt"); Mockito.doAnswer(new Answer() { public Object answer(InvocationOnMock invocationOnMock) throws Throwable { @@ -59,19 +56,21 @@ public Object answer(InvocationOnMock invocationOnMock) throws Throwable { return null; } }).when(writer).printMetric(Mockito.anyString(), Mockito.any(BigDecimal.class), Mockito.anyString()); - MonitorConfiguration configuration = new MonitorConfiguration("Test", runnable, writer); + MonitorContextConfiguration configuration = new MonitorContextConfiguration("Hadoop Monitor", "Custom Metrics|Hadoop Monitor",Mockito.mock(File.class),Mockito.mock(AMonitorJob.class)); configuration = Mockito.spy(configuration); - Mockito.doReturn(new SynchronousExecutorService()).when(configuration).getExecutorService(); - configuration.setMetricsXml("src/main/resources/conf/metrics-ambari.xml", MetricConfig.class); - configuration.setConfigYml("src/main/resources/conf/config.yml", "ambariMonitor"); + configuration.setMetricXml("src/main/resources/conf/metrics.xml", MetricStats.class); + configuration.setConfigYml("src/test/resources/conf/config.yml"); List> servers = (List>) configuration.getConfigYml().get("servers"); - AmbariMetricsFetcherTask fetcher = createTask(configuration, servers); + Map ambariMonitor = (Map) configuration.getConfigYml().get("ambariMonitor"); + MetricConfig metricConfig = ((MetricStats)configuration.getMetricsXml()).getMetricConfig()[1]; + AmbariMetricsFetcherTask fetcher = createTask(configuration, writer,servers,ambariMonitor,metricConfig); fetcher.run(); + TimeUnit.SECONDS.sleep(40); Assert.assertTrue("It seems that these metrics are not reported " + expected, expected.isEmpty()); } - private AmbariMetricsFetcherTask createTask(MonitorConfiguration configuration, List> servers) { - AmbariMetricsFetcherTask fetcher = new AmbariMetricsFetcherTask(configuration, servers.get(0)); + private AmbariMetricsFetcherTask createTask(MonitorContextConfiguration configuration, MetricWriteHelper metricWriteHelper, List> servers,Map ambariMonitor, MetricConfig metricConfig) { + AmbariMetricsFetcherTask fetcher = new AmbariMetricsFetcherTask(configuration, metricWriteHelper,servers.get(0),ambariMonitor,metricConfig); fetcher = Mockito.spy(fetcher); Mockito.doAnswer(new Answer() { public Object answer(InvocationOnMock invocation) throws Throwable { @@ -122,8 +121,4 @@ public static JsonNode getResourceAsJson(String path) throws IOException { return new ObjectMapper().readTree(in); } - public TaskOutput execute(Map map, TaskExecutionContext taskExecutionContext) throws TaskExecutionException { - return null; - } - } \ No newline at end of file diff --git a/src/test/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTaskTest.java b/src/test/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTaskTest.java index 0cf040a..43dc698 100644 --- a/src/test/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTaskTest.java +++ b/src/test/java/com/appdynamics/monitors/hadoop/communicator/ResourceMgrMetricsFetcherTaskTest.java @@ -7,16 +7,12 @@ package com.appdynamics.monitors.hadoop.communicator; -import com.appdynamics.extensions.conf.MonitorConfiguration; -import com.appdynamics.extensions.util.MetricWriteHelper; -import com.appdynamics.extensions.util.MetricWriteHelperFactory; +import com.appdynamics.extensions.AMonitorJob; +import com.appdynamics.extensions.MetricWriteHelper; +import com.appdynamics.extensions.conf.MonitorContextConfiguration; import com.appdynamics.monitors.hadoop.MetricOutput; -import com.appdynamics.monitors.hadoop.SynchronousExecutorService; import com.appdynamics.monitors.hadoop.input.MetricConfig; -import com.singularity.ee.agent.systemagent.api.AManagedMonitor; -import com.singularity.ee.agent.systemagent.api.TaskExecutionContext; -import com.singularity.ee.agent.systemagent.api.TaskOutput; -import com.singularity.ee.agent.systemagent.api.exception.TaskExecutionException; +import com.appdynamics.monitors.hadoop.input.MetricStats; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -25,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.util.List; @@ -35,14 +32,12 @@ /** * Created by abey.tom on 12/1/16. */ -public class ResourceMgrMetricsFetcherTaskTest extends AManagedMonitor { +public class ResourceMgrMetricsFetcherTaskTest { public static final Logger logger = LoggerFactory.getLogger(ResourceMgrMetricsFetcherTaskTest.class); @Test public void resourceMgrStatsReaderTest() throws IOException { - Runnable runnable = Mockito.mock(Runnable.class); - MetricWriteHelper writer = MetricWriteHelperFactory.create(this); - writer = Mockito.spy(writer); + MetricWriteHelper writer = Mockito.mock(MetricWriteHelper.class); final List expected = MetricOutput.from("/data/resource-manager-expected-output.txt"); Mockito.doAnswer(new Answer() { public Object answer(InvocationOnMock invocationOnMock) throws Throwable { @@ -58,20 +53,21 @@ public Object answer(InvocationOnMock invocationOnMock) throws Throwable { return null; } }).when(writer).printMetric(Mockito.anyString(), Mockito.any(BigDecimal.class), Mockito.anyString()); - MonitorConfiguration configuration = new MonitorConfiguration("Test", runnable, writer); + MonitorContextConfiguration configuration = new MonitorContextConfiguration("Hadoop Monitor","Custom Metrics|Hadoop",Mockito.mock(File.class),Mockito.mock(AMonitorJob.class)); configuration = Mockito.spy(configuration); - Mockito.doReturn(new SynchronousExecutorService()).when(configuration).getExecutorService(); - configuration.setMetricsXml("src/main/resources/conf/metrics-resource-manager.xml", MetricConfig.class); - configuration.setConfigYml("src/main/resources/conf/config.yml", "resourceManagerMonitor"); + configuration.setMetricXml("src/main/resources/conf/metrics.xml", MetricStats.class); + configuration.setConfigYml("src/test/resources/conf/test-config-rm.yml"); List> servers = (List>) configuration.getConfigYml().get("servers"); - Runnable fetcher = createTask(configuration, servers); + Map resourceManagerMonitor = (Map) configuration.getConfigYml().get("resourceManagerMonitor"); + MetricConfig metricConfig = ((MetricStats)configuration.getMetricsXml()).getMetricConfig()[0]; + ResourceMgrMetricsFetcherTask fetcher = createTask(configuration, writer, servers, resourceManagerMonitor,metricConfig); fetcher.run(); Assert.assertTrue("It seems that these metrics are not reported " + expected, expected.isEmpty()); } - private ResourceMgrMetricsFetcherTask createTask(MonitorConfiguration configuration, List> servers) { + private ResourceMgrMetricsFetcherTask createTask(MonitorContextConfiguration configuration, MetricWriteHelper writer,List> servers, Map resourceManagerMonitor, MetricConfig metricConfig) { Map server = servers.get(0); - ResourceMgrMetricsFetcherTask task = new ResourceMgrMetricsFetcherTask(configuration, server); + ResourceMgrMetricsFetcherTask task = new ResourceMgrMetricsFetcherTask(configuration, writer, server, resourceManagerMonitor, metricConfig); task = Mockito.spy(task); Mockito.doAnswer(new Answer() { public Object answer(InvocationOnMock invocation) throws Throwable { @@ -91,8 +87,4 @@ public Object answer(InvocationOnMock invocation) throws Throwable { }).when(task).getResponseAsJson(Mockito.anyString()); return task; } - - public TaskOutput execute(Map map, TaskExecutionContext taskExecutionContext) throws TaskExecutionException { - return null; - } } \ No newline at end of file diff --git a/src/test/resources/conf/config.yml b/src/test/resources/conf/config.yml index 97053d0..fd44fd0 100644 --- a/src/test/resources/conf/config.yml +++ b/src/test/resources/conf/config.yml @@ -1,42 +1,56 @@ -# To enable or diable ResourceManager metrics, set resourceManagerMonitor to "true" or "false" -# The Hadoop version for the cluster you want to monitor using Resource Manager. -# Example: 1.3, 2.2, 0.23 -# RESOURCE MANAGER Web UI CONFIG: Resource Manager is only usable for Hadoop 2.x and Hadoop 0.23.x - -resourceManagerMonitor: true -resourceManagerConfig: - hadoopVersion: "2.3" - host: "localhost" - port: 8088 - username: "" - password: "" - -# application metrics within last X number of minutes to monitor - monitoringTimePeriod: 15 - -# mapReduceJobsToBeMonitored: comma separated jobs to be monitored within time specified by monitoringTimePeriod -# with their state (NEW, NEW_SAVING, SUBMITTED, ACCEPTED, RUNNING, FINISHED, FAILED, KILLED) as integers reported to controller - mapReduceJobsToBeMonitored: ["grep-search","grep-sort"] - -# To enable or diable Ambari metrics, set ambariMonitor to "true" or "false" -# Ambari metrics are only available for clusters inistalled using Ambari, manual installs are not eligible -# ambariConfig: Only configure if 'ambariMonitor' is set to 'true' - -ambariMonitor: false -ambariConfig: - host: "192.168.0.101" - port: 8080 - username: "admin" - password: "admin" - - numberOfThreads: 10 - -# includeClusters: comma-separated cluster names (case sensitive) you want to gather metrics for. If empty, all clusters are reported -# includeHosts: comma-separated host names (case sensitive) you want to gather metrics for. If empty, all hosts are reported -# includeServices: comma-separated service names (case sensitive) you want to gather metrics for. If empty, all services are reported - includeClusters: [] - includeHosts: [] - includeServices: [] - -#prefix used to show up metrics in AppDynamics -metricPathPrefix: "Custom Metrics|HadoopMonitor|" \ No newline at end of file +# Use this only if SIM is enabled +metricPrefix: "Custom Metrics|Hadoop|" + +# If SIM is not enabled, then use this +#metricPrefix: "Server|Component:|Custom Metrics|Hadoop|" + +#Please ensure that appropriate "type" is configured for all servers. "type" can be any of "resourceManagerMonitor" or "ambariMonitor" only. + +servers: + #- uri: "http://localhost:8088" + #username: "admin" + #password: "admin" + #encryptedPassword: "" + # name: "RM Server" + # type: "resourceManagerMonitor" + + - uri: "http://localhost:8088/api/v1" + # username: "admin" + # password: "admin" + # encryptedPassword: "" + name: "Ambari Server" + type: "ambariMonitor" + +#Password Encryption Support. +#encryptionKey: welcome + +connection: + socketTimeout: 20000 + connectTimeout: 20000 + sslCertCheckEnabled: false + sslVerifyHostname: false + + + +#Please do not remove any of the below monitor. Just configure the appropriate applications/filters based on type specified for your server. +resourceManagerMonitor: + # This will monitor the type of applications in the monitoringTimePeriod + # Only the aggregate of State and Finished Status will be reported + applications: + - type: "MAPREDUCE" + names: [".*"] + #In Minutes + monitoringTimePeriod: 480 + + +ambariMonitor: + # Regex expressions are supported in the filters + filters: + clusters: + includes: ['.*'] + hosts: + includes: ['.*'] + services: + includes: ['.*'] + +numberOfThreads: 50 \ No newline at end of file diff --git a/src/test/resources/conf/test-config-rm.yml b/src/test/resources/conf/test-config-rm.yml index f9a440e..325f830 100644 --- a/src/test/resources/conf/test-config-rm.yml +++ b/src/test/resources/conf/test-config-rm.yml @@ -1,33 +1,56 @@ -########################################################## -######### START - ResourceManager Monitor ############### -########################################################## +# Use this only if SIM is enabled +metricPrefix: "Custom Metrics|Hadoop|" + +# If SIM is not enabled, then use this +#metricPrefix: "Server|Component:|Custom Metrics|Hadoop|" + +#Please ensure that appropriate "type" is configured for all servers. "type" can be any of "resourceManagerMonitor" or "ambariMonitor" only. + +servers: + - uri: "http://localhost:8088" + #username: "admin" + #password: "admin" + #encryptedPassword: "" + name: "RM Server 1" + type: "resourceManagerMonitor" + + #- uri: "http://localhost:8088/api/v1" + # username: "admin" + # password: "admin" + # encryptedPassword: "" + # name: "Ambari Server" + # type: "ambariMonitor" + +#Password Encryption Support. +#encryptionKey: welcome + +connection: + socketTimeout: 20000 + connectTimeout: 20000 + sslCertCheckEnabled: false + sslVerifyHostname: false + + + +#Please do not remove any of the below monitor. Just configure the appropriate applications/filters based on type specified for your server. resourceManagerMonitor: - enabled: true - metricPrefix: "Custom Metrics|HadoopMonitor" - servers: - - uri: "http://192.168.1.216:8088" - #username: "admin" - #password: "admin" - #name: "" #Required only if there are multiple servers - - monitoringTimePeriod: 15 # This will monitor the type of applications in the monitoringTimePeriod + # Only the aggregate of State and Finished Status will be reported applications: - type: "MAPREDUCE" names: [".*"] + #In Minutes + monitoringTimePeriod: 480 + + +ambariMonitor: + # Regex expressions are supported in the filters + filters: + clusters: + includes: ['.*'] + hosts: + includes: ['.*'] + services: + includes: ['.*'] - numberOfThreads: 1 - connection: - socketTimeout: 5000 - connectTimeout: 2500 - sslCertCheckEnabled: false - sslVerifyHostname: false - #Run it as a scheduled task instead of running every minute. - #If you want to run this every minute, comment this out - #taskSchedule: - #numberOfThreads: 1 - #taskDelaySeconds: 120 - -########################################################## -######### END - ResourceManager Monitor ############### -########################################################## \ No newline at end of file +numberOfThreads: 5 \ No newline at end of file diff --git a/src/test/resources/data/ambari-expected-output.txt b/src/test/resources/data/ambari-expected-output.txt index 60562fb..c3be11d 100644 --- a/src/test/resources/data/ambari-expected-output.txt +++ b/src/test/resources/data/ambari-expected-output.txt @@ -1,153 +1,153 @@ -Custom Metrics|HadoopMonitor|Ambari|Cluster Total Hosts,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|State|Healthy,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|State|Unhealthy,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|State|Heartbeat Lost,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|State|Init,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|Status|Healthy,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|Status|Unhealthy,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|Status|Unknown,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Cluster Health|Status|Alert,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|CPU|Count,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|CPU|Idle %,75,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|CPU|System %,2,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|CPU|User %,20,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|CPU|Nice %,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Disks|Free (GB),86,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Disks|Total (GB),96,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Memory|Cached MB,873,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Memory|Free MB,386,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Memory|Shared MB,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Memory|Total MB,8012,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Memory|Swap Free MB,4005,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Processes|Running,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Processes|Total,170,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|Idle %,77,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|System %,2,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|User %,16,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|Nice %,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Heap Committed MB,1004,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Heap Usage MB,262,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Non-Heap Committed MB,59,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Non-Heap Usage MB,57,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|GC|Count,54,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|GC|Time (ms),4144,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Blocked,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|New,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Runnable,14,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Terminated,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Timed Waiting,22,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Waiting,12,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Cached MB,1062,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Free MB,178,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Shared MB,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Total MB,8012,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Swap Free MB,4006,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Processes|Running,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Processes|Total,172,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|averageLoad,3,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|numDeadRegionServers,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|numRegionServers,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|masterStartTime,1473367166497,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Heap Committed MB,1004,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Heap Usage MB,29,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Non-Heap Committed MB,70,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Non-Heap Usage MB,69,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|GC|Count,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|GC|Time (ms),0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Blocked,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|New,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Runnable,20,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Terminated,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Timed Waiting,23,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Waiting,80,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|AllocatedContainers,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|AllocatedGB,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|AllocatedVCores,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|BadLocalDirs,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|BadLogDirs,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|ContainersFailed,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|GoodLocalDirsDiskUtilizationPerc,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|GoodLogDirsDiskUtilizationPerc,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|AllocatedGB,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|AvailableGB,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|AllocatedVCores,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|BadLocalDirs,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|BadLogDirs,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainerLaunchDurationAvgTime,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainerLaunchDurationNumOps,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersFailed,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersCompleted,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersIniting,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersKilled,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersLaunched,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersRunning,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|GoodLocalDirsDiskUtilizationPerc,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|GoodLogDirsDiskUtilizationPerc,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Heap Committed MB,120,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Heap Usage MB,38,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Non-Heap Committed MB,68,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Non-Heap Usage MB,66,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|GC|Count,328,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|GC|Time (ms),1391,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Blocked,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|New,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Runnable,14,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Terminated,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Timed Waiting,38,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Waiting,8,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|Idle %,92,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|System %,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|User %,7,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|Nice %,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Disks|Free (GB),86,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Disks|Total (GB),96,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Cached MB,904,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Free MB,347,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Shared MB,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Total MB,8012,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Swap Free MB,4005,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Processes|Running,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Processes|Total,170,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|AMBARI_METRICS|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|AMBARI_METRICS|Alerts|CRITICAL,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|AMBARI_METRICS|Alerts|MAINTENANCE,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|AMBARI_METRICS|Alerts|OK,6,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|AMBARI_METRICS|Alerts|UNKNOWN,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|AMBARI_METRICS|Alerts|WARNING,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Alerts|CRITICAL,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Alerts|MAINTENANCE,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Alerts|OK,5,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Alerts|UNKNOWN,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Alerts|WARNING,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_CLIENT|state,12,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_CLIENT|installed_count,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_CLIENT|started_count,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|state,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|installed_count,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|started_count,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|AverageLoad,3,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|HeapMemoryMax,1065,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|HeapMemoryUsed,63,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|NonHeapMemoryUsed,74,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HDFS|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HDFS|Alerts|CRITICAL,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HDFS|Alerts|MAINTENANCE,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HDFS|Alerts|OK,17,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HDFS|Alerts|UNKNOWN,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|HDFS|Alerts|WARNING,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Alerts|CRITICAL,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Alerts|MAINTENANCE,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Alerts|OK,2,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Alerts|UNKNOWN,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Alerts|WARNING,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_CLIENT|state,12,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_CLIENT|installed_count,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_CLIENT|started_count,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_SERVER|state,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_SERVER|installed_count,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|Ambari|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_SERVER|started_count,1,AVG.AVG.COL \ No newline at end of file +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Total Hosts,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|State|Healthy,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|State|Unhealthy,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|State|Heartbeat Lost,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|State|Init,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|Status|Healthy,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|Status|Unhealthy,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|Status|Unknown,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Cluster Health|Status|Alert,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|CPU|Count,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|CPU|Idle %,75,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|CPU|System %,2,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|CPU|User %,20,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|CPU|Nice %,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Disks|Free (GB),86,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Disks|Total (GB),96,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Memory|Cached MB,873,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Memory|Free MB,386,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Memory|Shared MB,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Memory|Total MB,8012,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Memory|Swap Free MB,4005,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Processes|Running,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Processes|Total,170,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|Idle %,77,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|System %,2,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|User %,16,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|CPU|Nice %,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Heap Committed MB,1004,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Heap Usage MB,262,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Non-Heap Committed MB,59,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Memory|Non-Heap Usage MB,57,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|GC|Count,54,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|GC|Time (ms),4144,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Blocked,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|New,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Runnable,14,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Terminated,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Timed Waiting,22,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|JVM|Threads|Waiting,12,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Cached MB,1062,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Free MB,178,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Shared MB,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Total MB,8012,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Memory|Swap Free MB,4006,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Processes|Running,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|DATANODE|Processes|Total,172,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|averageLoad,3,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|numDeadRegionServers,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|numRegionServers,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|Server|masterStartTime,1473367166497,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Heap Committed MB,1004,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Heap Usage MB,29,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Non-Heap Committed MB,70,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Memory|Non-Heap Usage MB,69,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|GC|Count,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|GC|Time (ms),0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Blocked,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|New,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Runnable,20,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Terminated,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Timed Waiting,23,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|HBASE_MASTER|JVM|Threads|Waiting,80,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|AllocatedContainers,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|AllocatedGB,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|AllocatedVCores,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|BadLocalDirs,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|BadLogDirs,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|ContainersFailed,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|GoodLocalDirsDiskUtilizationPerc,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|NodeManager|GoodLogDirsDiskUtilizationPerc,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|AllocatedGB,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|AvailableGB,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|AllocatedVCores,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|BadLocalDirs,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|BadLogDirs,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainerLaunchDurationAvgTime,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainerLaunchDurationNumOps,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersFailed,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersCompleted,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersIniting,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersKilled,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersLaunched,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|ContainersRunning,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|GoodLocalDirsDiskUtilizationPerc,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Yarn|GoodLogDirsDiskUtilizationPerc,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Heap Committed MB,120,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Heap Usage MB,38,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Non-Heap Committed MB,68,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Memory|Non-Heap Usage MB,66,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|GC|Count,328,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|GC|Time (ms),1391,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Blocked,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|New,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Runnable,14,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Terminated,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Timed Waiting,38,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|JVM|Threads|Waiting,8,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|Idle %,92,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|System %,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|User %,7,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|CPU|Nice %,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Disks|Free (GB),86,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Disks|Total (GB),96,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Cached MB,904,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Free MB,347,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Shared MB,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Total MB,8012,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Memory|Swap Free MB,4005,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Processes|Running,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Hosts|localhost.localdomain|Components|NODEMANAGER|Processes|Total,170,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|AMBARI_METRICS|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|AMBARI_METRICS|Alerts|CRITICAL,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|AMBARI_METRICS|Alerts|MAINTENANCE,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|AMBARI_METRICS|Alerts|OK,6,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|AMBARI_METRICS|Alerts|UNKNOWN,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|AMBARI_METRICS|Alerts|WARNING,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Alerts|CRITICAL,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Alerts|MAINTENANCE,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Alerts|OK,5,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Alerts|UNKNOWN,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Alerts|WARNING,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_CLIENT|state,12,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_CLIENT|installed_count,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_CLIENT|started_count,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|state,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|installed_count,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|started_count,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|AverageLoad,3,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|HeapMemoryMax,1065,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|HeapMemoryUsed,63,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HBASE|Components|HBASE_MASTER|NonHeapMemoryUsed,74,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HDFS|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HDFS|Alerts|CRITICAL,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HDFS|Alerts|MAINTENANCE,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HDFS|Alerts|OK,17,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HDFS|Alerts|UNKNOWN,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|HDFS|Alerts|WARNING,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Alerts|CRITICAL,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Alerts|MAINTENANCE,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Alerts|OK,2,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Alerts|UNKNOWN,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Alerts|WARNING,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_CLIENT|state,12,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_CLIENT|installed_count,1,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_CLIENT|started_count,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_SERVER|state,100,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_SERVER|installed_count,0,AVG.AVG.COL +Custom Metrics|Hadoop|ambariMonitor|Ambari Server|Clusters|extensions|Services|ZOOKEEPER|Components|ZOOKEEPER_SERVER|started_count,1,AVG.AVG.COL \ No newline at end of file diff --git a/src/test/resources/data/resource-manager-expected-output.txt b/src/test/resources/data/resource-manager-expected-output.txt index 51b0d8d..d2a0a80 100644 --- a/src/test/resources/data/resource-manager-expected-output.txt +++ b/src/test/resources/data/resource-manager-expected-output.txt @@ -1,59 +1,59 @@ -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Apps|Submitted,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Apps|Completed,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Apps|Pending,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Apps|Running,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Apps|Failed,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Apps|Killed,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Memory|Reserved (MB),0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Memory|Available (MB),8192,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Memory|Allocated (MB),0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Memory|Total (MB),8192,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|VirtualCores|Reserved,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|VirtualCores|Available,8,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|VirtualCores|Allocated,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|VirtualCores|Total,8,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Containers|Allocated,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Containers|Reserved,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Containers|Pending,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Nodes|Total,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Nodes|Lost,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Nodes|Unhealthy,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Nodes|Decommissioned,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Nodes|Rebooted,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Cluster|Nodes|Active,1,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Nodes|quickstart.cloudera|State,100,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Nodes|quickstart.cloudera|Num of Containers,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Nodes|quickstart.cloudera|Memory Used (MB),0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Nodes|quickstart.cloudera|Memory Available (MB),8192,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Nodes|quickstart.cloudera|Virtual Cores Used,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Nodes|quickstart.cloudera|Virtual Cores Available,8,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Memory|Max,8192,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Memory|Min,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Memory|Used,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Virtual Cores|Max,8,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Virtual Cores|Min,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Virtual Cores|Used,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.default|Memory|Max,8192,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.default|Memory|Min,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.default|Memory|Used,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.default|Virtual Cores|Max,8,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.default|Virtual Cores|Min,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.default|Virtual Cores|Used,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.hdfs|Memory|Max,8192,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.hdfs|Memory|Min,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.hdfs|Memory|Used,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.hdfs|Virtual Cores|Max,8,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.hdfs|Virtual Cores|Min,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Fair Scheduler|Queues|root|Queues|root.hdfs|Virtual Cores|Used,0,AVG.AVG.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|Final Status|UNDEFINED,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|Final Status|SUCCEEDED,6,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|Final Status|FAILED,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|Final Status|KILLED,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|NEW,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|NEW_SAVING,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|SUBMITTED,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|ACCEPTED,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|RUNNING,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|FINISHED,6,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|FAILED,0,OBS.CUR.COL -Custom Metrics|HadoopMonitor|ResourceManager|Current Apps|MAPREDUCE|State|KILLED,0,OBS.CUR.COL \ No newline at end of file +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Apps|Submitted,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Apps|Completed,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Apps|Pending,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Apps|Running,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Apps|Failed,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Apps|Killed,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Memory|Reserved (MB),0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Memory|Available (MB),8192,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Memory|Allocated (MB),0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Memory|Total (MB),8192,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|VirtualCores|Reserved,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|VirtualCores|Available,8,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|VirtualCores|Allocated,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|VirtualCores|Total,8,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Containers|Allocated,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Containers|Reserved,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Containers|Pending,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Nodes|Total,1,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Nodes|Lost,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Nodes|Unhealthy,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Nodes|Decommissioned,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Nodes|Rebooted,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Cluster|Nodes|Active,1,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Nodes|quickstart.cloudera|State,100,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Nodes|quickstart.cloudera|Num of Containers,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Nodes|quickstart.cloudera|Memory Used (MB),0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Nodes|quickstart.cloudera|Memory Available (MB),8192,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Nodes|quickstart.cloudera|Virtual Cores Used,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Nodes|quickstart.cloudera|Virtual Cores Available,8,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Memory|Max,8192,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Memory|Min,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Memory|Used,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Virtual Cores|Max,8,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Virtual Cores|Min,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Virtual Cores|Used,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.default|Memory|Max,8192,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.default|Memory|Min,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.default|Memory|Used,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.default|Virtual Cores|Max,8,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.default|Virtual Cores|Min,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.default|Virtual Cores|Used,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.hdfs|Memory|Max,8192,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.hdfs|Memory|Min,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.hdfs|Memory|Used,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.hdfs|Virtual Cores|Max,8,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.hdfs|Virtual Cores|Min,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Fair Scheduler|Queues|root|Queues|root.hdfs|Virtual Cores|Used,0,AVG.AVG.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|Final Status|UNDEFINED,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|Final Status|SUCCEEDED,6,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|Final Status|FAILED,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|Final Status|KILLED,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|NEW,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|NEW_SAVING,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|SUBMITTED,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|ACCEPTED,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|RUNNING,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|FINISHED,6,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|FAILED,0,OBS.CUR.COL +Custom Metrics|Hadoop|resourceManagerMonitor|RM Server 1|Current Apps|MAPREDUCE|State|KILLED,0,OBS.CUR.COL \ No newline at end of file