/* * Copyright (c) 2008-2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.hds.metering.smis.processor; import java.net.URI; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.cim.CIMInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.constraint.AlternateIdConstraint; import com.emc.storageos.db.client.constraint.URIQueryResultList; import com.emc.storageos.db.client.model.Stat; import com.emc.storageos.db.client.model.StorageSystem; import com.emc.storageos.hds.HDSConstants; import com.emc.storageos.plugins.AccessProfile; import com.emc.storageos.plugins.BaseCollectionException; import com.emc.storageos.plugins.common.Constants; import com.emc.storageos.plugins.common.domainmodel.Operation; import com.emc.storageos.volumecontroller.impl.ControllerUtils; import com.emc.storageos.volumecontroller.impl.plugins.metering.smis.processor.CommonStatsProcessor; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; /** * Processor responsible to process the Hitachi StorageSystem statistics & persist them db. * * Supported metrics: [TotalIOs, KBytesTransferred] * Other attributes: [ElementType, StatisticTime] * */ public class StorageSystemStatsProcessor extends CommonStatsProcessor { private Logger logger = LoggerFactory.getLogger(StorageSystemStatsProcessor.class); private static final String TOTALIOS = "TotalIOs"; private static final String KBYTESTRANSFERRED = "KBytesTransferred"; private static final String STATISTICTIME = "StatisticTime"; private static final String INSTANCE_ID = "InstanceID"; @SuppressWarnings("unchecked") @Override public void processResult(Operation operation, Object resultObj, Map<String, Object> keyMap) throws BaseCollectionException { Iterator<CIMInstance> systemStatsResponseItr = (Iterator<CIMInstance>) resultObj; AccessProfile profile = (AccessProfile) keyMap.get(Constants.ACCESSPROFILE); DbClient dbClient = (DbClient) keyMap.get(Constants.dbClient); logger.info("Processing storagesystem {} stats response", profile.getSystemId()); try { List<Stat> metricsObjList = (List<Stat>) keyMap.get(Constants._Stats); while (systemStatsResponseItr.hasNext()) { CIMInstance systemStatInstance = (CIMInstance) systemStatsResponseItr .next(); Stat systemStat = new Stat(); // HUS VM.211643 systemStat.setNativeGuid(getSystemNativeGuid(systemStatInstance, dbClient)); systemStat.setResourceId(profile.getSystemId()); systemStat.setServiceType(Constants._Block); systemStat.setTimeCollected((Long) keyMap.get(Constants._TimeCollected)); Long providerCollectionTime = convertCIMStatisticTime(getCIMPropertyValue(systemStatInstance, STATISTICTIME)); if (0 != providerCollectionTime) { systemStat.setTimeInMillis(providerCollectionTime); } else { systemStat.setTimeInMillis((Long) keyMap.get(Constants._TimeCollected)); } systemStat.setTotalIOs(ControllerUtils.getLongValue(getCIMPropertyValue( systemStatInstance, TOTALIOS))); systemStat.setKbytesTransferred(ControllerUtils.getLongValue(getCIMPropertyValue( systemStatInstance, KBYTESTRANSFERRED))); metricsObjList.add(systemStat); } } catch (Exception ex) { logger.error("Failed while extracting Stats for storage System: ", ex); } finally { resultObj = null; } logger.info("Processing storagesystem {} stats response completed", profile.getSystemId()); } /** * Return the System NativeGuid based on the Stat instance returned from provider. * * @param systemStatInstance * @param dbClient * @return */ private String getSystemNativeGuid(CIMInstance systemStatInstance, DbClient dbClient) { String systemNativeGuid = null; String instanceId = getCIMPropertyValue(systemStatInstance, INSTANCE_ID); URIQueryResultList result = new URIQueryResultList(); Iterable<String> instanceIdSplitter = Splitter.on(HDSConstants.DOT_OPERATOR).limit(2).split(instanceId); String serialNo = Iterables.getLast(instanceIdSplitter); dbClient.queryByConstraint(AlternateIdConstraint.Factory.getStorageDeviceSerialNumberConstraint(serialNo), result); Iterator<URI> activeSystemListItr = result.iterator(); if (activeSystemListItr.hasNext()) { StorageSystem system = dbClient.queryObject(StorageSystem.class, activeSystemListItr.next()); systemNativeGuid = system.getNativeGuid(); } return systemNativeGuid; } }