Browse Source

AMBARI-9034. Add ability to change log and pid dirs for AMS daemons. (swagle)

Siddharth Wagle 10 years ago
parent
commit
e904eb7fa1

+ 18 - 0
ambari-metrics/ambari-metrics-host-monitoring/conf/unix/ambari-metrics-monitor

@@ -102,6 +102,24 @@ while [[ -z "${_ams_configs_done}" ]]; do
   esac
 done
 
+#execute ams-env.sh
+if [[ -f "${MONITOR_CONF_DIR}/ams-env.sh" ]]; then
+  . "${MONITOR_CONF_DIR}/ams-env.sh"
+else
+  echo "ERROR: Cannot execute ${MONITOR_CONF_DIR}/ams-env.sh." 2>&1
+  exit 1
+fi
+
+# Set log directory path
+if [[ -n "${AMS_MONITOR_LOG_DIR}" ]]; then
+  OUTFILE=${AMS_MONITOR_LOG_DIR}/ambari-metrics-monitor.out
+fi
+
+# Set pid directory path
+if [[ -n "${AMS_MONITOR_PID_DIR}" ]]; then
+  PIDFILE=${AMS_MONITOR_PID_DIR}/ambari-metrics-monitor.pid
+fi
+
 case "$1" in
 
   start)

+ 14 - 2
ambari-metrics/ambari-metrics-timelineservice/conf/unix/ambari-metrics-collector

@@ -31,6 +31,8 @@ HBASE_CONF_DIR=/etc/ams-hbase/conf
 
 METRIC_COLLECTOR=ambari-metrics-collector
 
+AMS_LOG_DIR=/var/log/ambari-metrics-collector
+
 STOP_TIMEOUT=5
 
 function hbase_daemon
@@ -160,7 +162,7 @@ while [[ -z "${_ams_configs_done}" ]]; do
   esac
 done
 
-#execute ams-env.sh
+# execute ams-env.sh
 if [[ -f "${COLLECTOR_CONF_DIR}/ams-env.sh" ]]; then
   . "${COLLECTOR_CONF_DIR}/ams-env.sh"
 else
@@ -168,6 +170,16 @@ else
   exit 1
 fi
 
+# set pid dir path
+if [[ -n "${AMS_PID_DIR}" ]]; then
+  PIDFILE=${AMS_PID_DIR}/ambari-metrics-collector.pid
+fi
+
+# set out file path
+if [[ -n "${AMS_COLLECTOR_LOG_DIR}" ]]; then
+  OUTFILE=${AMS_COLLECTOR_LOG_DIR}/ambari-metrics-collector.out
+fi
+
 #TODO manage 3 hbase daemons for start/stop/status
 case "$1" in
 
@@ -200,7 +212,7 @@ case "$1" in
         rm -f "${PIDFILE}" >/dev/null 2>&1
     fi
 
-    nohup "${JAVA}" "-cp" "/usr/lib/ambari-metrics-collector/*:${COLLECTOR_CONF_DIR}" "-Djava.net.preferIPv4Stack=true" "-Dproc_${DAEMON_NAME}" "${CLASS}" "$@" > $OUTFILE 2>&1 &
+    nohup "${JAVA}" "-cp" "/usr/lib/ambari-metrics-collector/*:${COLLECTOR_CONF_DIR}" "-Djava.net.preferIPv4Stack=true" "-Dams.log.dir=${AMS_COLLECTOR_LOG_DIR}" "-Dproc_${DAEMON_NAME}" "${CLASS}" "$@" > $OUTFILE 2>&1 &
     PID=$!
     write_pidfile "${PIDFILE}"
     sleep 2

+ 31 - 1
ambari-server/src/main/resources/common-services/AMS/0.1.0/configuration/ams-env.xml

@@ -25,6 +25,26 @@
     <property-type>USER</property-type>
     <description>AMS User Name.</description>
   </property>
+  <property>
+    <name>ams_collector_log_dir</name>
+    <value>/var/log/ambari-metrics-collector</value>
+    <description>Collector log directory.</description>
+  </property>
+  <property>
+    <name>ams_collector_pid_dir</name>
+    <value>/var/run/ambari-metrics-collector</value>
+    <description>Collector pid directory.</description>
+  </property>
+  <property>
+    <name>ams_monitor_pid_dir</name>
+    <value>/var/run/ambari-metrics-monitor</value>
+    <description>Monitor pid directory.</description>
+  </property>
+  <property>
+    <name>ams_monitor_log_dir</name>
+    <value>/var/log/ambari-metrics-monitor</value>
+    <description>Monitor log directory.</description>
+  </property>
 
   <property>
     <name>content</name>
@@ -34,7 +54,17 @@
       # The java implementation to use. Java 1.6 required.
       export JAVA_HOME={{java64_home}}
 
-      #TODO
+      # Collector Log directory for log4j
+      export AMS_COLLECTOR_LOG_DIR={{ams_collector_log_dir}}
+
+      # Monitor Log directory for outfile
+      export AMS_MONITOR_LOG_DIR={{ams_monitor_log_dir}}
+
+      # Collector pid directory
+      export AMS_COLLECTOR_PID_DIR={{ams_collector_pid_dir}}
+
+      # Monitor pid directory
+      export AMS_MONITOR_PID_DIR={{ams_monitor_pid_dir}}
     </value>
   </property>
 

+ 2 - 2
ambari-server/src/main/resources/common-services/AMS/0.1.0/configuration/ams-hbase-env.xml

@@ -23,12 +23,12 @@
 <configuration>
   <property>
     <name>hbase_log_dir</name>
-    <value>/var/log/ams-hbase/</value>
+    <value>/var/log/ambari-metrics-collector</value>
     <description>Log Directories for HBase.</description>
   </property>
   <property>
     <name>hbase_pid_dir</name>
-    <value>/var/run/ams-hbase/</value>
+    <value>/var/run/ambari-metrics-collector/</value>
     <description>Pid Directory for HBase.</description>
   </property>
   <property>

+ 4 - 1
ambari-server/src/main/resources/common-services/AMS/0.1.0/configuration/ams-log4j.xml

@@ -43,12 +43,15 @@
       #
 
       # Define some default values that can be overridden by system properties
+      ams.log.dir=.
+      ams.log.file=ambari-metrics-collector.log
+
       # Root logger option
       log4j.rootLogger=INFO,file
 
       # Direct log messages to a log file
       log4j.appender.file=org.apache.log4j.RollingFileAppender
-      log4j.appender.file.File=/var/log/ambari-metrics-collector/ambari-metrics-collector.log
+      log4j.appender.file.File=${ams.log.dir}/${ams.log.file}
       log4j.appender.file.MaxFileSize=80MB
       log4j.appender.file.MaxBackupIndex=60
       log4j.appender.file.layout=org.apache.log4j.PatternLayout

+ 17 - 0
ambari-server/src/main/resources/common-services/AMS/0.1.0/package/scripts/ams.py

@@ -66,6 +66,18 @@ def ams(name=None):
          content=InlineTemplate(params.ams_env_sh_template)
     )
 
+    Directory(params.ams_collector_log_dir,
+              owner=params.ams_user,
+              group=params.user_group,
+              recursive=True
+    )
+
+    Directory(params.ams_collector_pid_dir,
+              owner=params.ams_user,
+              group=params.user_group,
+              recursive=True
+    )
+
     pass
 
   elif name == 'monitor':
@@ -89,6 +101,11 @@ def ams(name=None):
       template_tag=None
     )
 
+    File(format("{ams_monitor_conf_dir}/ams-env.sh"),
+         owner=params.ams_user,
+         content=InlineTemplate(params.ams_env_sh_template)
+    )
+
     # TODO
     pass
 

+ 0 - 3
ambari-server/src/main/resources/common-services/AMS/0.1.0/package/scripts/ams_service.py

@@ -66,7 +66,4 @@ def ams_service(name='collector', action='start'):
 
       pass
     pass
-
-    #TODO
-    pass
   pass

+ 21 - 25
ambari-server/src/main/resources/common-services/AMS/0.1.0/package/scripts/params.py

@@ -27,8 +27,8 @@ config = Script.get_config()
 exec_tmp_dir = Script.get_tmp_dir()
 
 #AMS data
-ams_user=status_params.ams_user
-ams_pid_dir="/var/run/ambari-metrics"
+ams_user = status_params.ams_user
+ams_pid_dir = status_params.ams_collector_pid_dir
 
 ams_collector_script = "/usr/sbin/ambari-metrics-collector"
 ams_collector_conf_dir = "/etc/ambari-metrics-collector/conf"
@@ -40,6 +40,8 @@ if metric_collector_port and metric_collector_port.find(':') != -1:
   metric_collector_port = metric_collector_port.split(':')[1]
 pass
 
+ams_collector_log_dir = config['configurations']['ams-env']['ams_collector_log_dir']
+ams_monitor_log_dir = config['configurations']['ams-env']['ams_monitor_log_dir']
 
 ams_monitor_conf_dir = "/etc/ambari-metrics-monitor/conf/"
 ams_monitor_dir = "/usr/lib/python2.6/site-packages/resource_monitoring"
@@ -79,8 +81,11 @@ hbase_included_hosts = config['commandParams']['included_hosts']
 
 hbase_user = status_params.hbase_user
 smokeuser = config['configurations']['cluster-env']['smokeuser']
-_authentication = config['configurations']['core-site']['hadoop.security.authentication']
-security_enabled = config['configurations']['cluster-env']['security_enabled']
+hbase_hdfs_root_dir = config['configurations']['ams-hbase-site']['hbase.rootdir']
+is_hbase_distributed = hbase_hdfs_root_dir.startswith('hdfs://')
+
+# security is disabled for embedded mode, when HBase is backed by file
+security_enabled = False if not is_hbase_distributed else config['configurations']['cluster-env']['security_enabled'] 
 
 # this is "hadoop-metrics.properties" for 1.x stacks
 metric_prop_file_name = "hadoop-metrics2-hbase.properties"
@@ -109,15 +114,6 @@ client_jaas_config_file = format("{hbase_conf_dir}/hbase_client_jaas.conf")
 master_jaas_config_file = format("{hbase_conf_dir}/hbase_master_jaas.conf")
 regionserver_jaas_config_file = format("{hbase_conf_dir}/hbase_regionserver_jaas.conf")
 
-# ganglia_server_hosts = default('/clusterHostInfo/ganglia_server_host', []) # is not passed when ganglia is not present
-# ganglia_server_host = '' if len(ganglia_server_hosts) == 0 else ganglia_server_hosts[0]
-
-# if hbase is selected the hbase_rs_hosts, should not be empty, but still default just in case
-# if 'slave_hosts' in config['clusterHostInfo']:
-#   rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/slave_hosts') #if hbase_rs_hosts not given it is assumed that region servers on same nodes as slaves
-# else:
-#   rs_hosts = default('/clusterHostInfo/hbase_rs_hosts', '/clusterHostInfo/all_hosts')
-
 rs_hosts = ["localhost"]
 
 smoke_test_user = config['configurations']['cluster-env']['smokeuser']
@@ -127,19 +123,19 @@ user_group = config['configurations']['cluster-env']["user_group"]
 
 if security_enabled:
   _hostname_lowercase = config['hostname'].lower()
-  master_jaas_princ = config['configurations']['ams-hbase-site']['hbase.master.kerberos.principal'].replace('_HOST',_hostname_lowercase)
-  regionserver_jaas_princ = config['configurations']['ams-hbase-site']['hbase.regionserver.kerberos.principal'].replace('_HOST',_hostname_lowercase)
+  master_jaas_princ = default('/configurations/ams-hbase-site/hbase.master.kerberos.principal', 'hbase/_HOST@EXAMPLE.COM').replace('_HOST',_hostname_lowercase)
+  regionserver_jaas_princ = default('/configurations/ams-hbase-site/hbase.regionserver.kerberos.principal', 'hbase/_HOST@EXAMPLE.COM').replace('_HOST',_hostname_lowercase)
 
-master_keytab_path = config['configurations']['ams-hbase-site']['hbase.master.keytab.file']
-regionserver_keytab_path = config['configurations']['ams-hbase-site']['hbase.regionserver.keytab.file']
-smoke_user_keytab = config['configurations']['cluster-env']['smokeuser_keytab']
-hbase_user_keytab = config['configurations']['ams-hbase-env']['hbase_user_keytab']
-kinit_path_local = functions.get_kinit_path(["/usr/bin", "/usr/kerberos/bin", "/usr/sbin"])
+  master_keytab_path = config['configurations']['ams-hbase-site']['hbase.master.keytab.file']
+  regionserver_keytab_path = config['configurations']['ams-hbase-site']['hbase.regionserver.keytab.file']
+  smoke_user_keytab = config['configurations']['cluster-env']['smokeuser_keytab']
+  hbase_user_keytab = config['configurations']['ams-hbase-env']['hbase_user_keytab']
+  kinit_path_local = functions.get_kinit_path(["/usr/bin", "/usr/kerberos/bin", "/usr/sbin"])
 
-# if security_enabled:
-#   kinit_cmd = format("{kinit_path_local} -kt {hbase_user_keytab} {hbase_user};")
-# else:
-#   kinit_cmd = ""
+if security_enabled:
+   kinit_cmd = format("{kinit_path_local} -kt {hbase_user_keytab} {hbase_user};")
+else:
+   kinit_cmd = ""
 
 #log4j.properties
 if (('ams-hbase-log4j' in config['configurations']) and ('content' in config['configurations']['ams-hbase-log4j'])):
@@ -155,7 +151,7 @@ else:
 hbase_env_sh_template = config['configurations']['ams-hbase-env']['content']
 ams_env_sh_template = config['configurations']['ams-env']['content']
 
-hbase_hdfs_root_dir = config['configurations']['ams-hbase-site']['hbase.rootdir']
+
 hbase_staging_dir = "/apps/hbase/staging"
 #for create_hdfs_directory
 hostname = config["hostname"]

+ 2 - 2
ambari-server/src/main/resources/common-services/AMS/0.1.0/package/scripts/status_params.py

@@ -25,6 +25,6 @@ config = Script.get_config()
 hbase_pid_dir = config['configurations']['ams-hbase-env']['hbase_pid_dir']
 hbase_user = config['configurations']['ams-hbase-env']['hbase_user']
 ams_user = config['configurations']['ams-env']['ams_user']
+ams_collector_pid_dir = config['configurations']['ams-env']['ams_collector_pid_dir']
+ams_monitor_pid_dir = config['configurations']['ams-env']['ams_monitor_pid_dir']
 
-ams_monitor_pid_dir = "/var/run/ambari-metrics-monitor"
-ams_collector_pid_dir = "/var/run/ambari-metrics-collector"

+ 19 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/stack_advisor.py

@@ -278,6 +278,25 @@ class HDP206StackAdvisor(DefaultStackAdvisor):
       return self.getWarnItem("Value is less than the recommended default of {0}".format(defaultValue))
     return None
 
+  def validatorEqualsPropertyItem(self, properties1, propertyName1,
+                                  properties2, propertyName2,
+                                  emptyAllowed=False):
+    if not propertyName1 in properties1:
+      return self.getErrorItem("Value should be set for %s" % propertyName1)
+    if not propertyName2 in properties2:
+      return self.getErrorItem("Value should be set for %s" % propertyName2)
+    value1 = properties1.get(propertyName1)
+    if value1 is None and not emptyAllowed:
+      return self.getErrorItem("Empty value for %s" % propertyName1)
+    value2 = properties2.get(propertyName2)
+    if value2 is None and not emptyAllowed:
+      return self.getErrorItem("Empty value for %s" % propertyName2)
+    if value1 != value2:
+      return self.getWarnItem("It is recommended to set equal values "
+             "for properties {0} and {1}".format(propertyName1, propertyName2))
+
+    return None
+
   def validateXmxValue(self, properties, recommendedDefaults, propertyName):
     if not propertyName in properties:
       return self.getErrorItem("Value should be set")

+ 6 - 1
ambari-server/src/main/resources/stacks/HDP/2.2/services/stack_advisor.py

@@ -143,6 +143,9 @@ class HDP22StackAdvisor(HDP21StackAdvisor):
   def validateAmsHbaseEnvConfigurations(self, properties, recommendedDefaults, configurations, services, hosts):
     regionServerItem = self.validatorLessThenDefaultValue(properties, recommendedDefaults, "hbase_regionserver_heapsize")
     masterItem = self.validatorLessThenDefaultValue(properties, recommendedDefaults, "hbase_master_heapsize")
+    ams_env = getSiteProperties(configurations, "ams-env")
+    logDirItem = self.validatorEqualsPropertyItem(properties, "hbase_log_dir",
+                                                  ams_env, "ams_collector_log_dir")
 
     if masterItem is None:
       hbase_master_heapsize = formatXmxSizeToBytes(properties["hbase_master_heapsize"])
@@ -165,7 +168,9 @@ class HDP22StackAdvisor(HDP21StackAdvisor):
               break
 
     validationItems = [{"config-name": "hbase_regionserver_heapsize", "item": regionServerItem},
-                       {"config-name": "hbase_master_heapsize", "item": masterItem}]
+                       {"config-name": "hbase_master_heapsize", "item": masterItem},
+                       {"config-name": "hbase_log_dir", "item": logDirItem}
+    ]
     return self.toConfigurationValidationProblems(validationItems, "ams-hbase-env")
 
   def recommendMapReduce2Configurations(self, configurations, clusterData, services, hosts):

+ 104 - 38
ambari-web/app/data/HDP2/site_properties.js

@@ -4242,200 +4242,266 @@ module.exports =
     {
       "id": "site property",
       "name": "timeline.metrics.service.operation.mode",
-      "displayName": "timeline.metrics.service.operation.mode",
+      "displayName": "Metrics Service operation mode",
       "description":  "\n      Service Operation modes:\n      1) embedded: Metrics stored on local FS, HBase in Standalone mode\n      2) distributed: HBase daemons writing to HDFS\n      3) external: External HBase storage backend\n    ",
       "defaultValue": "embedded",
       "displayType": "string",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "General"
+      "category": "General",
+      "index" : 1
+    },
+    {
+      "id": "site property",
+      "name": "ams_collector_log_dir",
+      "displayName": "Metrics Collector log dir",
+      "description":  "\n      Log location for collector logs\n    ",
+      "defaultValue": "embedded",
+      "displayType": "string",
+      "serviceName": "AMS",
+      "filename": "ams-env.xml",
+      "category": "General",
+      "index" : 2
+    },
+    {
+      "id": "site property",
+      "name": "ams_collector_pid_dir",
+      "displayName": "Metrics Collector pid dir",
+      "description":  "\n      pid location for collector\n    ",
+      "defaultValue": "embedded",
+      "displayType": "string",
+      "serviceName": "AMS",
+      "filename": "ams-env.xml",
+      "category": "General",
+      "index" : 3
+    },
+    {
+      "id": "site property",
+      "name": "ams_monitor_log_dir",
+      "displayName": "Metrics Monitor log dir",
+      "description":  "\n      Log location for monitor logs\n    ",
+      "defaultValue": "embedded",
+      "displayType": "string",
+      "serviceName": "AMS",
+      "filename": "ams-env.xml",
+      "category": "General",
+      "index" : 4
+    },
+    {
+      "id": "site property",
+      "name": "ams_monitor_pid_dir",
+      "displayName": "Metrics Monitor pid dir",
+      "description":  "\n      pid location for monitor\n    ",
+      "defaultValue": "embedded",
+      "displayType": "string",
+      "serviceName": "AMS",
+      "filename": "ams-env.xml",
+      "category": "General",
+      "index" : 5
     },
     {
       "id": "site property",
       "name" : "timeline.metrics.aggregator.checkpoint.dir",
-      "displayName": "timeline.metrics.aggregator.checkpoint.dir",
-      "description":  "\n      Directory to store aggregator checkpoints. Change to a permanent\n      location so that checkpoint ar not lost.\n    ",
+      "displayName": "Aggregator checkpoint directory",
+      "description":  "\n      Directory to store aggregator checkpoints\n    ",
       "defaultValue": "/tmp",
       "displayType": "directory",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 17
     },
     {
       "id": "site property",
       "name": "timeline.metrics.cluster.aggregator.hourly.checkpointCutOffMultiplier",
-      "displayName": "timeline.metrics.cluster.aggregator.hourly.checkpointCutOffMultiplier",
+      "displayName": "Hourly cluster aggregator checkpoint cutOff multiplier",
       "description":  "\n      Multiplier value * interval = Max allowed checkpoint lag. Effectively\n      if aggregator checkpoint is greater than max allowed checkpoint delay,\n      the checkpoint will be discarded by the aggregator.\n    ",
       "defaultValue": "2",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 16
     },
     {
       "id": "site property",
       "name": "timeline.metrics.cluster.aggregator.hourly.disabled",
-      "displayName": "timeline.metrics.cluster.aggregator.hourly.disabled",
+      "displayName": "Disable Hourly cluster aggregator",
       "description":  "\n      Disable cluster based hourly aggregations.\n    ",
       "defaultValue": "false",
       "displayType": "string",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 14
     },
     {
       "id": "site property",
       "name": "timeline.metrics.cluster.aggregator.hourly.interval",
-      "displayName": "timeline.metrics.cluster.aggregator.hourly.interval",
+      "displayName": "Hourly cluster aggregator Interval",
       "description":  "\n      Time in seconds to sleep for the hourly resolution cluster wide\n      aggregator. Default is 1 hour.\n    ",
       "defaultValue": "3600",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 15
     },
     {
       "id": "site property",
       "name": "timeline.metrics.cluster.aggregator.minute.checkpointCutOffMultiplier",
-      "displayName": "timeline.metrics.cluster.aggregator.minute.checkpointCutOffMultiplier",
+      "displayName": "Minute cluster aggregator checkpoint cutOff multiplier",
       "description":  "\n      Multiplier value * interval = Max allowed checkpoint lag. Effectively\n      if aggregator checkpoint is greater than max allowed checkpoint delay,\n      the checkpoint will be discarded by the aggregator.\n    ",
       "defaultValue": "2",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 13
     },
     {
       "id": "site property",
       "name": "timeline.metrics.cluster.aggregator.minute.disabled",
-      "displayName": "timeline.metrics.cluster.aggregator.minute.disabled",
+      "displayName": "Disable minute cluster aggregator",
       "description":  "\n      Disable cluster based minute aggregations.\n    ",
       "defaultValue": "false",
       "displayType": "string",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 10
     },
     {
       "id": "site property",
       "name": "timeline.metrics.cluster.aggregator.minute.interval",
-      "displayName": "timeline.metrics.cluster.aggregator.minute.interval",
+      "displayName": "Minute cluster aggregator interval",
       "description":  "\n      Time in seconds to sleep for the minute resolution cluster wide\n      aggregator. Default resolution is 2 minutes.\n    ",
       "defaultValue": "120",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 11
     },
     {
       "id": "site property",
       "name": "timeline.metrics.cluster.aggregator.minute.timeslice.interval",
-      "displayName": "timeline.metrics.cluster.aggregator.minute.timeslice.interval",
+      "displayName": "Minute cluster aggregator timeslice interval",
       "description":  "\n      Lowest resolution of desired data for cluster level minute aggregates.\n    ",
       "defaultValue": "15",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 12
     },
     {
       "id": "site property",
       "name": "timeline.metrics.host.aggregator.hourly.checkpointCutOffMultiplier",
-      "displayName": "timeline.metrics.host.aggregator.hourly.checkpointCutOffMultiplier",
+      "displayName": "Hourly host aggregator checkpoint cutOff multiplier",
       "description":  "\n      Multiplier value * interval = Max allowed checkpoint lag. Effectively\n      if aggregator checkpoint is greater than max allowed checkpoint delay,\n      the checkpoint will be discarded by the aggregator.\n    ",
       "defaultValue": "2",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 9
     },
     {
       "id": "site property",
       "name": "timeline.metrics.host.aggregator.hourly.disabled",
-      "displayName": "timeline.metrics.host.aggregator.hourly.disabled",
-      "description":  "\n      Disable host based hourly aggregations.\n    ",
+      "displayName": "Disable Hourly host aggregator",
+      "description":  "\n      Disable host based hourly aggregations\n    ",
       "defaultValue": "false",
       "displayType": "string",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 7
     },
     {
       "id": "site property",
       "name": "timeline.metrics.host.aggregator.hourly.interval",
-      "displayName": "timeline.metrics.host.aggregator.hourly.interval",
+      "displayName": "Hourly host aggregator interval",
       "description":  "\n      Time in seconds to sleep for the hourly resolution host based\n      aggregator. Default resolution is 1 hour.\n    ",
       "defaultValue": "3600",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 8
     },
     {
       "id": "site property",
       "name": "timeline.metrics.host.aggregator.minute.checkpointCutOffMultiplier",
-      "displayName": "timeline.metrics.host.aggregator.minute.checkpointCutOffMultiplier",
+      "displayName": "Minute host aggregator checkpoint cutOff multiplier",
       "description":  "\n      Multiplier value * interval = Max allowed checkpoint lag. Effectively\n      if aggregator checkpoint is greater than max allowed checkpoint delay,\n      the checkpoint will be discarded by the aggregator.\n    ",
       "defaultValue": "2",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 6
     },
     {
       "id": "site property",
       "name": "timeline.metrics.host.aggregator.minute.disabled",
-      "displayName": "timeline.metrics.host.aggregator.minute.disabled",
+      "displayName": "Disable Minute host aggregator",
       "description":  "\n      Disable host based minute aggregations.\n    ",
       "defaultValue": "false",
       "displayType": "string",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 4
     },
     {
       "id": "site property",
       "name": "timeline.metrics.host.aggregator.minute.interval",
-      "displayName": "timeline.metrics.host.aggregator.minute.interval",
+      "displayName": "Minute host aggregator interval",
       "description":  "\n      Time in seconds to sleep for the minute resolution host based\n      aggregator. Default resolution is 5 minutes.\n    ",
       "defaultValue": "300",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 5
     },
     {
       "id": "site property",
       "name": "timeline.metrics.service.checkpointDelay",
-      "displayName": "timeline.metrics.service.checkpointDelay",
+      "displayName": "Metrics service checkpoint delay",
       "description":  "\n      Time in seconds to sleep on the first run or when the checkpoint is\n      too old.\n    ",
       "defaultValue": "120",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 1
     },
     {
       "id": "site property",
       "name": "timeline.metrics.service.default.result.limit",
-      "displayName": "timeline.metrics.service.default.result.limit",
+      "displayName": "Metrics service default result limit",
       "description":  "\n      Max result limit on number of rows returned. Calculated as follows:\n      4 aggregate metrics/min * 60 * 24: Retrieve aggregate data for 1 day.\n    ",
       "defaultValue": "5760",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 2
     },
     {
       "id": "site property",
       "name": "timeline.metrics.service.resultset.fetchSize",
-      "displayName": "timeline.metrics.service.resultset.fetchSize",
+      "displayName": "Metrics service resultset fetchSize",
       "description":  "\n      JDBC resultset prefect size for aggregator queries.\n    ",
       "defaultValue": "2000",
       "displayType": "int",
       "serviceName": "AMS",
       "filename": "ams-site.xml",
-      "category": "MetricCollector"
+      "category": "MetricCollector",
+      "index" : 3
     }
   ]
 };

+ 2 - 2
ambari-web/app/models/stack_service.js

@@ -322,8 +322,8 @@ App.StackService.configCategories = function () {
       break;
     case 'AMS':
       serviceConfigCategories.pushObjects([
-        App.ServiceConfigCategory.create({ name: 'MetricCollector', displayName: 'Metric Collector'}),
-        App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
+        App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
+        App.ServiceConfigCategory.create({ name: 'MetricCollector', displayName: 'Metric Collector'})
       ]);
       break;
     case 'PIG':