/**
*
*/
package com.github.lpezet.antiope.metrics.aws;
import static com.github.lpezet.antiope.metrics.aws.spi.IMetricTransformer.Utils.endTimestamp;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClients;
import org.junit.Test;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.internal.StaticCredentialsProvider;
import com.amazonaws.services.cloudwatch.model.Dimension;
import com.amazonaws.services.cloudwatch.model.MetricDatum;
import com.amazonaws.services.cloudwatch.model.StandardUnit;
import com.github.lpezet.antiope.APIClientException;
import com.github.lpezet.antiope.APIServiceException;
import com.github.lpezet.antiope.be.APIConfiguration;
import com.github.lpezet.antiope.dao.DefaultRequest;
import com.github.lpezet.antiope.dao.ExecutionContext;
import com.github.lpezet.antiope.dao.HttpMethodName;
import com.github.lpezet.antiope.dao.Request;
import com.github.lpezet.antiope.dao.Response;
import com.github.lpezet.antiope.metrics.APIRequestMetrics;
import com.github.lpezet.antiope.metrics.IMetrics;
import com.github.lpezet.antiope.metrics.IMetricsCollector;
import com.github.lpezet.antiope.metrics.MetricType;
import com.github.lpezet.antiope.metrics.TimingInfo;
import com.github.lpezet.antiope.metrics.aws.Sample.MyRequest;
import com.github.lpezet.antiope.metrics.aws.spi.CompositeMetricTransformer;
import com.github.lpezet.antiope.metrics.aws.spi.Dimensions;
import com.github.lpezet.antiope.metrics.aws.spi.IMetricTransformer;
/**
* @author Luc Pezet
*
*/
public class CustomMetricSample extends BaseSample {
enum MyCustonMetric implements MetricType {
TotalResultsRequested;
}
private static class CustomMetricTransformer implements IMetricTransformer {
@Override
public List<MetricDatum> toMetricData(MetricType pMetricType, Request<?> pRequest, Response<?> pResponse) {
if (!(pMetricType instanceof MyCustonMetric)) return Collections.emptyList();
MyCustonMetric oMetric = (MyCustonMetric) pMetricType;
switch(oMetric) {
case TotalResultsRequested:
return metricOfCount(oMetric, pRequest, pResponse);
default:
return Collections.emptyList();
}
}
@Override
public boolean canHandle(MetricType pMetricType, Request<?> pRequest, Response<?> pResponse) {
return (pMetricType instanceof MyCustonMetric);
}
protected List<MetricDatum> metricOfCount(MyCustonMetric pMetricType, Request<?> pReq, Object pResp) {
IMetrics m = pReq.getMetrics();
TimingInfo ti = m.getTimingInfo();
List<Object> oValues = m.getProperty(pMetricType);
if (oValues == null || oValues.isEmpty() || oValues.get(0) == null) {
return Collections.emptyList();
}
return Collections.singletonList(new MetricDatum()
.withMetricName(pReq.getServiceName())
.withDimensions(new Dimension()
.withName(Dimensions.MetricType.name())
.withValue(pMetricType.name()))
.withUnit(StandardUnit.Count)
.withValue(Double.valueOf( oValues.get(0).toString() ))
.withTimestamp(endTimestamp(ti)));
}
}
private static class Client extends SimpleClient {
public Client(APIConfiguration pConfiguration, HttpClient pHttpClient, int pPort) {
super(pConfiguration, pHttpClient, pPort);
}
public String getIt2() {
MyRequest oMyRequest = new MyRequest();
ExecutionContext oContext = createExecutionContext(oMyRequest);
IMetrics oMetrics = oContext.getMetrics();
Request<MyRequest> oRequest = null;
Response<String> oResponse = null;
oMetrics.startEvent(APIRequestMetrics.ClientExecuteTime);
try {
oMetrics.startEvent(APIRequestMetrics.RequestMarshallTime);
try {
oMetrics.addProperty(MyCustonMetric.TotalResultsRequested, 10);
oRequest = new DefaultRequest<MyRequest>(oMyRequest, "GetIt2");
oRequest.setHttpMethod(HttpMethodName.GET);
oRequest.setResourcePath("/json/");
oRequest.setMetrics(oMetrics);
} finally {
oMetrics.endEvent(APIRequestMetrics.RequestMarshallTime);
}
Response<String> oActualResponse = invoke(oRequest, null, oContext);
return oActualResponse.getAPIResponse();
} catch (APIServiceException e) {
throw e;
} catch (Exception e) {
throw new APIClientException(e);
} finally {
endClientExecution(oMetrics, oRequest, oResponse);
}
}
}
@Test(timeout=60000)
public void doIt() throws Exception {
HttpClient oHttpClient = HttpClients.createDefault();
APIConfiguration oAPIConfig = new APIConfiguration();
oAPIConfig.setProfilingEnabled(true);
Client oClient = new Client(oAPIConfig, oHttpClient, getPort());
Config oConfig = new Config();
CloudWatchConfig oCWConfig = new CloudWatchConfig();
oConfig.setCloudWatchConfig(oCWConfig);
oCWConfig.setCloudWatchEndPoint("http://localhost:" + getCloudWatchPort());
oCWConfig.setQueuePollTimeoutMilli(TimeUnit.SECONDS.toMillis(5));
oCWConfig.setCredentialsProvider(new StaticCredentialsProvider(new BasicAWSCredentials("", "")));
MetricsConfig oMConfig = new MetricsConfig();
oConfig.setMetricsConfig(oMConfig);
oMConfig.setMetricNameSpace("Antiope/Test2");
// Reset default metrics to just Client Execute Time
oMConfig.getMetricsRegistry().setMetricTypes(Arrays.asList( APIRequestMetrics.ClientExecuteTime, MyCustonMetric.TotalResultsRequested));
oMConfig.setMetricTransformer(
new CompositeMetricTransformer()
//.with( new PredefinedMetricTransformer() )
.with( new CustomMetricTransformer() ));
//oMConfig.getMetricsRegistry().setMetricTypes(new ArrayList<MetricType>());
oMConfig.setMachineMetricExcluded(true);
IMetricsCollector oMetricsCollector = new DefaultMetricsCollectorFactory(oConfig).getInstance();
oClient.setMetricsCollector(oMetricsCollector);
for (int i = 0; i < 20; i++) {
Thread.sleep(1000);
oClient.getIt2();
}
}
}