#include "StatsCollector.h" #include #include #include StatsCollector::StatsCollector(App* app) : PThread("StatsCollector"), app(app) {} void StatsCollector::run() { try { LOG(GENERAL, DEBUG, "Component started."); registerSignalHandler(); requestLoop(); LOG(GENERAL, DEBUG, "Component stopped."); } catch (std::exception& e) { app->handleComponentException(e); } } void StatsCollector::requestLoop() { bool collectClientOpsByNode = app->getConfig()->getCollectClientOpsByNode(); bool collectClientOpsByUser = app->getConfig()->getCollectClientOpsByUser(); // intially wait one query interval before requesting stats to give NodeListRequestor the time // to retrieve the node lists while (!waitForSelfTerminateOrder(std::chrono::milliseconds( app->getConfig()->getStatsRequestInterval()).count())) { { LOG(GENERAL, DEBUG, "Requesting Stats..."); std::unique_lock lock(mutex); workItemCounter = 0; metaResults.clear(); storageResults.clear(); // collect data const auto& metaNodes = app->getMetaNodes()->referenceAllNodes(); for (auto node = metaNodes.begin(); node != metaNodes.end(); node++) { workItemCounter++; app->getWorkQueue()->addIndirectWork( new RequestMetaDataWork(std::static_pointer_cast(*node), this, collectClientOpsByNode, collectClientOpsByUser)); } const auto& storageNodes = app->getStorageNodes()->referenceAllNodes(); for (auto node = storageNodes.begin(); node != storageNodes.end(); node++) { workItemCounter++; app->getWorkQueue()->addIndirectWork( new RequestStorageDataWork(std::static_pointer_cast(*node), this, collectClientOpsByNode, collectClientOpsByUser)); } while (workItemCounter > 0) condVar.wait(lock); // write data for (auto iter = metaResults.begin(); iter != metaResults.end(); iter++) { app->getTSDB()->insertMetaNodeData(iter->node, iter->data); for (auto listIter = iter->highResStatsList.begin(); listIter != iter->highResStatsList.end(); listIter++) { app->getTSDB()->insertHighResMetaNodeData(iter->node, *listIter); } if (collectClientOpsByNode) { for (auto mapIter = iter->ipOpsUnorderedMap.begin(); mapIter != iter->ipOpsUnorderedMap.end(); mapIter++) { ipMetaClientOps.addOpsList(mapIter->first, mapIter->second); } } if (collectClientOpsByUser) { for (auto mapIter = iter->userOpsUnorderedMap.begin(); mapIter != iter->userOpsUnorderedMap.end(); mapIter++) { userMetaClientOps.addOpsList(mapIter->first, mapIter->second); } } } for (auto iter = storageResults.begin(); iter != storageResults.end(); iter++) { app->getTSDB()->insertStorageNodeData(iter->node, iter->data); for (auto listIter = iter->highResStatsList.begin(); listIter != iter->highResStatsList.end(); listIter++) { app->getTSDB()->insertHighResStorageNodeData(iter->node, *listIter); } for (auto listIter = iter->storageTargetList.begin(); listIter != iter->storageTargetList.end(); listIter++) { app->getTSDB()->insertStorageTargetsData(iter->node, *listIter); } if (collectClientOpsByNode) { for (auto mapIter = iter->ipOpsUnorderedMap.begin(); mapIter != iter->ipOpsUnorderedMap.end(); mapIter++) { ipStorageClientOps.addOpsList(mapIter->first, mapIter->second); } } if (collectClientOpsByUser) { for (auto mapIter = iter->userOpsUnorderedMap.begin(); mapIter != iter->userOpsUnorderedMap.end(); mapIter++) { userStorageClientOps.addOpsList(mapIter->first, mapIter->second); } } } if (collectClientOpsByNode) { processClientOps(ipMetaClientOps, NODETYPE_Meta, false); processClientOps(ipStorageClientOps, NODETYPE_Storage, false); } if (collectClientOpsByUser) { processClientOps(userMetaClientOps, NODETYPE_Meta, true); processClientOps(userStorageClientOps, NODETYPE_Storage, true); } app->getTSDB()->write(); } } } void StatsCollector::processClientOps(ClientOps& clientOps, NodeType nodeType, bool perUser) { ClientOps::IdOpsMap diffOpsMap; ClientOps::OpsList sumOpsList; diffOpsMap = clientOps.getDiffOpsMap(); sumOpsList = clientOps.getDiffSumOpsList(); if (!diffOpsMap.empty()) { for (auto opsMapIter = diffOpsMap.begin(); opsMapIter != diffOpsMap.end(); opsMapIter++) { std::string id; if (perUser) { if (opsMapIter->first == ~0U) id = "undefined"; else id = StringTk::uintToStr(opsMapIter->first); } else { struct in_addr inAddr = { (in_addr_t)opsMapIter->first }; id = Socket::ipaddrToStr(inAddr); } std::map stringOpMap; unsigned opCounter = 0; for (auto opsListIter = opsMapIter->second.begin(); opsListIter != opsMapIter->second.end(); opsListIter++) { std::string opName; if (nodeType == NODETYPE_Meta) opName = OpToStringMapping::mapMetaOpNum(opCounter); else if (nodeType == NODETYPE_Storage) opName = OpToStringMapping::mapStorageOpNum(opCounter); stringOpMap[opName] = *opsListIter; opCounter++; } app->getTSDB()->insertClientNodeData(id, nodeType, stringOpMap, perUser); } } clientOps.clear(); }