/* * Copyright 2014 Amazon Technologies, Inc. * * Licensed 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://aws.amazon.com/apache2.0 * * 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.amediamanager.metrics; import java.util.Date; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Pointcut; import com.amazonaws.services.cloudwatch.model.Dimension; import com.amazonaws.services.cloudwatch.model.MetricDatum; import com.amazonaws.services.cloudwatch.model.StandardUnit; public class MetricAspect { protected final MetricBatcher metricBatcher; public MetricAspect(final MetricBatcher metricBatcher) { this.metricBatcher = metricBatcher; } @Pointcut("execution(public * com.amazonaws.services..*.*(..))") public final void sdkClients() { } @Around("sdkClients()") public final Object logMetrics(ProceedingJoinPoint pjp) throws Throwable { final String service = pjp.getSignature().getDeclaringType().getSimpleName(); final String operation = pjp.getSignature().getName(); final long startTime = System.currentTimeMillis(); Throwable exception = null; try { return pjp.proceed(); } catch (Exception e) { exception = e; throw e; } finally { emitMetrics(service, operation, startTime, exception); } } protected void emitMetrics(String service, String operation, long startTime, Throwable exception) { final MetricDatum latency = newDatum(service, operation, startTime) .withMetricName("Latency") .withUnit(StandardUnit.Milliseconds) .withValue((double)System.currentTimeMillis() - startTime); metricBatcher.addDatum("AMM", latency); final MetricDatum success = newDatum(service, operation, startTime) .withMetricName("Success") .withValue(exception == null ? 1.0 : 0.0) .withUnit(StandardUnit.Count); metricBatcher.addDatum("AMM", success); } protected MetricDatum newDatum(String service, String operation, long startTime) { return new MetricDatum().withDimensions(new Dimension().withName("Svc") .withValue(service), new Dimension().withName("Operation") .withValue(operation)) .withTimestamp(new Date(startTime)); } }