package com.appdynamics.monitors.hadoop.communicator;
import com.appdynamics.extensions.conf.MonitorConfiguration;
import com.appdynamics.extensions.util.MetricWriteHelper;
import com.appdynamics.extensions.util.MetricWriteHelperFactory;
import com.appdynamics.monitors.hadoop.MetricOutput;
import com.appdynamics.monitors.hadoop.SynchronousExecutorService;
import com.appdynamics.monitors.hadoop.input.MetricConfig;
import com.singularity.ee.agent.systemagent.api.AManagedMonitor;
import com.singularity.ee.agent.systemagent.api.TaskExecutionContext;
import com.singularity.ee.agent.systemagent.api.TaskOutput;
import com.singularity.ee.agent.systemagent.api.exception.TaskExecutionException;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* Created by abey.tom on 11/10/16.
*/
public class AmbariMetricsFetcherTaskTest extends AManagedMonitor {
public static final Logger logger = LoggerFactory.getLogger(AmbariMetricsFetcherTaskTest.class);
@Test
public void readClustersStat() throws JAXBException, InterruptedException, IOException {
Runnable runnable = Mockito.mock(Runnable.class);
MetricWriteHelper writer = MetricWriteHelperFactory.create(this);
writer = Mockito.spy(writer);
final List<MetricOutput> expected = MetricOutput.from("/data/ambari-expected-output.txt");
Mockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
Object[] arguments = invocationOnMock.getArguments();
MetricOutput output = new MetricOutput((String) arguments[0], (BigDecimal) arguments[1], (String) arguments[2]);
boolean remove = expected.remove(output);
if (!remove) {
logger.error("Cannot find the value in the expected values {}", output);
} else{
logger.debug("Received an expected metric "+output);
}
return null;
}
}).when(writer).printMetric(Mockito.anyString(), Mockito.any(BigDecimal.class), Mockito.anyString());
MonitorConfiguration configuration = new MonitorConfiguration("Test", runnable, writer);
configuration = Mockito.spy(configuration);
Mockito.doReturn(new SynchronousExecutorService()).when(configuration).getExecutorService();
configuration.setMetricsXml("src/main/resources/conf/metrics-ambari.xml", MetricConfig.class);
configuration.setConfigYml("src/main/resources/conf/config.yml", "ambariMonitor");
List<Map<String, ?>> servers = (List<Map<String, ?>>) configuration.getConfigYml().get("servers");
AmbariMetricsFetcherTask fetcher = createTask(configuration, servers);
fetcher.run();
Assert.assertTrue("It seems that these metrics are not reported " + expected, expected.isEmpty());
}
private AmbariMetricsFetcherTask createTask(MonitorConfiguration configuration, List<Map<String, ?>> servers) {
AmbariMetricsFetcherTask fetcher = new AmbariMetricsFetcherTask(configuration, servers.get(0));
fetcher = Mockito.spy(fetcher);
Mockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) throws Throwable {
String url = (String) invocation.getArguments()[0];
if (url.contains("clusters?fields=")) {
return getResourceAsJson("/data/ambari/clusters.json");
}
//hosts and children
else if (url.endsWith("hosts/localhost.localdomain")) {
return getResourceAsJson("/data/ambari/hosts-localhost.localdomain.json");
} else if (url.endsWith("hosts/localhost.localdomain/host_components/DATANODE")) {
return getResourceAsJson("/data/ambari/hosts-localhost.localdomain-host_components-datanode.json");
} else if (url.endsWith("hosts/localhost.localdomain/host_components/HBASE_MASTER")) {
return getResourceAsJson("/data/ambari/hosts-localhost.localdomain-host_components-hbase_master.json");
} else if (url.endsWith("hosts/localhost.localdomain/host_components/NODEMANAGER")) {
return getResourceAsJson("/data/ambari/hosts-localhost.localdomain-host_components-nodemanager.json");
}
//Services
else if (url.endsWith("services/AMBARI_METRICS")) {
return getResourceAsJson("/data/ambari/services-ambari-metrics.json");
} else if (url.endsWith("services/HBASE")) {
return getResourceAsJson("/data/ambari/services-hbase.json");
} else if (url.endsWith("services/HDFS")) {
return getResourceAsJson("/data/ambari/services-hdfs.json");
} else if (url.endsWith("services/ZOOKEEPER")) {
return getResourceAsJson("/data/ambari/services-zookeeper.json");
}
// Services Components
else if (url.endsWith("services/ZOOKEEPER/components/ZOOKEEPER_CLIENT")) {
return getResourceAsJson("/data/ambari/services-zookeeper-components-zookeeper_client.json");
} else if (url.endsWith("services/ZOOKEEPER/components/ZOOKEEPER_SERVER")) {
return getResourceAsJson("/data/ambari/services-zookeeper-components-zookeeper_server.json");
} else if (url.endsWith("services/HBASE/components/HBASE_CLIENT")) {
return getResourceAsJson("/data/ambari/services-hbase-components-hbase_client.json");
} else if (url.endsWith("services/HBASE/components/HBASE_MASTER")) {
return getResourceAsJson("/data/ambari/services-hbase-components-hbase_master.json");
} else {
logger.debug("There is no resource for {}", url);
return null;
}
}
}).when(fetcher).getResponseAsJson(Mockito.anyString());
return fetcher;
}
public static JsonNode getResourceAsJson(String path) throws IOException {
InputStream in = AmbariMetricsFetcherTask.class.getResourceAsStream(path);
return new ObjectMapper().readTree(in);
}
public TaskOutput execute(Map<String, String> map, TaskExecutionContext taskExecutionContext) throws TaskExecutionException {
return null;
}
}