AMBARI-5707. Replace Ganglia with high performant and pluggable Metrics System. (swagle)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a52f8a55 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a52f8a55 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a52f8a55 Branch: refs/heads/trunk Commit: a52f8a5572f689351a22d41f62bd083c27a3bfa8 Parents: c6f5743 Author: Siddharth Wagle <swa...@hortonworks.com> Authored: Mon Dec 1 14:49:42 2014 -0800 Committer: Siddharth Wagle <swa...@hortonworks.com> Committed: Tue Dec 2 09:26:41 2014 -0800 ---------------------------------------------------------------------- .gitignore | 1 + .../ambari-metrics-hadoop-sink/pom.xml | 188 + .../src/main/assemblies/empty.xml | 21 + .../src/main/assemblies/sink.xml | 34 + .../conf/hadoop-metrics2-hbase.properties.j2 | 49 + .../src/main/conf/hadoop-metrics2.properties.j2 | 58 + .../timeline/AbstractTimelineMetricsSink.java | 101 + .../metrics2/sink/timeline/TimelineMetric.java | 172 + .../metrics2/sink/timeline/TimelineMetrics.java | 102 + .../sink/timeline/TimelineMetricsCache.java | 128 + .../sink/timeline/TimelineMetricsSink.java | 211 ++ .../conf/unix/ambari-metrics-monitor | 203 ++ .../ambari-metrics-host-monitoring/pom.xml | 273 ++ .../src/main/package/rpm/preremove.sh | 28 + .../src/main/python/__init__.py | 21 + .../src/main/python/core/__init__.py | 33 + .../main/python/core/application_metric_map.py | 130 + .../src/main/python/core/config_reader.py | 127 + .../src/main/python/core/controller.py | 103 + .../src/main/python/core/emitter.py | 88 + .../src/main/python/core/event_definition.py | 85 + .../src/main/python/core/host_info.py | 190 + .../src/main/python/core/metric_collector.py | 87 + .../src/main/python/main.py | 64 + .../src/main/python/psutil/LICENSE | 27 + .../src/main/python/psutil/MANIFEST.in | 14 + .../src/main/python/psutil/Makefile | 77 + .../src/main/python/psutil/README | 270 ++ .../src/main/python/psutil/build.py | 57 + .../src/main/python/psutil/docs/Makefile | 177 + .../src/main/python/psutil/docs/README | 15 + .../python/psutil/docs/_static/copybutton.js | 57 + .../main/python/psutil/docs/_static/sidebar.js | 161 + .../python/psutil/docs/_template/globaltoc.html | 12 + .../psutil/docs/_template/indexcontent.html | 4 + .../psutil/docs/_template/indexsidebar.html | 16 + .../main/python/psutil/docs/_template/page.html | 66 + .../_themes/pydoctheme/static/pydoctheme.css | 187 + .../psutil/docs/_themes/pydoctheme/theme.conf | 23 + .../src/main/python/psutil/docs/conf.py | 253 ++ .../src/main/python/psutil/docs/index.rst | 1247 +++++++ .../src/main/python/psutil/docs/make.bat | 242 ++ .../main/python/psutil/examples/disk_usage.py | 63 + .../src/main/python/psutil/examples/free.py | 42 + .../src/main/python/psutil/examples/iotop.py | 178 + .../src/main/python/psutil/examples/killall.py | 32 + .../src/main/python/psutil/examples/meminfo.py | 69 + .../src/main/python/psutil/examples/netstat.py | 65 + .../src/main/python/psutil/examples/nettop.py | 165 + .../src/main/python/psutil/examples/pmap.py | 58 + .../python/psutil/examples/process_detail.py | 162 + .../src/main/python/psutil/examples/top.py | 232 ++ .../src/main/python/psutil/examples/who.py | 34 + .../src/main/python/psutil/make.bat | 176 + .../src/main/python/psutil/psutil/__init__.py | 1987 +++++++++++ .../src/main/python/psutil/psutil/_common.py | 258 ++ .../src/main/python/psutil/psutil/_compat.py | 433 +++ .../src/main/python/psutil/psutil/_psbsd.py | 389 +++ .../src/main/python/psutil/psutil/_pslinux.py | 1225 +++++++ .../src/main/python/psutil/psutil/_psosx.py | 341 ++ .../src/main/python/psutil/psutil/_psposix.py | 157 + .../src/main/python/psutil/psutil/_pssunos.py | 533 +++ .../src/main/python/psutil/psutil/_psutil_bsd.c | 2212 ++++++++++++ .../src/main/python/psutil/psutil/_psutil_bsd.h | 51 + .../main/python/psutil/psutil/_psutil_common.c | 37 + .../main/python/psutil/psutil/_psutil_common.h | 10 + .../main/python/psutil/psutil/_psutil_linux.c | 510 +++ .../main/python/psutil/psutil/_psutil_linux.h | 20 + .../src/main/python/psutil/psutil/_psutil_osx.c | 1881 ++++++++++ .../src/main/python/psutil/psutil/_psutil_osx.h | 41 + .../main/python/psutil/psutil/_psutil_posix.c | 128 + .../main/python/psutil/psutil/_psutil_posix.h | 10 + .../main/python/psutil/psutil/_psutil_sunos.c | 1290 +++++++ .../main/python/psutil/psutil/_psutil_sunos.h | 27 + .../main/python/psutil/psutil/_psutil_windows.c | 3241 ++++++++++++++++++ .../main/python/psutil/psutil/_psutil_windows.h | 70 + .../src/main/python/psutil/psutil/_pswindows.py | 485 +++ .../psutil/psutil/arch/bsd/process_info.c | 285 ++ .../psutil/psutil/arch/bsd/process_info.h | 15 + .../psutil/psutil/arch/osx/process_info.c | 293 ++ .../psutil/psutil/arch/osx/process_info.h | 16 + .../python/psutil/psutil/arch/windows/glpi.h | 41 + .../psutil/psutil/arch/windows/ntextapi.h | 287 ++ .../psutil/arch/windows/process_handles.c | 336 ++ .../psutil/arch/windows/process_handles.h | 10 + .../psutil/psutil/arch/windows/process_info.c | 443 +++ .../psutil/psutil/arch/windows/process_info.h | 17 + .../psutil/psutil/arch/windows/security.c | 238 ++ .../psutil/psutil/arch/windows/security.h | 17 + .../src/main/python/psutil/setup.py | 198 ++ .../python/core/TestApplicationMetricMap.py | 67 + .../src/test/python/core/TestEmitter.py | 78 + .../src/test/python/core/TestHostInfo.py | 97 + .../src/test/python/core/TestMetricCollector.py | 49 + .../src/test/python/unitTests.py | 133 + .../conf/unix/ambari-metrics-collector | 269 ++ .../conf/unix/ams-env.sh | 16 + .../conf/unix/ams-site.xml | 25 + .../conf/unix/log4j.properties | 31 + .../ambari-metrics-timelineservice/pom.xml | 593 ++++ .../src/main/assemblies/ats.xml | 34 + .../src/main/assemblies/empty.xml | 21 + .../src/main/assemblies/phoenix-client.xml | 62 + .../phoenix-components-major-client.xml | 53 + .../assemblies/phoenix-components-minimal.xml | 71 + .../src/main/assemblies/phoenix-server.xml | 46 + .../src/main/assemblies/simulator.xml | 68 + .../main/conf/hbase-site-metrics-service.xml | 80 + .../src/main/conf/simulator-log4j.xml | 45 + .../ApplicationHistoryClientService.java | 211 ++ .../ApplicationHistoryManager.java | 28 + .../ApplicationHistoryManagerImpl.java | 250 ++ .../ApplicationHistoryReader.java | 117 + .../ApplicationHistoryServer.java | 197 ++ .../ApplicationHistoryStore.java | 37 + .../ApplicationHistoryWriter.java | 112 + .../FileSystemApplicationHistoryStore.java | 784 +++++ .../MemoryApplicationHistoryStore.java | 274 ++ .../NullApplicationHistoryStore.java | 127 + .../metrics/loadsimulator/LoadRunner.java | 160 + .../loadsimulator/MetricsLoadSimulator.java | 120 + .../loadsimulator/MetricsSenderWorker.java | 65 + .../metrics/loadsimulator/data/AppID.java | 42 + .../metrics/loadsimulator/data/AppMetrics.java | 48 + .../loadsimulator/data/ApplicationInstance.java | 59 + .../data/HostMetricsGenerator.java | 63 + .../metrics/loadsimulator/data/Metric.java | 71 + .../data/MetricsGeneratorConfigurer.java | 95 + .../loadsimulator/net/MetricsSender.java | 31 + .../loadsimulator/net/RestMetricsSender.java | 95 + .../loadsimulator/net/StdOutMetricsSender.java | 56 + .../metrics/loadsimulator/net/UrlService.java | 101 + .../metrics/loadsimulator/util/Json.java | 63 + .../util/RandomMetricsProvider.java | 40 + .../loadsimulator/util/TimeStampProvider.java | 52 + .../timeline/AbstractTimelineAggregator.java | 229 ++ .../metrics/timeline/Aggregator.java | 60 + .../metrics/timeline/ConnectionProvider.java | 30 + .../timeline/DefaultPhoenixDataSource.java | 78 + .../timeline/HBaseTimelineMetricStore.java | 192 ++ .../metrics/timeline/MetricAggregate.java | 110 + .../timeline/MetricClusterAggregate.java | 74 + .../metrics/timeline/MetricHostAggregate.java | 81 + .../MetricsInitializationException.java | 42 + .../metrics/timeline/PhoenixHBaseAccessor.java | 678 ++++ .../metrics/timeline/PhoenixTransactSQL.java | 528 +++ .../metrics/timeline/TimelineClusterMetric.java | 97 + .../timeline/TimelineMetricAggregator.java | 144 + .../TimelineMetricAggregatorFactory.java | 99 + .../TimelineMetricClusterAggregator.java | 220 ++ .../TimelineMetricClusterAggregatorHourly.java | 173 + .../timeline/TimelineMetricConfiguration.java | 115 + .../metrics/timeline/TimelineMetricStore.java | 70 + .../records/ApplicationAttemptFinishData.java | 95 + .../records/ApplicationAttemptHistoryData.java | 171 + .../records/ApplicationAttemptStartData.java | 82 + .../records/ApplicationFinishData.java | 94 + .../records/ApplicationHistoryData.java | 213 ++ .../records/ApplicationStartData.java | 106 + .../records/ContainerFinishData.java | 90 + .../records/ContainerHistoryData.java | 182 + .../records/ContainerStartData.java | 92 + .../pb/ApplicationAttemptFinishDataPBImpl.java | 239 ++ .../pb/ApplicationAttemptStartDataPBImpl.java | 208 ++ .../impl/pb/ApplicationFinishDataPBImpl.java | 226 ++ .../impl/pb/ApplicationStartDataPBImpl.java | 229 ++ .../impl/pb/ContainerFinishDataPBImpl.java | 204 ++ .../impl/pb/ContainerStartDataPBImpl.java | 258 ++ .../timeline/EntityIdentifier.java | 100 + .../timeline/GenericObjectMapper.java | 135 + .../timeline/LeveldbTimelineStore.java | 1473 ++++++++ .../timeline/MemoryTimelineStore.java | 360 ++ .../timeline/NameValuePair.java | 59 + .../timeline/TimelineReader.java | 155 + .../timeline/TimelineStore.java | 29 + .../timeline/TimelineWriter.java | 46 + .../timeline/package-info.java | 20 + .../webapp/AHSController.java | 55 + .../webapp/AHSLogsPage.java | 55 + .../webapp/AHSView.java | 90 + .../webapp/AHSWebApp.java | 63 + .../webapp/AHSWebServices.java | 162 + .../webapp/AppAttemptPage.java | 69 + .../webapp/AppPage.java | 71 + .../webapp/ContainerPage.java | 41 + .../webapp/JAXBContextResolver.java | 64 + .../webapp/NavBlock.java | 51 + .../webapp/TimelineWebServices.java | 504 +++ .../src/main/resources/metrics_def/DATANODE.dat | 101 + .../src/main/resources/metrics_def/HOST.dat | 23 + .../main/resources/metrics_def/MASTER_HBASE.dat | 69 + .../src/main/resources/metrics_def/NAMENODE.dat | 205 ++ .../main/resources/metrics_def/NODEMANAGER.dat | 67 + .../resources/metrics_def/RESOURCEMANAGER.dat | 88 + .../main/resources/metrics_def/SLAVE_HBASE.dat | 178 + .../src/main/resources/scripts/ams_query.py | 209 ++ .../src/main/resources/scripts/start.sh | 30 + .../src/main/resources/scripts/start_slaves.sh | 27 + .../src/main/resources/scripts/status_slaves.sh | 22 + .../src/main/resources/scripts/stop.sh | 32 + .../src/main/resources/scripts/stop_slaves.sh | 26 + .../src/test/conf/ams-site.xml | 29 + .../src/test/conf/hadoop-policy.xml | 134 + .../src/test/conf/hbase-site.xml | 230 ++ .../ApplicationHistoryStoreTestUtils.java | 84 + .../TestApplicationHistoryClientService.java | 209 ++ .../TestApplicationHistoryManagerImpl.java | 76 + .../TestApplicationHistoryServer.java | 217 ++ .../TestFileSystemApplicationHistoryStore.java | 233 ++ .../TestMemoryApplicationHistoryStore.java | 204 ++ .../loadsimulator/data/TestAppMetrics.java | 134 + .../metrics/loadsimulator/data/TestMetric.java | 80 + .../net/TestRestMetricsSender.java | 76 + .../net/TestStdOutMetricsSender.java | 37 + .../util/TestRandomMetricsProvider.java | 36 + .../util/TestTimeStampProvider.java | 51 + .../timeline/AbstractMiniHBaseClusterTest.java | 113 + .../AbstractPhoenixConnectionlessTest.java | 111 + .../metrics/timeline/ITClusterAggregator.java | 384 +++ .../metrics/timeline/ITMetricAggregator.java | 310 ++ .../metrics/timeline/TestClusterSuite.java | 30 + .../timeline/TestMetricHostAggregate.java | 65 + .../timeline/TestPhoenixTransactSQL.java | 43 + .../timeline/TestTimelineMetricStore.java | 81 + .../timeline/TestGenericObjectMapper.java | 102 + .../timeline/TestLeveldbTimelineStore.java | 253 ++ .../timeline/TestMemoryTimelineStore.java | 83 + .../timeline/TimelineStoreTestUtils.java | 789 +++++ .../webapp/TestAHSWebApp.java | 183 + .../webapp/TestAHSWebServices.java | 303 ++ .../webapp/TestTimelineWebServices.java | 391 +++ .../src/test/resources/hbase-default.xml | 36 + .../4.2.0/phoenix-core-tests-4.2.0.jar | Bin 0 -> 992828 bytes .../4.2.0/phoenix-core-tests-4.2.0.pom | 9 + .../phoenix-core-tests/maven-metadata-local.xml | 12 + ambari-metrics/pom.xml | 180 + .../java/org/apache/ambari/server/Role.java | 2 + .../GangliaComponentPropertyProvider.java | 71 - .../GangliaHostComponentPropertyProvider.java | 72 - .../ganglia/GangliaHostPropertyProvider.java | 85 - .../controller/ganglia/GangliaHostProvider.java | 59 - .../controller/ganglia/GangliaMetric.java | 257 -- .../ganglia/GangliaPropertyProvider.java | 676 ---- .../ganglia/GangliaReportPropertyProvider.java | 234 -- .../internal/AbstractProviderModule.java | 356 +- .../internal/StackDefinedPropertyProvider.java | 107 +- .../controller/jmx/JMXPropertyProvider.java | 38 +- .../controller/metrics/MetricHostProvider.java | 78 + .../controller/metrics/MetricsHostProvider.java | 38 - .../metrics/MetricsPropertyProvider.java | 204 ++ .../controller/metrics/MetricsProvider.java | 302 -- .../metrics/MetricsReportPropertyProvider.java | 88 + .../metrics/RestMetricsPropertyProvider.java | 32 +- .../ThreadPoolEnabledPropertyProvider.java | 301 ++ .../GangliaComponentPropertyProvider.java | 73 + .../GangliaHostComponentPropertyProvider.java | 71 + .../ganglia/GangliaHostPropertyProvider.java | 85 + .../metrics/ganglia/GangliaMetric.java | 257 ++ .../ganglia/GangliaPropertyProvider.java | 618 ++++ .../ganglia/GangliaReportPropertyProvider.java | 227 ++ .../timeline/AMSComponentPropertyProvider.java | 55 + .../AMSHostComponentPropertyProvider.java | 56 + .../timeline/AMSHostPropertyProvider.java | 50 + .../metrics/timeline/AMSPropertyProvider.java | 419 +++ .../timeline/AMSReportPropertyProvider.java | 49 + .../controller/utilities/PropertyHelper.java | 2 +- .../org/apache/ambari/server/state/Service.java | 3 +- .../metrics2/sink/timeline/TimelineMetric.java | 184 + .../metrics2/sink/timeline/TimelineMetrics.java | 103 + .../src/main/resources/ganglia_properties.json | 4 +- .../2.0.6/hooks/before-START/scripts/params.py | 5 + .../templates/hadoop-metrics2.properties.j2 | 18 + .../services/HBASE/package/scripts/params.py | 5 + ...-metrics2-hbase.properties-GANGLIA-MASTER.j2 | 24 + ...doop-metrics2-hbase.properties-GANGLIA-RS.j2 | 24 + .../2.2/services/AMS/configuration/ams-env.xml | 41 + .../AMS/configuration/ams-hbase-env.xml | 137 + .../AMS/configuration/ams-hbase-log4j.xml | 143 + .../AMS/configuration/ams-hbase-policy.xml | 53 + .../AMS/configuration/ams-hbase-site.xml | 252 ++ .../services/AMS/configuration/ams-log4j.xml | 59 + .../2.2/services/AMS/configuration/ams-site.xml | 221 ++ .../stacks/HDP/2.2/services/AMS/metainfo.xml | 104 + .../AMS/package/files/hbaseSmokeVerify.sh | 34 + .../services/AMS/package/scripts/__init__.py | 19 + .../HDP/2.2/services/AMS/package/scripts/ams.py | 89 + .../services/AMS/package/scripts/ams_service.py | 72 + .../services/AMS/package/scripts/functions.py | 40 + .../2.2/services/AMS/package/scripts/hbase.py | 123 + .../AMS/package/scripts/hbase_master.py | 70 + .../AMS/package/scripts/hbase_regionserver.py | 66 + .../AMS/package/scripts/hbase_service.py | 51 + .../AMS/package/scripts/metric_collector.py | 63 + .../AMS/package/scripts/metric_monitor.py | 61 + .../2.2/services/AMS/package/scripts/params.py | 174 + .../AMS/package/scripts/service_check.py | 19 + .../AMS/package/scripts/status_params.py | 30 + .../hadoop-metrics2-hbase.properties.j2 | 55 + .../package/templates/hbase_client_jaas.conf.j2 | 23 + .../templates/hbase_grant_permissions.j2 | 39 + .../package/templates/hbase_master_jaas.conf.j2 | 26 + .../templates/hbase_regionserver_jaas.conf.j2 | 26 + .../AMS/package/templates/metric_groups.conf.j2 | 37 + .../AMS/package/templates/metric_monitor.ini.j2 | 30 + .../AMS/package/templates/regionservers.j2 | 20 + .../services/HBASE/configuration/hbase-env.xml | 139 + .../services/HDFS/configuration/hadoop-env.xml | 4 + .../controller/ganglia/GangliaHelperTest.java | 50 - .../controller/ganglia/GangliaMetricTest.java | 116 - .../ganglia/GangliaPropertyProviderTest.java | 875 ----- .../GangliaReportPropertyProviderTest.java | 123 - .../controller/ganglia/TestStreamProvider.java | 56 - .../internal/AbstractPropertyProviderTest.java | 6 +- .../StackDefinedPropertyProviderTest.java | 86 +- .../metrics/JMXPropertyProviderTest.java | 36 +- .../RestMetricsPropertyProviderTest.java | 22 +- .../metrics/ganglia/GangliaMetricTest.java | 118 + .../ganglia/GangliaPropertyProviderTest.java | 885 +++++ .../GangliaReportPropertyProviderTest.java | 136 + .../metrics/ganglia/TestStreamProvider.java | 56 + .../timeline/AMSPropertyProviderTest.java | 206 ++ .../utilities/PropertyHelperTest.java | 4 +- .../ams/multiple_component_metrics.json | 1274 +++++++ .../resources/ams/multiple_host_metrics.json | 215 ++ .../resources/ams/single_component_metrics.json | 250 ++ .../test/resources/ams/single_host_metric.json | 121 + pom.xml | 5 + 327 files changed, 53832 insertions(+), 3302 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/.gitignore ---------------------------------------------------------------------- diff --git a/.gitignore b/.gitignore index 0430303..a8c4aab 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ derby.log pass.txt ambari-agent/src/test/python/ambari_agent/dummy_files/current-stack velocity.log* +ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/build/ http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/pom.xml ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/pom.xml b/ambari-metrics/ambari-metrics-hadoop-sink/pom.xml new file mode 100644 index 0000000..0397e2e --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/pom.xml @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 + http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>ambari-metrics</artifactId> + <groupId>org.apache.ambari</groupId> + <version>0.1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>ambari-metrics-hadoop-sink</artifactId> + <version>0.1.0-SNAPSHOT</version> + <packaging>jar</packaging> + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <descriptors> + <descriptor>src/main/assemblies/sink.xml</descriptor> + </descriptors> + <tarLongFileMode>gnu</tarLongFileMode> + </configuration> + <executions> + <execution> + <id>build-tarball</id> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.0</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <version>1.8</version> + <executions> + <execution> + <id>parse-version</id> + <phase>validate</phase> + <goals> + <goal>parse-version</goal> + </goals> + </execution> + <execution> + <id>regex-property</id> + <goals> + <goal>regex-property</goal> + </goals> + <configuration> + <name>ambariVersion</name> + <value>${project.version}</value> + <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-).*</regex> + <replacement>$1.$2.$3</replacement> + <failIfNoMatch>false</failIfNoMatch> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>com.github.goldin</groupId> + <artifactId>copy-maven-plugin</artifactId> + <version>0.2.5</version> + <executions> + <execution> + <id>create-archive</id> + <phase>none</phase> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>rpm-maven-plugin</artifactId> + <version>2.0.1</version> + <executions> + <execution> + <phase>none</phase> + <goals> + <goal>rpm</goal> + </goals> + </execution> + </executions> + <configuration> + <name>ambari-metrics-hadoop-sink</name> + <copyright>2012, Apache Software Foundation</copyright> + <group>Development</group> + <description>Maven Recipe: RPM Package.</description> + <mappings> + <mapping> + <directory>/usr/lib/ambari-metrics-hadoop-sink</directory> + <filemode>644</filemode> + <username>root</username> + <groupname>root</groupname> + <sources> + <source> + <location>target/${project.artifactId}-${project.version}.jar</location> + </source> + <softlinkSource> + <destination>ambari-metrics-hadoop-sink.jar</destination> + <location>/usr/lib/ambari-metrics-hadoop-sink/${project.artifactId}-${project.version}.jar</location> + </softlinkSource> + </sources> + + </mapping> + + </mappings> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.apache.hadoop</groupId> + <artifactId>hadoop-common</artifactId> + <version>2.4.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + <version>3.1</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + <version>1.8</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.1</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + <version>3.2.1</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <version>1.1.1</version> + </dependency> + <dependency> + <groupId>commons-configuration</groupId> + <artifactId>commons-configuration</artifactId> + <version>1.6</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.codehaus.jackson</groupId> + <artifactId>jackson-core-asl</artifactId> + <version>1.9.9</version> + </dependency> + <dependency> + <groupId>org.codehaus.jackson</groupId> + <artifactId>jackson-mapper-asl</artifactId> + <version>1.9.13</version> + </dependency> + </dependencies> + +</project> http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/empty.xml ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/empty.xml b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/empty.xml new file mode 100644 index 0000000..35738b1 --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/empty.xml @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<assembly> + <id>empty</id> + <formats/> +</assembly> http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/sink.xml ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/sink.xml b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/sink.xml new file mode 100644 index 0000000..21a6b36 --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/assemblies/sink.xml @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<assembly> + <!--This 'all' id is not appended to the produced bundle because we do this: + http://maven.apache.org/plugins/maven-assembly-plugin/faq.html#required-classifiers + --> + <id>dist</id> + <formats> + <format>dir</format> + <format>tar.gz</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + <files> + <file> + <source>${project.build.directory}/${artifact.artifactId}-${artifact.version}.jar</source> + <outputDirectory>ambari-metrics-${project.version}/lib/ambari-metrics</outputDirectory> + </file> + </files> +</assembly> http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2-hbase.properties.j2 ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2-hbase.properties.j2 b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2-hbase.properties.j2 new file mode 100644 index 0000000..6e64421 --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2-hbase.properties.j2 @@ -0,0 +1,49 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# See http://wiki.apache.org/hadoop/GangliaMetrics +# +# Make sure you know whether you are using ganglia 3.0 or 3.1. +# If 3.1, you will have to patch your hadoop instance with HADOOP-4675 +# And, yes, this file is named hadoop-metrics.properties rather than +# hbase-metrics.properties because we're leveraging the hadoop metrics +# package and hadoop-metrics.properties is an hardcoded-name, at least +# for the moment. +# +# See also http://hadoop.apache.org/hbase/docs/current/metrics.html + +# HBase-specific configuration to reset long-running stats (e.g. compactions) +# If this variable is left out, then the default is no expiration. +hbase.extendedperiod = 3600 + +# Configuration of the "hbase" context for timeline metrics service +hbase.class=org.apache.hadoop.metrics2.sink.timeline.TimelineMetricsSink +hbase.period=10 +hbase.collector={{timeline_server_hosts}}:8188 + +# Configuration of the "jvm" context for timeline metrics service +jvm.class=org.apache.hadoop.metrics2.sink.timeline.TimelineMetricsSink +jvm.period=10 +jvm.collector={{timeline_server_hosts}}:8188 + +# Configuration of the "rpc" context for timeline metrics service +rpc.class=org.apache.hadoop.metrics2.sink.timeline.TimelineMetricsSink +rpc.period=10 +rpc.collector={{timeline_server_hosts}}:8188 + +# Following hadoop example +hbase.sink.timeline.class=org.apache.hadoop.metrics2.sink.timeline.TimelineMetricsSink +hbase.sink.timeline.period=10 +hbase.sink.timeline.collector={{timeline_server_hosts}}:8188 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2.properties.j2 ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2.properties.j2 b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2.properties.j2 new file mode 100644 index 0000000..7a00a7e --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/conf/hadoop-metrics2.properties.j2 @@ -0,0 +1,58 @@ +{# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#} + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# syntax: [prefix].[source|sink|jmx].[instance].[options] +# See package.html for org.apache.hadoop.metrics2 for details + +{% if has_ganglia_server %} +*.period=60 + +*.sink.timeline.class=org.apache.hadoop.metrics2.sink.timeline.TimelineMetricsSink +*.sink.timeline.period=10 + + +# Hook up to the server +datanode.sink.timeline.collector={{timeline_server_hosts}}:8188 +namenode.sink.timeline.collector={{timeline_server_hosts}}:8188 +resourcemanager.sink.timeline.collector={{timeline_server_hosts}}:8188 +nodemanager.sink.timeline.collector={{timeline_server_hosts}}:8188 +historyserver.sink.timeline.collector={{timeline_server_hosts}}:8188 +journalnode.sink.timeline.collector={{timeline_server_hosts}}:8188 +nimbus.sink.timeline.collector={{timeline_server_hosts}}:8188 +supervisor.sink.timeline.collector={{timeline_server_hosts}}:8188 +maptask.sink.timeline.collector={{timeline_server_hosts}}:8188 +reducetask.sink.timeline.collector={{timeline_server_hosts}}:8188 + +resourcemanager.sink.ganglia.tagsForPrefix.yarn=Queue + +{% endif %} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java new file mode 100644 index 0000000..2c42274 --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java @@ -0,0 +1,101 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.metrics2.sink.timeline; + +import org.apache.commons.configuration.SubsetConfiguration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.metrics2.MetricsSink; +import org.apache.hadoop.metrics2.util.Servers; +import org.apache.hadoop.net.DNS; +import java.net.SocketAddress; +import java.net.UnknownHostException; +import java.util.List; + +public abstract class AbstractTimelineMetricsSink implements MetricsSink { + + public final Log LOG = LogFactory.getLog(this.getClass()); + + private SubsetConfiguration conf; + private String hostName = "UNKNOWN.example.com"; + private String serviceName = ""; + private final String COLLECTOR_HOST_PROPERTY = "collector"; + private final int DEFAULT_PORT = 8188; + + private List<? extends SocketAddress> metricsServers; + private String collectorUri; + + @Override + public void init(SubsetConfiguration conf) { + this.conf = conf; + LOG.info("Initializing Timeline metrics sink."); + + // Take the hostname from the DNS class. + if (conf.getString("slave.host.name") != null) { + hostName = conf.getString("slave.host.name"); + } else { + try { + hostName = DNS.getDefaultHost( + conf.getString("dfs.datanode.dns.interface", "default"), + conf.getString("dfs.datanode.dns.nameserver", "default")); + } catch (UnknownHostException uhe) { + LOG.error(uhe); + hostName = "UNKNOWN.example.com"; + } + } + + serviceName = getFirstConfigPrefix(conf); + + // Load collector configs + metricsServers = Servers.parse(conf.getString(COLLECTOR_HOST_PROPERTY), + DEFAULT_PORT); + + if (metricsServers == null || metricsServers.isEmpty()) { + LOG.error("No Metric collector configured."); + } else { + collectorUri = "http://" + conf.getString(COLLECTOR_HOST_PROPERTY).trim() + + "/ws/v1/timeline/metrics"; + } + } + + protected String getHostName() { + return hostName; + } + + protected String getServiceName() { + return serviceName; + } + + private String getFirstConfigPrefix(SubsetConfiguration conf) { + while (conf.getParent() instanceof SubsetConfiguration) { + conf = (SubsetConfiguration) conf.getParent(); + } + return conf.getPrefix(); + } + + protected SocketAddress getServerSocketAddress() { + if (metricsServers != null && !metricsServers.isEmpty()) { + return metricsServers.get(0); + } + return null; + } + + protected String getCollectorUri() { + return collectorUri; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java new file mode 100644 index 0000000..68b4be8 --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java @@ -0,0 +1,172 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.metrics2.sink.timeline; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Map; +import java.util.TreeMap; + +@XmlRootElement(name = "metric") +@XmlAccessorType(XmlAccessType.NONE) +@InterfaceAudience.Public +@InterfaceStability.Unstable +public class TimelineMetric implements Comparable<TimelineMetric> { + + private String metricName; + private String appId; + private String instanceId; + private String hostName; + private long timestamp; + private long startTime; + private String type; + private Map<Long, Double> metricValues = new TreeMap<Long, Double>(); + + @XmlElement(name = "metricname") + public String getMetricName() { + return metricName; + } + + public void setMetricName(String metricName) { + this.metricName = metricName; + } + + @XmlElement(name = "appid") + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + @XmlElement(name = "instanceid") + public String getInstanceId() { + return instanceId; + } + + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + + @XmlElement(name = "hostname") + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + @XmlElement(name = "timestamp") + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + @XmlElement(name = "starttime") + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + @XmlElement(name = "type") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @XmlElement(name = "metrics") + public Map<Long, Double> getMetricValues() { + return metricValues; + } + + public void setMetricValues(Map<Long, Double> metricValues) { + this.metricValues = metricValues; + } + + public void addMetricValues(Map<Long, Double> metricValues) { + this.metricValues.putAll(metricValues); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TimelineMetric metric = (TimelineMetric) o; + + if (!metricName.equals(metric.metricName)) return false; + if (hostName != null ? !hostName.equals(metric.hostName) : metric.hostName != null) + return false; + if (appId != null ? !appId.equals(metric.appId) : metric.appId != null) + return false; + if (instanceId != null ? !instanceId.equals(metric.instanceId) : metric.instanceId != null) + return false; + if (timestamp != metric.timestamp) return false; + if (startTime != metric.startTime) return false; + + return true; + } + + public boolean equalsExceptTime(TimelineMetric metric) { + if (!metricName.equals(metric.metricName)) return false; + if (hostName != null ? !hostName.equals(metric.hostName) : metric.hostName != null) + return false; + if (appId != null ? !appId.equals(metric.appId) : metric.appId != null) + return false; + if (instanceId != null ? !instanceId.equals(metric.instanceId) : metric.instanceId != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = metricName.hashCode(); + result = 31 * result + (appId != null ? appId.hashCode() : 0); + result = 31 * result + (instanceId != null ? instanceId.hashCode() : 0); + result = 31 * result + (hostName != null ? hostName.hashCode() : 0); + result = 31 * result + (int) (timestamp ^ (timestamp >>> 32)); + return result; + } + + @Override + public int compareTo(TimelineMetric other) { + if (timestamp > other.timestamp) { + return -1; + } else if (timestamp < other.timestamp) { + return 1; + } else { + return metricName.compareTo(other.metricName); + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetrics.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetrics.java b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetrics.java new file mode 100644 index 0000000..a6c925a --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetrics.java @@ -0,0 +1,102 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.metrics2.sink.timeline; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; +import java.util.List; + +/** + * The class that hosts a list of timeline entities. + */ +@XmlRootElement(name = "metrics") +@XmlAccessorType(XmlAccessType.NONE) +@InterfaceAudience.Public +@InterfaceStability.Unstable +public class TimelineMetrics { + + private List<TimelineMetric> allMetrics = new ArrayList<TimelineMetric>(); + + public TimelineMetrics() {} + + @XmlElement(name = "metrics") + public List<TimelineMetric> getMetrics() { + return allMetrics; + } + + public void setMetrics(List<TimelineMetric> allMetrics) { + this.allMetrics = allMetrics; + } + + private boolean isEqualTimelineMetrics(TimelineMetric metric1, + TimelineMetric metric2) { + + boolean isEqual = true; + + if (!metric1.getMetricName().equals(metric2.getMetricName())) { + return false; + } + + if (metric1.getHostName() != null) { + isEqual = metric1.getHostName().equals(metric2.getHostName()); + } + + if (metric1.getAppId() != null) { + isEqual = metric1.getAppId().equals(metric2.getAppId()); + } + + return isEqual; + } + + /** + * Merge with existing TimelineMetric if everything except startTime is + * the same. + * @param metric {@link TimelineMetric} + */ + public void addOrMergeTimelineMetric(TimelineMetric metric) { + TimelineMetric metricToMerge = null; + + if (!allMetrics.isEmpty()) { + for (TimelineMetric timelineMetric : allMetrics) { + if (timelineMetric.equalsExceptTime(metric)) { + metricToMerge = timelineMetric; + break; + } + } + } + + if (metricToMerge != null) { + metricToMerge.addMetricValues(metric.getMetricValues()); + if (metricToMerge.getTimestamp() > metric.getTimestamp()) { + metricToMerge.setTimestamp(metric.getTimestamp()); + } + if (metricToMerge.getStartTime() > metric.getStartTime()) { + metricToMerge.setStartTime(metric.getStartTime()); + } + } else { + allMetrics.add(metric); + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsCache.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsCache.java b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsCache.java new file mode 100644 index 0000000..36aaec2 --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsCache.java @@ -0,0 +1,128 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.metrics2.sink.timeline; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric; + +import java.util.LinkedHashMap; +import java.util.Map; + +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class TimelineMetricsCache { + + private final TimelineMetricHolder timelineMetricCache = new TimelineMetricHolder(); + private static final Log LOG = LogFactory.getLog(TimelineMetric.class); + static final int MAX_RECS_PER_NAME_DEFAULT = 10000; + static final int MAX_EVICTION_TIME_MILLIS = 59000; // ~ 1 min + private final int maxRecsPerName; + private final int maxEvictionTimeInMillis; + + TimelineMetricsCache(int maxRecsPerName, int maxEvictionTimeInMillis) { + this.maxRecsPerName = maxRecsPerName; + this.maxEvictionTimeInMillis = maxEvictionTimeInMillis; + } + + class TimelineMetricWrapper { + private long timeDiff = -1; + private long oldestTimestamp = -1; + private TimelineMetric timelineMetric; + + TimelineMetricWrapper(TimelineMetric timelineMetric) { + this.timelineMetric = timelineMetric; + this.oldestTimestamp = timelineMetric.getStartTime(); + } + + private void updateTimeDiff(long timestamp) { + if (oldestTimestamp != -1 && timestamp > oldestTimestamp) { + timeDiff = timestamp - oldestTimestamp; + } else { + oldestTimestamp = timestamp; + } + } + + public void putMetric(TimelineMetric metric) { + this.timelineMetric.addMetricValues(metric.getMetricValues()); + updateTimeDiff(metric.getStartTime()); + } + + public long getTimeDiff() { + return timeDiff; + } + + public TimelineMetric getTimelineMetric() { + return timelineMetric; + } + } + + // TODO: Change to ConcurentHashMap with weighted eviction + class TimelineMetricHolder extends LinkedHashMap<String, TimelineMetricWrapper> { + private static final long serialVersionUID = 1L; + private boolean gotOverflow = false; + + @Override + protected boolean removeEldestEntry(Map.Entry<String, TimelineMetricWrapper> eldest) { + boolean overflow = size() > maxRecsPerName; + if (overflow && !gotOverflow) { + LOG.warn("Metrics cache overflow at "+ size() +" for "+ eldest); + gotOverflow = true; + } + return overflow; + } + + public TimelineMetric evict(String metricName) { + TimelineMetricWrapper metricWrapper = this.get(metricName); + + if (metricWrapper == null + || metricWrapper.getTimeDiff() < maxEvictionTimeInMillis) { + return null; + } + + TimelineMetric timelineMetric = metricWrapper.getTimelineMetric(); + this.remove(metricName); + + return timelineMetric; + } + + public void put(String metricName, TimelineMetric timelineMetric) { + + TimelineMetricWrapper metric = this.get(metricName); + if (metric == null) { + this.put(metricName, new TimelineMetricWrapper(timelineMetric)); + } else { + metric.putMetric(timelineMetric); + } + } + } + + public TimelineMetric getTimelineMetric(String metricName) { + if (timelineMetricCache.containsKey(metricName)) { + return timelineMetricCache.evict(metricName); + } + + return null; + } + + public void putTimelineMetric(TimelineMetric timelineMetric) { + timelineMetricCache.put(timelineMetric.getMetricName(), timelineMetric); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsSink.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsSink.java b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsSink.java new file mode 100644 index 0000000..a843428 --- /dev/null +++ b/ambari-metrics/ambari-metrics-hadoop-sink/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricsSink.java @@ -0,0 +1,211 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.metrics2.sink.timeline; + +import org.apache.commons.configuration.SubsetConfiguration; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.commons.lang.ClassUtils; +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics2.AbstractMetric; +import org.apache.hadoop.metrics2.MetricsException; +import org.apache.hadoop.metrics2.MetricsRecord; +import org.apache.hadoop.metrics2.MetricsTag; +import org.apache.hadoop.metrics2.impl.MsInfo; +import org.apache.hadoop.metrics2.sink.timeline.AbstractTimelineMetricsSink; +import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric; +import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics; +import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricsCache; +import org.codehaus.jackson.map.AnnotationIntrospector; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.codehaus.jackson.xc.JaxbAnnotationIntrospector; +import java.io.IOException; +import java.net.SocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class TimelineMetricsSink extends AbstractTimelineMetricsSink { + private static ObjectMapper mapper; + private Map<String, Set<String>> useTagsMap = new HashMap<String, Set<String>>(); + private static final String TAGS_FOR_PREFIX_PROPERTY_PREFIX = "tagsForPrefix."; + private static final String MAX_METRIC_ROW_CACHE_SIZE = "maxRowCacheSize"; + private static final String METRICS_SEND_INTERVAL = "sendInterval"; + protected HttpClient httpClient = new HttpClient(); + private TimelineMetricsCache metricsCache; + + static { + mapper = new ObjectMapper(); + AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(); + mapper.setAnnotationIntrospector(introspector); + mapper.getSerializationConfig() + .setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); + } + + @Override + public void init(SubsetConfiguration conf) { + super.init(conf); + + int maxRowCacheSize = conf.getInt(MAX_METRIC_ROW_CACHE_SIZE, + TimelineMetricsCache.MAX_RECS_PER_NAME_DEFAULT); + int metricsSendInterval = conf.getInt(METRICS_SEND_INTERVAL, + TimelineMetricsCache.MAX_EVICTION_TIME_MILLIS); // ~ 1 min + metricsCache = new TimelineMetricsCache(maxRowCacheSize, metricsSendInterval); + + conf.setListDelimiter(','); + Iterator<String> it = (Iterator<String>) conf.getKeys(); + while (it.hasNext()) { + String propertyName = it.next(); + if (propertyName != null && propertyName.startsWith(TAGS_FOR_PREFIX_PROPERTY_PREFIX)) { + String contextName = propertyName.substring(TAGS_FOR_PREFIX_PROPERTY_PREFIX.length()); + String[] tags = conf.getStringArray(propertyName); + boolean useAllTags = false; + Set<String> set = null; + if (tags.length > 0) { + set = new HashSet<String>(); + for (String tag : tags) { + tag = tag.trim(); + useAllTags |= tag.equals("*"); + if (tag.length() > 0) { + set.add(tag); + } + } + if (useAllTags) { + set = null; + } + } + useTagsMap.put(contextName, set); + } + } + } + + @Override + public void putMetrics(MetricsRecord record) { + try { + String recordName = record.name(); + String contextName = record.context(); + + StringBuilder sb = new StringBuilder(); + sb.append(contextName); + sb.append('.'); + sb.append(recordName); + + appendPrefix(record, sb); + sb.append("."); + int sbBaseLen = sb.length(); + + Collection<AbstractMetric> metrics = + (Collection<AbstractMetric>) record.metrics(); + + List<TimelineMetric> metricList = new ArrayList<TimelineMetric>(); + + for (AbstractMetric metric : metrics) { + sb.append(metric.name()); + String name = sb.toString(); + TimelineMetric timelineMetric = new TimelineMetric(); + timelineMetric.setMetricName(name); + timelineMetric.setHostName(getHostName()); + timelineMetric.setAppId(getServiceName()); + timelineMetric.setStartTime(record.timestamp()); + timelineMetric.setType(ClassUtils.getShortCanonicalName( + metric.value(), "Number")); + timelineMetric.getMetricValues().put(record.timestamp(), + metric.value().doubleValue()); + // Put intermediate values into the cache until it is time to send + metricsCache.putTimelineMetric(timelineMetric); + + // Retrieve all values from cache if it is time to send + TimelineMetric cachedMetric = metricsCache.getTimelineMetric(name); + + if (cachedMetric != null) { + metricList.add(cachedMetric); + } + + sb.setLength(sbBaseLen); + } + + TimelineMetrics timelineMetrics = new TimelineMetrics(); + timelineMetrics.setMetrics(metricList); + + if (!metricList.isEmpty()) { + emitMetrics(timelineMetrics); + } + + + } catch (IOException io) { + throw new MetricsException("Failed to putMetrics", io); + } + } + + private void emitMetrics(TimelineMetrics metrics) throws IOException { + String jsonData = mapper.writeValueAsString(metrics); + + SocketAddress socketAddress = getServerSocketAddress(); + + if (socketAddress != null) { + StringRequestEntity requestEntity = new StringRequestEntity( + jsonData, "application/json", "UTF-8"); + + PostMethod postMethod = new PostMethod(getCollectorUri()); + postMethod.setRequestEntity(requestEntity); + int statusCode = httpClient.executeMethod(postMethod); + if (statusCode != 200) { + LOG.info("Unable to POST metrics to collector, " + getCollectorUri()); + } + } + } + + // Taken as is from Ganglia30 implementation + @InterfaceAudience.Private + public void appendPrefix(MetricsRecord record, StringBuilder sb) { + String contextName = record.context(); + Collection<MetricsTag> tags = record.tags(); + if (useTagsMap.containsKey(contextName)) { + Set<String> useTags = useTagsMap.get(contextName); + for (MetricsTag t : tags) { + if (useTags == null || useTags.contains(t.name())) { + + // the context is always skipped here because it is always added + + // the hostname is always skipped to avoid case-mismatches + // from different DNSes. + + if (t.info() != MsInfo.Context && t.info() != MsInfo.Hostname && t.value() != null) { + sb.append('.').append(t.name()).append('=').append(t.value()); + } + } + } + } + } + + @Override + public void flush() { + // TODO: Buffering implementation + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-host-monitoring/conf/unix/ambari-metrics-monitor ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-host-monitoring/conf/unix/ambari-metrics-monitor b/ambari-metrics/ambari-metrics-host-monitoring/conf/unix/ambari-metrics-monitor new file mode 100644 index 0000000..fd086d9 --- /dev/null +++ b/ambari-metrics/ambari-metrics-host-monitoring/conf/unix/ambari-metrics-monitor @@ -0,0 +1,203 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific + + +MONITOR_CONF_DIR=/etc/ambari-metrics-monitor/conf/ +METRIC_MONITOR=ambari-metrics-monitor + +RESOURCE_MONITORING_DIR=/usr/lib/python2.6/site-packages/resource_monitoring +METRIC_MONITOR_PY_SCRIPT=${RESOURCE_MONITORING_DIR}/main.py + +PIDFILE=/var/run/ambari-metrics-monitor/ambari-metrics-monitor.pid +OUTFILE=/var/log/ambari-metrics-monitor/ambari-metrics-monitor.out + +STOP_TIMEOUT=5 + +OK=0 +NOTOK=1 + +if [ -a /usr/bin/python2.7 ] && [ -z "${PYTHON}" ]; then + PYTHON=/usr/bin/python2.7 +fi + +if [ -a /usr/bin/python2.6 ] && [ -z "${PYTHON}" ]; then + PYTHON=/usr/bin/python2.6 +fi + +if [ "x$PYTHON" == "x" ]; then + PYTHON=/usr/bin/python +fi + +export PYTHON=${PYTHON} + +check_python_version () +{ + echo "Verifying Python version compatibility..." + majversion=`${PYTHON} -V 2>&1 | awk '{print $2}' | cut -d'.' -f1` + minversion=`${PYTHON} -V 2>&1 | awk '{print $2}' | cut -d'.' -f2` + numversion=$(( 10 * $majversion + $minversion)) + if (( $numversion < 26 )); then + echo "ERROR: Found Python version $majversion.$minversion. Ambari Metric Monitor requires Python version > 2.6" + return ${NOTOK} + fi + echo "Using python " ${PYTHON} + return ${OK} +} + +function write_pidfile +{ + local pidfile="$1" + echo $! > "${pidfile}" 2>/dev/null + if [[ $? -gt 0 ]]; then + echo "ERROR: Cannot write pid ${pidfile}." + exit 1; + fi +} + +#build psutil +if [ ! "$(ls -A ${RESOURCE_MONITORING_DIR}/psutil/build)" ]; then + echo "Building psutil..." + dir=$(pwd) + cd "${RESOURCE_MONITORING_DIR}/psutil" + ${PYTHON} "build.py" + cd "${dir}" +else + echo "psutil build directory is not empty, continuing..." +fi + +#locate config dir +while [[ -z "${_ams_configs_done}" ]]; do + case $1 in + --config) + shift + confdir=$1 + shift + if [[ -d "${confdir}" ]]; then + MONITOR_CONF_DIR="${confdir}" + elif [[ -z "${confdir}" ]]; then + echo "ERROR: No parameter provided for --config " + exit 1 + else + echo "ERROR: Cannot find configuration directory \"${confdir}\"" + exit 1 + fi + ;; + *) + _ams_configs_done=true + ;; + esac +done + +case "$1" in + + start) + check_python_version + if [ "$?" -eq "${NOTOK}" ]; then + exit -1 + fi + + echo "Checking for previously running Metric Monitor..." + if [ -f ${PIDFILE} ]; then + PID=`cat ${PIDFILE}` + if [ -z "`ps ax -o pid | grep ${PID}`" ]; then + echo "${PIDFILE} found with no process. Removing ${PID}..." + rm -f ${PIDFILE} + else + tput bold + echo "ERROR: ${METRIC_MONITOR} already running" + tput sgr0 + echo "Check ${PIDFILE} for PID." + exit -1 + fi + fi + + echo "Starting ${METRIC_MONITOR}" + + nohup ${PYTHON} ${METRIC_MONITOR_PY_SCRIPT} "$@" > ${OUTFILE} 2>&1 & + PID=$! + write_pidfile ${PIDFILE} + + sleep 2 + + echo "Verifying ${METRIC_MONITOR} process status..." + if [ -z "`ps ax -o pid | grep ${PID}`" ]; then + if [ -s ${OUTFILE} ]; then + echo "ERROR: ${METRIC_MONITOR} start failed. For more details, see ${OUTFILE}:" + echo "====================" + tail -n 10 ${OUTFILE} + echo "====================" + else + echo "ERROR: ${METRIC_MONITOR} start failed" + rm -f ${PIDFILE} + fi + echo "Monitor out at: ${OUTFILE}" + exit -1 + fi + + echo "Metric Monitor successfully started" + echo "Server log at: ${OUTFILE}" + ;; + status) + if [ -f ${PIDFILE} ]; then + PID=`cat ${PIDFILE}` + echo "Found ${METRIC_MONITOR} PID: $PID" + if [ -z "`ps ax -o pid | grep ${PID}`" ]; then + echo "${METRIC_MONITOR} not running. Stale PID File at: $PIDFILE" + retcode=2 + else + tput bold + echo "${METRIC_MONITOR} running." + tput sgr0 + echo "Monitor PID at: ${PIDFILE}" + echo "Monitor out at: ${OUTFILE}" + fi + else + tput bold + echo "${METRIC_MONITOR} currently not running" + tput sgr0 + echo "Usage: /usr/sbin/${METRIC_MONITOR} {start|stop|restart|status}" + retcode=3 + fi + ;; + stop) + pidfile=${PIDFILE} + + if [[ -f "${pidfile}" ]]; then + pid=$(cat "$pidfile") + + kill "${pid}" >/dev/null 2>&1 + sleep "${STOP_TIMEOUT}" + + if kill -0 "${pid}" > /dev/null 2>&1; then + echo "WARNING: ${METRIC_MONITOR} did not stop gracefully after ${STOP_TIMEOUT} seconds: Trying to kill with kill -9" + kill -9 "${pid}" >/dev/null 2>&1 + fi + + if ps -p "${pid}" > /dev/null 2>&1; then + echo "ERROR: Unable to kill ${pid}" + else + rm -f "${pidfile}" >/dev/null 2>&1 + fi + fi + + ;; + restart) + echo -e "Restarting ${METRIC_MONITOR}" + $0 stop + $0 start "$@" + retcode=$? + ;; +esac http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-host-monitoring/pom.xml ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-host-monitoring/pom.xml b/ambari-metrics/ambari-metrics-host-monitoring/pom.xml new file mode 100644 index 0000000..b354461 --- /dev/null +++ b/ambari-metrics/ambari-metrics-host-monitoring/pom.xml @@ -0,0 +1,273 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 + http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <parent> + <artifactId>ambari-metrics</artifactId> + <groupId>org.apache.ambari</groupId> + <version>0.1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <packaging>pom</packaging> + <version>0.1.0-SNAPSHOT</version> + <artifactId>ambari-metrics-host-monitoring</artifactId> + <properties> + <resmonitor.install.dir> + /usr/lib/python2.6/site-packages/resource_monitoring + </resmonitor.install.dir> + </properties> + <build> + <plugins> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>2.6</version> + <configuration> + <filesets> + <fileset> + <directory>${project.basedir}/src/main/python/psutil/build/</directory> + <includes> + <include>**/*</include> + </includes> + <followSymlinks>false</followSymlinks> + </fileset> + </filesets> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <version>1.8</version> + <executions> + <execution> + <id>parse-version</id> + <phase>validate</phase> + <goals> + <goal>parse-version</goal> + </goals> + </execution> + <execution> + <id>regex-property</id> + <goals> + <goal>regex-property</goal> + </goals> + <configuration> + <name>ambariVersion</name> + <value>${project.version}</value> + <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-).*</regex> + <replacement>$1.$2.$3</replacement> + <failIfNoMatch>false</failIfNoMatch> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.0</version> + </plugin> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <tarLongFileMode>gnu</tarLongFileMode> + <descriptors> + <descriptor>${project.basedir}/../../ambari-project/src/main/assemblies/empty.xml</descriptor> + </descriptors> + </configuration> + <executions> + <execution> + <id>build-tarball</id> + <phase>none</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>rpm-maven-plugin</artifactId> + <version>2.0.1</version> + <executions> + <execution> + <!-- unbinds rpm creation from maven lifecycle --> + <phase>none</phase> + <goals> + <goal>rpm</goal> + </goals> + </execution> + </executions> + + <configuration> + <name>ambari-metrics-monitor</name> + <group>Development</group> + <needarch>x86_64</needarch> + <autoRequires>false</autoRequires> + <requires> + <require>ambari-metrics-hadoop-sink</require> + <require>${python.ver}</require> + <require>gcc</require> + <require>python-devel</require> + </requires> + <preremoveScriptlet> + <scriptFile>src/main/package/rpm/preremove.sh</scriptFile> + <fileEncoding>utf-8</fileEncoding> + </preremoveScriptlet> + <mappings> + <mapping> + <directory>${resmonitor.install.dir}</directory> + <username>root</username> + <groupname>root</groupname> + <sources> + <source> + <!--<location>--> + <!--${project.build.directory}/${project.artifactId}-${project.version}/resource_monitoring/external/build/*--> + <!--</location>--> + <!--<location>--> + <!--${project.build.directory}/${project.artifactId}-${project.version}/resource_monitoring/core--> + <!--</location>--> + <!--<location>--> + <!--${project.build.directory}/${project.artifactId}-${project.version}/resource_monitoring/__init__.py--> + <!--</location>--> + <location> + ${project.basedir}/src/main/python/__init__.py + </location> + </source> + <source> + <location> + ${project.basedir}/src/main/python/main.py + </location> + </source> + </sources> + </mapping> + <mapping> + <directory>${resmonitor.install.dir}/core</directory> + <sources> + <source> + <location> + ${project.basedir}/src/main/python/core + </location> + </source> + </sources> + </mapping> + <mapping> + <directory>${resmonitor.install.dir}/psutil</directory> + <sources> + <source> + <location> + ${project.basedir}/src/main/python/psutil + </location> + </source> + </sources> + </mapping> + <mapping> + <directory>/etc/ambari-metrics-monitor/conf</directory> + <configuration>true</configuration> + </mapping> + <mapping> + <directory>/var/run/ambari-metrics-monitor</directory> + </mapping> + <mapping> + <directory>/var/log/ambari-metrics-monitor</directory> + </mapping> + <mapping> + <directory>/usr/sbin</directory> + <filemode>755</filemode> + <username>root</username> + <groupname>root</groupname> + <directoryIncluded>false</directoryIncluded> + <sources> + <source> + <location>conf/unix/ambari-metrics-monitor</location> + <filter>true</filter> + </source> + </sources> + </mapping> + </mappings> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <version>1.7</version> + <executions> + <execution> + <id>psutils-compile</id> + <phase>process-classes</phase> + <goals> + <goal>run</goal> + </goals> + <configuration> + <target name="psutils-compile"> + <exec dir="${basedir}/src/main/python/psutil" executable="python" failonerror="true"> + <arg value="setup.py" /> + <arg value="build" /> + <arg value="--build-platlib" /> + <arg value="${basedir}/target/psutil_build" /> + </exec> + </target> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <executions> + <execution> + <configuration> + <executable>python</executable> + <workingDirectory>src/test/python</workingDirectory> + <arguments> + <argument>unitTests.py</argument> + </arguments> + <environmentVariables> + <PYTHONPATH>../../main/python:$PYTHONPATH</PYTHONPATH> + </environmentVariables> + <skip>${skipTests}</skip> + </configuration> + <id>python-test</id> + <phase>test</phase> + <goals> + <goal>exec</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.rat</groupId> + <artifactId>apache-rat-plugin</artifactId> + <configuration> + <excludes> + <exclude>src/main/python/psutil/**</exclude> + <exclude>.pydevproject</exclude> + </excludes> + </configuration> + <executions> + <execution> + <phase>test</phase> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-host-monitoring/src/main/package/rpm/preremove.sh ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-host-monitoring/src/main/package/rpm/preremove.sh b/ambari-metrics/ambari-metrics-host-monitoring/src/main/package/rpm/preremove.sh new file mode 100644 index 0000000..9789127 --- /dev/null +++ b/ambari-metrics/ambari-metrics-host-monitoring/src/main/package/rpm/preremove.sh @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + +# WARNING: This script is performed not only on uninstall, but also +# during package update. See http://www.ibm.com/developerworks/library/l-rpm2/ +# for details + +RESOURCE_MONITORING_DIR=/usr/lib/python2.6/site-packages/resource_monitoring +PSUTIL_DIR="${RESOURCE_MONITORING_DIR}/psutil" + + +if [ -d "${PSUTIL_DIR}" ]; then + rm -rf "${PSUTIL_DIR}/*" +fi + +exit 0 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py b/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py new file mode 100644 index 0000000..adfc71c --- /dev/null +++ b/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +''' +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +''' + +from core import * http://git-wip-us.apache.org/repos/asf/ambari/blob/a52f8a55/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py b/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py new file mode 100644 index 0000000..996120f --- /dev/null +++ b/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +""" +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +""" + +import os, sys +path = os.path.abspath(__file__) +path = os.path.join(os.path.dirname(os.path.dirname(path)), "psutil/build/") + +for dir in os.walk(path).next()[1]: + if 'lib' in dir: + sys.path.append(os.path.join(path, dir)) + +try: + import psutil +except ImportError: + print 'psutil binaries need to be built by running, psutil/build.py ' \ + 'manually or by running a, mvn clean package, command.'