blob: 8c17ba1ac8d738c0e68e5d23b3ecb9e89a1e73ee [file] [log] [blame]
/**
* 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 junit.framework.Assert;
import org.apache.hadoop.metrics2.host.aggregator.TimelineMetricsHolder;
import org.apache.hadoop.metrics2.host.aggregator.TimelineMetricsHolderTest;
import org.junit.Test;
import org.apache.hadoop.conf.Configuration;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class AggregatedMetricsPublisherTest {
@Test
public void testProcessMetrics() throws Exception {
Configuration configuration = new Configuration();
TimelineMetricsHolder timelineMetricsHolder = TimelineMetricsHolder.getInstance();
timelineMetricsHolder.extractMetricsForAggregationPublishing();
timelineMetricsHolder.extractMetricsForRawPublishing();
TreeMap<Long, Double> metric1App1Metrics = new TreeMap<>();
metric1App1Metrics.put(1L, 1d);
metric1App1Metrics.put(2L, 2d);
metric1App1Metrics.put(3L, 3d);
timelineMetricsHolder.putMetricsForAggregationPublishing(getTimelineMetricsForAppId("metricName1", "app1", metric1App1Metrics));
TreeMap<Long, Double> metric2App2Metrics = new TreeMap<>();
metric2App2Metrics.put(1L, 4d);
metric2App2Metrics.put(2L, 5d);
metric2App2Metrics.put(3L, 6d);
timelineMetricsHolder.putMetricsForAggregationPublishing(getTimelineMetricsForAppId("metricName2", "app2", metric2App2Metrics));
TreeMap<Long, Double> metric3App3Metrics = new TreeMap<>();
metric3App3Metrics.put(1L, 7d);
metric3App3Metrics.put(2L, 8d);
metric3App3Metrics.put(3L, 9d);
timelineMetricsHolder.putMetricsForAggregationPublishing(getTimelineMetricsForAppId("metricName3", "app3", metric3App3Metrics));
AggregatedMetricsPublisher aggregatedMetricsPublisher =
new AggregatedMetricsPublisher(TimelineMetricsHolder.getInstance(), configuration, 60);
String aggregatedJson = aggregatedMetricsPublisher.processMetrics(timelineMetricsHolder.extractMetricsForAggregationPublishing());
String expectedMetric1App1 = "{\"timelineMetric\":{\"metadata\":{},\"metricname\":\"metricName1\",\"appid\":\"app1\",\"starttime\":0,\"metrics\":{}},\"metricAggregate\":{\"sum\":6.0,\"deviation\":0.0,\"max\":3.0,\"min\":1.0,\"numberOfSamples\":3}}";
String expectedMetric2App2 = "{\"timelineMetric\":{\"metadata\":{},\"metricname\":\"metricName2\",\"appid\":\"app2\",\"starttime\":0,\"metrics\":{}},\"metricAggregate\":{\"sum\":15.0,\"deviation\":0.0,\"max\":6.0,\"min\":4.0,\"numberOfSamples\":3}}";
String expectedMetric3App3 = "{\"timelineMetric\":{\"metadata\":{},\"metricname\":\"metricName3\",\"appid\":\"app3\",\"starttime\":0,\"metrics\":{}},\"metricAggregate\":{\"sum\":24.0,\"deviation\":0.0,\"max\":9.0,\"min\":7.0,\"numberOfSamples\":3}}";
Assert.assertNotNull(aggregatedJson);
Assert.assertTrue(aggregatedJson.contains(expectedMetric1App1));
Assert.assertTrue(aggregatedJson.contains(expectedMetric3App3));
Assert.assertTrue(aggregatedJson.contains(expectedMetric2App2));
}
@Test
public void testGetPostUrl() {
Configuration configuration = new Configuration();
AggregatedMetricsPublisher aggregatedMetricsPublisher =
new AggregatedMetricsPublisher(TimelineMetricsHolder.getInstance(), configuration, 1);
String actualURL = aggregatedMetricsPublisher.getPostUrl();
String expectedURL = "%s://%s:%s/ws/v1/timeline/metrics/aggregated";
Assert.assertNotNull(actualURL);
Assert.assertEquals(expectedURL, actualURL);
}
@Test
public void testGetCollectorUri() {
//default configuration
Configuration configuration = new Configuration();
AbstractMetricPublisher aggregatedMetricsPublisher =
new AggregatedMetricsPublisher(TimelineMetricsHolder.getInstance(), configuration, 1);
String actualURL = aggregatedMetricsPublisher.getCollectorUri("c6401.ambari.apache.org");
String expectedURL = "http://c6401.ambari.apache.org:6188/ws/v1/timeline/metrics/aggregated";
Assert.assertNotNull(actualURL);
Assert.assertEquals(expectedURL, actualURL);
//https configuration
configuration = new Configuration();
configuration.set("timeline.metrics.service.http.policy", "HTTPS_ONLY");
aggregatedMetricsPublisher =
new AggregatedMetricsPublisher(TimelineMetricsHolder.getInstance(), configuration, 1);
actualURL = aggregatedMetricsPublisher.getCollectorUri("c6402.ambari.apache.org");
expectedURL = "https://c6402.ambari.apache.org:6188/ws/v1/timeline/metrics/aggregated";
Assert.assertNotNull(actualURL);
Assert.assertEquals(expectedURL, actualURL);
//custom port configuration
configuration = new Configuration();
configuration.set("timeline.metrics.service.webapp.address", "0.0.0.0:8888");
aggregatedMetricsPublisher =
new AggregatedMetricsPublisher(TimelineMetricsHolder.getInstance(), configuration, 1);
actualURL = aggregatedMetricsPublisher.getCollectorUri("c6403.ambari.apache.org");
expectedURL = "http://c6403.ambari.apache.org:8888/ws/v1/timeline/metrics/aggregated";
Assert.assertNotNull(actualURL);
Assert.assertEquals(expectedURL, actualURL);
}
@Test
public void testGetMetricsFromCache() throws InterruptedException {
TimelineMetricsHolder timelineMetricsHolder = TimelineMetricsHolder.getInstance(4,4);
timelineMetricsHolder.extractMetricsForAggregationPublishing();
timelineMetricsHolder.extractMetricsForRawPublishing();
timelineMetricsHolder.putMetricsForAggregationPublishing(TimelineMetricsHolderTest.getTimelineMetricsWithAppID("aggr1"));
timelineMetricsHolder.putMetricsForRawPublishing(TimelineMetricsHolderTest.getTimelineMetricsWithAppID("raw"));
timelineMetricsHolder.putMetricsForAggregationPublishing(TimelineMetricsHolderTest.getTimelineMetricsWithAppID("aggr2"));
Configuration configuration = new Configuration();
AggregatedMetricsPublisher aggregatedMetricsPublisher =
new AggregatedMetricsPublisher(TimelineMetricsHolder.getInstance(), configuration, 1);
Map<String, TimelineMetrics> metricsFromCache = aggregatedMetricsPublisher.getMetricsFromCache();
Assert.assertNotNull(metricsFromCache);
Collection<TimelineMetrics> actualTimelineMetrics = metricsFromCache.values();
Assert.assertNotNull(actualTimelineMetrics);
Assert.assertEquals(2, actualTimelineMetrics.size());
for (TimelineMetrics timelineMetrics : actualTimelineMetrics) {
List<TimelineMetric> metrics = timelineMetrics.getMetrics();
Assert.assertEquals(1, metrics.size());
Assert.assertTrue(metrics.get(0).getAppId().contains("aggr"));
}
}
TimelineMetrics getTimelineMetricsForAppId(String metricName, String appId, TreeMap<Long, Double> metricValues) {
TimelineMetric timelineMetric = new TimelineMetric();
timelineMetric.setMetricName(metricName);
timelineMetric.setAppId(appId);
timelineMetric.setMetricValues(metricValues);
TimelineMetrics timelineMetrics = new TimelineMetrics();
timelineMetrics.addOrMergeTimelineMetric(timelineMetric);
return timelineMetrics;
}
}