/*
* Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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 com.amazonaws.metrics.internal.cloudwatch.provider.transform;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.logging.LogFactory;
import com.amazonaws.annotation.ThreadSafe;
import com.amazonaws.Request;
import com.amazonaws.Response;
import com.amazonaws.metrics.MetricType;
import com.amazonaws.metrics.internal.cloudwatch.spi.AWSMetricTransformerFactory;
import com.amazonaws.metrics.internal.cloudwatch.spi.Dimensions;
import com.amazonaws.metrics.internal.cloudwatch.spi.RequestMetricTransformer;
import com.amazonaws.services.cloudwatch.model.Dimension;
import com.amazonaws.services.cloudwatch.model.MetricDatum;
import com.amazonaws.services.cloudwatch.model.StandardUnit;
import com.amazonaws.services.dynamodbv2.metrics.DynamoDBRequestMetric;
import com.amazonaws.services.dynamodbv2.model.ConsumedCapacity;
/**
* An internal service provider implementation for an DyanmoDB specific request
* metric transformer.
*
* This class is loaded only if there are Amazon DyanmoDB specific predefined
* metrics to be processed.
*
* @see AWSMetricTransformerFactory
*/
@ThreadSafe
public class DynamoDBRequestMetricTransformer implements RequestMetricTransformer {
@Override
public List<MetricDatum> toMetricData(MetricType metricType,
Request<?> request, Response<?> response) {
try {
return toMetricData0(metricType, request, response);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
LogFactory.getLog(getClass()).debug("", e.getCause());
} catch (Exception e) {
LogFactory.getLog(getClass()).debug("", e);
}
return null;
}
private List<MetricDatum> toMetricData0(MetricType metricType,
Request<?> req, Response<?> response) throws SecurityException,
NoSuchMethodException, IllegalAccessException,
InvocationTargetException {
if (!(metricType instanceof DynamoDBRequestMetric))
return null;
// Predefined metrics across all aws http clients
DynamoDBRequestMetric predefined = (DynamoDBRequestMetric) metricType;
switch(predefined) {
case DynamoDBConsumedCapacity:
if (response == null)
return Collections.emptyList();
Object awsResponse = response.getAwsResponse();
Method method = awsResponse.getClass().getMethod("getConsumedCapacity");
Object value = method.invoke(awsResponse);
if (!(value instanceof ConsumedCapacity))
return Collections.emptyList();
ConsumedCapacity consumedCapacity = (ConsumedCapacity) value;
Double units = consumedCapacity.getCapacityUnits();
if (units == null)
return Collections.emptyList();
String tableName = consumedCapacity.getTableName();
List<Dimension> dims = new ArrayList<Dimension>();
dims.add(new Dimension()
.withName(Dimensions.MetricType.name())
.withValue(metricType.name()));
// request type specific
dims.add(new Dimension()
.withName(Dimensions.RequestType.name())
.withValue(requestType(req)));
// table specific
dims.add(new Dimension()
.withName(DynamoDBDimensions.TableName.name())
.withValue(tableName));
MetricDatum datum = new MetricDatum()
.withMetricName(req.getServiceName())
.withDimensions(dims)
.withUnit(StandardUnit.Count)
.withValue(units);
return Collections.singletonList(datum);
default:
return Collections.emptyList();
}
}
/**
* Returns the name of the type of request.
*/
private String requestType(Request<?> req) {
return req.getOriginalRequest().getClass().getSimpleName();
}
}