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.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 java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import static com.appdynamics.monitors.hadoop.communicator.AmbariMetricsFetcherTaskTest.getResourceAsJson;
/**
* Created by abey.tom on 12/1/16.
*/
public class ResourceMgrMetricsFetcherTaskTest extends AManagedMonitor {
public static final Logger logger = LoggerFactory.getLogger(ResourceMgrMetricsFetcherTaskTest.class);
@Test
public void resourceMgrStatsReaderTest() throws IOException {
Runnable runnable = Mockito.mock(Runnable.class);
MetricWriteHelper writer = MetricWriteHelperFactory.create(this);
writer = Mockito.spy(writer);
final List<MetricOutput> expected = MetricOutput.from("/data/resource-manager-expected-output.txt");
Mockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
Object[] arguments = invocationOnMock.getArguments();
System.out.println(arguments[0] + "," + arguments[1] + "," + arguments[2]);
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-resource-manager.xml", MetricConfig.class);
configuration.setConfigYml("src/main/resources/conf/config.yml", "resourceManagerMonitor");
List<Map<String, ?>> servers = (List<Map<String, ?>>) configuration.getConfigYml().get("servers");
Runnable fetcher = createTask(configuration, servers);
fetcher.run();
Assert.assertTrue("It seems that these metrics are not reported " + expected, expected.isEmpty());
}
private ResourceMgrMetricsFetcherTask createTask(MonitorConfiguration configuration, List<Map<String, ?>> servers) {
Map<String, ?> server = servers.get(0);
ResourceMgrMetricsFetcherTask task = new ResourceMgrMetricsFetcherTask(configuration, server);
task = Mockito.spy(task);
Mockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) throws Throwable {
String url = (String) invocation.getArguments()[0];
if (url.endsWith("cluster/metrics")) {
return getResourceAsJson("/data/resourcemanager/cluster-metrics.json");
} else if (url.endsWith("cluster/nodes")) {
return getResourceAsJson("/data/resourcemanager/nodes.json");
} else if (url.endsWith("cluster/scheduler")) {
return getResourceAsJson("/data/resourcemanager/scheduler-fair.json");
}else if (url.contains("cluster/apps?")) {
return getResourceAsJson("/data/resourcemanager/apps.json");
}
System.out.println(url);
return null;
}
}).when(task).getResponseAsJson(Mockito.anyString());
return task;
}
public TaskOutput execute(Map<String, String> map, TaskExecutionContext taskExecutionContext) throws TaskExecutionException {
return null;
}
}