/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.plugins.metering.datadomain; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.datadomain.restapi.DataDomainClient; import com.emc.storageos.datadomain.restapi.model.DDStatsCapacityInfo; import com.emc.storageos.datadomain.restapi.model.DDStatsIntervalQuery; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.Stat; import com.emc.storageos.db.exceptions.DatabaseException; import com.emc.storageos.plugins.common.Constants; import com.emc.storageos.volumecontroller.impl.plugins.metering.CassandraInsertion; import com.emc.storageos.volumecontroller.impl.plugins.metering.ZeroRecordGenerator; public class DataDomainStatsRecorder { private static final long MINUTE_IN_SECONDS = 60; private static final long HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS; private static final long DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS; private static final long WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS; private Logger _log = LoggerFactory.getLogger(DataDomainStatsRecorder.class); private ZeroRecordGenerator zeroRecordGenerator; private CassandraInsertion statsColumnInjector; /** * Constructor. * * @param zeroRecordGenerator * @param statsColumnInjector */ public DataDomainStatsRecorder(ZeroRecordGenerator zeroRecordGenerator, CassandraInsertion statsColumnInjector) { this.zeroRecordGenerator = zeroRecordGenerator; this.statsColumnInjector = statsColumnInjector; } /** * Adds capacity stats * * @param quota * @param keyMap * @param fsNativeGuid native Guid of the file share * @param isilonApi * @return the stat */ public Stat addUsageInfo(DDStatsCapacityInfo statsCapInfo, Map<String, Object> keyMap, String fsNativeGuid, DataDomainClient ddClient) { Stat stat = zeroRecordGenerator.injectattr(keyMap, fsNativeGuid, null); if (stat != null) { try { DbClient dbClient = (DbClient) keyMap.get(Constants.dbClient); long measurementTimePeriodInSec = 0; DDStatsIntervalQuery granularity = (DDStatsIntervalQuery) keyMap.get(Constants._Granularity); switch (granularity) { case hour: measurementTimePeriodInSec = HOUR_IN_SECONDS; break; case day: measurementTimePeriodInSec = DAY_IN_SECONDS; break; case week: measurementTimePeriodInSec = WEEK_IN_SECONDS; break; } stat.setTimeCollected((Long) keyMap.get(Constants._TimeCollected)); // DD returns epochs (seconds) - convert to ms stat.setTimeInMillis(statsCapInfo.getCollectionEpoch() * 1000); long used = statsCapInfo.getLogicalCapacity().getUsed(); long total = statsCapInfo.getLogicalCapacity().getTotal(); // Convert data written from Bytes/sec to Bytes long preCompressionBytesWritten = 0; long postCompressionBytesWritten = 0; float compressionFactor = 1; if ((statsCapInfo != null) && (statsCapInfo.getDataWritten() != null)) { preCompressionBytesWritten = statsCapInfo.getDataWritten().getPreCompWritten(); postCompressionBytesWritten = statsCapInfo.getDataWritten().getPostCompWritten(); compressionFactor = statsCapInfo.getDataWritten().getCompressionFactor(); } keyMap.put(Constants._FilePreCompressionBytesWritten, preCompressionBytesWritten); keyMap.put(Constants._FilePostCompressionBytesWritten, postCompressionBytesWritten); keyMap.put(Constants._CompressionRatio, compressionFactor); // Provisioned capacity is not available for mtrees stat.setAllocatedCapacity(used); stat.setBandwidthIn(preCompressionBytesWritten); statsColumnInjector.injectColumns(stat, dbClient); _log.debug(String.format("Stat: %s: %s: provisioned(): used(%s)", stat.getResourceId(), fsNativeGuid, used)); } catch (DatabaseException ex) { _log.error("Query to db failed for FileShare id {}, skipping recording usage stat.", stat.getResourceId(), ex); } } return stat; } /** * Adds performance stats * * @param quota * @param keyMap * @param fsNativeGuid native Guid of the file share * @param isilonApi * @return the stat */ // TODO // PErformance stats are not currently available for mtrees // public Stat addPerformanceStats() { // // } }