/************************************************************************* * (c) Copyright 2016 Hewlett Packard Enterprise Development Company LP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. ************************************************************************/ package com.eucalyptus.simplequeue.async; import com.eucalyptus.auth.AuthException; import com.eucalyptus.cloudwatch.common.CloudWatch; import com.eucalyptus.cloudwatch.common.msgs.Dimension; import com.eucalyptus.cloudwatch.common.msgs.Dimensions; import com.eucalyptus.cloudwatch.common.msgs.MetricData; import com.eucalyptus.cloudwatch.common.msgs.MetricDatum; import com.eucalyptus.cloudwatch.common.msgs.PutMetricDataType; import com.eucalyptus.cloudwatch.common.msgs.StatisticSet; import com.eucalyptus.component.Topology; import com.eucalyptus.simplequeue.Constants; import com.eucalyptus.simplequeue.persistence.Queue; import com.eucalyptus.simpleworkflow.stateful.NotifyResponseType; import com.eucalyptus.util.async.AsyncRequests; import com.eucalyptus.util.concurrent.ListenableFuture; import org.apache.log4j.Logger; import java.util.Date; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; /** * Created by ethomas on 10/28/16. */ public class CloudWatchClient { static final Logger LOG = Logger.getLogger(CloudWatchClient.class); private static Date roundDown5Minutes(Date date) { if (date == null) return date; long timestamp = date.getTime(); long unitStep = TimeUnit.MINUTES.toMillis(5); return new Date(timestamp - timestamp % unitStep); } public static void addSQSMetricDatum(PutMetricDataType putMetricDataType, Queue.Key queueKey, Date date, String metricName, double value, String unit) { MetricDatum metricDatum = new MetricDatum(); metricDatum.setTimestamp(roundDown5Minutes(date)); metricDatum.setDimensions(getDimensions(queueKey)); metricDatum.setMetricName(metricName); metricDatum.setValue(value); metricDatum.setUnit(unit); putMetricDataType.getMetricData().getMember().add(metricDatum); } public static void addSQSMetricDatum(PutMetricDataType putMetricDataType, Queue.Key queueKey, Date date, String metricName, double sampleCount, double minimum, double maximum, double sum, String unit) { MetricDatum metricDatum = new MetricDatum(); metricDatum.setTimestamp(roundDown5Minutes(date)); metricDatum.setDimensions(getDimensions(queueKey)); metricDatum.setMetricName(metricName); StatisticSet statisticSet = new StatisticSet(); statisticSet.setMaximum(maximum); statisticSet.setMinimum(minimum); statisticSet.setSampleCount(sampleCount); statisticSet.setSum(sum); metricDatum.setStatisticValues(statisticSet); metricDatum.setUnit(unit); putMetricDataType.getMetricData().getMember().add(metricDatum); } public static PutMetricDataType getSQSPutMetricDataType(Queue.Key queueKey) throws AuthException { PutMetricDataType putMetricDataType = new PutMetricDataType(); putMetricDataType.setUserId(queueKey.getAccountId()); putMetricDataType.markPrivileged(); putMetricDataType.setNamespace(Constants.AWS_SQS); putMetricDataType.setMetricData(new MetricData()); return putMetricDataType; } private static Dimensions getDimensions(Queue.Key queueKey) { Dimensions dimensions = new Dimensions(); Dimension dimension = new Dimension(); dimension.setName(Constants.QUEUE_NAME); dimension.setValue(queueKey.getQueueName()); dimensions.getMember().add(dimension); return dimensions; } public static void putMetricData(PutMetricDataType putMetricDataType) { try { final ListenableFuture<NotifyResponseType> dispatchFuture = AsyncRequests.dispatch(Topology.lookup(CloudWatch.class), putMetricDataType); dispatchFuture.addListener(new Runnable() { @Override public void run() { try { dispatchFuture.get(); } catch (final InterruptedException e) { LOG.info("Interrupted while sending put metric data request", e); } catch (final ExecutionException e) { LOG.error("Error while sending put metric data request", e); } } }); } catch (final Exception e) { LOG.error("Error while sending put metric data request", e); } } }