| /** |
| * 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.ambari.metrics.core.timeline; |
| |
| import static org.easymock.EasyMock.expect; |
| import static org.easymock.EasyMock.replay; |
| |
| import junit.framework.Assert; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric; |
| import org.easymock.EasyMock; |
| import org.junit.Test; |
| |
| import java.net.URISyntaxException; |
| import java.net.URL; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| public class TimelineMetricsFilterTest { |
| |
| @Test |
| public void testAppBlacklisting() throws Exception{ |
| |
| Configuration metricsConf = new Configuration(); |
| metricsConf.set("timeline.metrics.apps.blacklist", "hbase,datanode,nimbus"); |
| TimelineMetricConfiguration configuration = EasyMock.createNiceMock(TimelineMetricConfiguration.class); |
| expect(configuration.getMetricsConf()).andReturn(metricsConf).once(); |
| replay(configuration); |
| |
| TimelineMetricsFilter.initializeMetricFilter(configuration); |
| |
| TimelineMetric timelineMetric = new TimelineMetric(); |
| |
| timelineMetric.setAppId("hbase"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setAppId("namenode"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setAppId("nimbus"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| } |
| |
| @Test |
| public void testMetricWhitelisting() throws Exception { |
| |
| Configuration metricsConf = new Configuration(); |
| TimelineMetricConfiguration configuration = EasyMock.createNiceMock(TimelineMetricConfiguration.class); |
| expect(configuration.getMetricsConf()).andReturn(metricsConf).once(); |
| expect(configuration.isWhitelistingEnabled()).andReturn(true).anyTimes(); |
| replay(configuration); |
| |
| metricsConf.set("timeline.metrics.whitelist.file", getTestWhitelistFilePath()); |
| TimelineMetricsFilter.initializeMetricFilter(configuration); |
| |
| TimelineMetric timelineMetric = new TimelineMetric(); |
| |
| timelineMetric.setMetricName("cpu_system"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("cpu_system1"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("jvm.JvmMetrics.MemHeapUsedM"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("dfs.FSNamesystem.TotalFiles"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| } |
| |
| @Test |
| public void testTogether() throws Exception { |
| |
| Configuration metricsConf = new Configuration(); |
| metricsConf.set("timeline.metrics.apps.blacklist", "hbase,datanode,nimbus"); |
| TimelineMetricConfiguration configuration = EasyMock.createNiceMock(TimelineMetricConfiguration.class); |
| expect(configuration.getMetricsConf()).andReturn(metricsConf).once(); |
| replay(configuration); |
| |
| metricsConf.set("timeline.metrics.whitelist.file", getTestWhitelistFilePath()); |
| |
| TimelineMetricsFilter.initializeMetricFilter(configuration); |
| |
| TimelineMetric timelineMetric = new TimelineMetric(); |
| |
| timelineMetric.setMetricName("cpu_system"); |
| timelineMetric.setAppId("hbase"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("cpu_system"); |
| timelineMetric.setAppId("HOST"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("jvm.JvmMetrics.MemHeapUsedM"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("dfs.FSNamesystem.TotalFiles"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| } |
| |
| @Test |
| public void testAmshbaseWhitelisting() throws Exception { |
| |
| TimelineMetricConfiguration configuration = EasyMock.createNiceMock(TimelineMetricConfiguration.class); |
| |
| Configuration metricsConf = new Configuration(); |
| expect(configuration.getMetricsConf()).andReturn(metricsConf).once(); |
| |
| Set<String> whitelist = new HashSet(); |
| whitelist.add("regionserver.Server.Delete_99th_percentile"); |
| whitelist.add("regionserver.Server.Delete_max"); |
| whitelist.add("regionserver.Server.Delete_mean"); |
| expect(configuration.getAmshbaseWhitelist()).andReturn(whitelist).once(); |
| |
| replay(configuration); |
| |
| TimelineMetricsFilter.initializeMetricFilter(configuration); |
| |
| TimelineMetric timelineMetric = new TimelineMetric(); |
| |
| timelineMetric.setMetricName("regionserver.Server.Delete_max"); |
| timelineMetric.setAppId("ams-hbase"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("regionserver.Server.Delete_min3333"); |
| timelineMetric.setAppId("ams-hbase"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("jvm.JvmMetrics.MemHeapUsedM"); |
| timelineMetric.setAppId("hbase"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| } |
| |
| @Test |
| public void testHybridFilter() throws Exception { |
| |
| // Whitelist Apps - namenode, nimbus |
| // Blacklist Apps - datanode, kafka_broker |
| // Accept ams-hbase whitelisting. |
| // Reject non whitelisted metrics from non whitelisted Apps (Say hbase) |
| |
| TimelineMetricConfiguration configuration = EasyMock.createNiceMock(TimelineMetricConfiguration.class); |
| |
| Configuration metricsConf = new Configuration(); |
| metricsConf.set("timeline.metrics.apps.whitelist", "namenode,nimbus"); |
| metricsConf.set("timeline.metrics.apps.blacklist", "datanode,kafka_broker"); |
| metricsConf.set("timeline.metrics.whitelist.file", getTestWhitelistFilePath()); |
| expect(configuration.getMetricsConf()).andReturn(metricsConf).once(); |
| |
| Set<String> whitelist = new HashSet<>(); |
| whitelist.add("regionserver.Server.Delete_99th_percentile"); |
| whitelist.add("regionserver.Server.Delete_max"); |
| whitelist.add("regionserver.Server.Delete_mean"); |
| expect(configuration.getAmshbaseWhitelist()).andReturn(whitelist).once(); |
| |
| expect(configuration.isWhitelistingEnabled()).andReturn(true).anyTimes(); |
| |
| replay(configuration); |
| |
| TimelineMetricsFilter.initializeMetricFilter(configuration); |
| |
| TimelineMetric timelineMetric = new TimelineMetric(); |
| |
| //Test App Whitelisting |
| timelineMetric.setMetricName("metric.a.b.c"); |
| timelineMetric.setAppId("namenode"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("metric.d.e.f"); |
| timelineMetric.setAppId("nimbus"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| //Test App Blacklisting |
| timelineMetric.setMetricName("metric.d.e.f"); |
| timelineMetric.setAppId("datanode"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("metric.d.e.f"); |
| timelineMetric.setAppId("kafka_broker"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| |
| //Test ams-hbase Whitelisting |
| timelineMetric.setMetricName("regionserver.Server.Delete_max"); |
| timelineMetric.setAppId("ams-hbase"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("regionserver.Server.Delete_min3333"); |
| timelineMetric.setAppId("ams-hbase"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("regionserver.Server.Delete_mean"); |
| timelineMetric.setAppId("ams-hbase"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| //Test Metric Whitelisting |
| timelineMetric.setMetricName("regionserver.WAL.SyncTime_max"); |
| timelineMetric.setAppId("hbase"); |
| Assert.assertTrue(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| |
| timelineMetric.setMetricName("regionserver.WAL.metric.not.needed"); |
| timelineMetric.setAppId("hbase"); |
| Assert.assertFalse(TimelineMetricsFilter.acceptMetric(timelineMetric)); |
| } |
| |
| private static String getTestWhitelistFilePath() throws URISyntaxException { |
| return ClassLoader.getSystemResource("test_data/metric_whitelist.dat").toURI().getPath(); |
| } |
| } |