PhoenixSwarm  5.1.1
Library to ease communication between daemons
Loading...
Searching...
No Matches
BaseDaemon.cpp
Go to the documentation of this file.
1/***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5****************************************/
6
7#include <cmath> //for std::nan
8#include "BaseDaemon.h"
9#include "PTimer.h"
10
11using namespace Swarm;
12
15 :p_optionParser(true, __PROGRAM_VERSION__)
16{
18}
19
24
26
30bool BaseDaemon::parseArgument(int argc, char** argv){
31 p_optionParser.parseArgument(argc, argv);
32 const OptionMode & defaultMode = p_optionParser.getDefaultMode();
33 PPath configurationFile;
34 defaultMode.getValue(configurationFile, "daemonconfig");
35 PString daemonName;
36 defaultMode.getValue(daemonName, "daemonname");
37 p_isFullMock = defaultMode.isOptionExist("mock");
38 p_isFullMockRecord = defaultMode.isOptionExist("mockrecord");
39 return load(configurationFile, daemonName);
40}
41
43
47void BaseDaemon::loadConfigFromNode(const ConfigNode & dico, const PString & daemonName) {
48 const ConfigNode * mapMainConfig = dico.getChild("swarm");
49 if(mapMainConfig != nullptr){
50 p_mainConfig.recvTimeoutMs = phoenix_get_value<int>(*mapMainConfig, "recv_timeout_ms", -1);
51 p_mainConfig.sendTimeoutMs = phoenix_get_value<int>(*mapMainConfig, "send_timeout_ms", -1);
52 p_mainConfig.recvFlag = fromString<PRecvFlag::PRecvFlag>(phoenix_get_string(*mapMainConfig, "recv_flag", "NON_BLOCK"));
53 p_mainConfig.sendFlag = fromString<PSendFlag::PSendFlag>(phoenix_get_string(*mapMainConfig, "send_flag", "NON_BLOCK"));
54 }
55 std::map<PString, time_t> mapTimeout;
56 const ConfigNode * extraConfigParam = nullptr;
57 daemon_read_configNode(p_config, p_mapDaemon, p_log, mapTimeout, extraConfigParam, dico, daemonName);
58
59 const ConfigNode * mapStatDaemon = dico.getChild("statistics");
60 if(mapStatDaemon != nullptr){
61 p_config.setStatDaemonName(daemon_loadString(*mapStatDaemon, "stat_daemon_name"));
62 extraLoad(mapStatDaemon);
63 }
64 p_config.setMapTimeout(mapTimeout);
65 if(p_config.getStatDaemonName() != ""){
66 if(!isDaemonExist(p_config.getStatDaemonName())){
67 p_log.getLogError() << "BaseDaemon::loadConfigFromNode : stat daemon '"<<p_config.getStatDaemonName()<<"' not found in configuration" << std::endl;
68 }
69 }
70
71 p_log.getLogInfo() << "BaseDaemon::loadConfigFromNode : loading configuration successful" << std::endl;
72 p_log.getLogInfo() << "BaseDaemon::loadConfigFromNode : ready to call addCallMethod to subscribe on received data" << std::endl;
74 if(extraConfigParam != nullptr){
75 extraLoad(extraConfigParam);
76 }
77}
78
80
85bool BaseDaemon::load(const PString & configFileContent, const PString & daemonName, ConfigFormat::ConfigFormat format){
86 ConfigNode dico;
87 daemon_load_config(p_log, dico, configFileContent, format);
88 loadConfigFromNode(dico, daemonName);
89 return true;
90}
91
93
97bool BaseDaemon::load(const PPath & fileName, const PString & daemonName){
98 ConfigNode dico;
99 daemon_load_config(p_log, dico, fileName);
100 loadConfigFromNode(dico, daemonName);
101 return true;
102}
103
105
108bool BaseDaemon::extraLoad(const ConfigNode * config){
109 return true;
110}
111
114 if(p_log.isOpen()){
115 p_log.getLogWarning() << "BaseDaemon::addCallMethod : no redefined addCallMethod " << std::endl;
116 }else{
117 std::cerr << "BaseDaemon::addCallMethod : no redefined addCallMethod (and no log file so we use std::cerr)" << std::endl;
118 }
119}
120
122
127bool BaseDaemon::callMethod(Data & result, const PString & name, const Data & parameter){
128 std::map<PString, AbstractFunction*>::iterator it(p_mapCallableMethod.find(name));
129 if(it == p_mapCallableMethod.end()){
130 getLog().getLogError() << "BaseDaemon::callMethod : function '"<<name<<"' not found" << std::endl;
131 return false;
132 }
133 return p_mapCallableMethod[name]->call(p_log, result, parameter);
134}
135
138 for(std::map<PString, AbstractFunction*>::iterator it(p_mapCallableMethod.begin()); it != p_mapCallableMethod.end(); ++it){
139 delete it->second;
140 }
141 p_mapCallableMethod.clear();
142}
143
146 p_log.getLogInfo() << "Stopping Daemon '"<<p_config.getName()<<"' at '"<<p_config.getHostName()<<"'" << std::endl;
147 p_isRun = false;
148}
149
151
154 return p_optionParser;
155}
157///Get the log of the current BaseDaemon
158
161 return p_log;
162}
163
165
168bool BaseDaemon::isDaemonExist(const PString & name) const{
169 MapDaemonConfig::const_iterator it(p_mapDaemon.find(name));
170 if(it == p_mapDaemon.end()){
171 //Then if the stat daemon does not exist in the map, it may be the current daemon
172 if(p_config.getName() == name){
173 return true;
174 }
175 }
176 if(it != p_mapDaemon.end()){
177 return true;
178 }
179
180 return false;
181}
182
184
187 p_mapMessageToBeConfirmed[message.getId()] = message;
188}
189
191
195bool BaseDaemon::getMessageToConfirm(Message & message, size_t id) const{
196 std::map<size_t, Message>::const_iterator it(p_mapMessageToBeConfirmed.find(id));
197 if(it != p_mapMessageToBeConfirmed.end()){
198 message = it->second;
199 return true;
200 }
201 return false;
202}
203
205
208void BaseDaemon::processConfirmedMessage(size_t id, time_t currentTime){
209 std::map<size_t, Message>::const_iterator it(p_mapMessageToBeConfirmed.find(id));
210 if(it != p_mapMessageToBeConfirmed.end()){
211 getLog().getLogInfo() << "BaseDaemon::processConfirmedMessage : adding statistics for processed transaction " << id << std::endl;
212 const Message & message = it->second;
213 time_t ellapsedTime = currentTime - message.getSendTime();
214 for(const PString & receiver : message.getVecRecver()){
215 getLog().getLogDebug() << "BaseDaemon::processConfirmedMessage : add statistic for receiver : " << receiver << std::endl;
216 getCommunicationStat(receiver, message.getData().getType(), ellapsedTime, p_config.getStatNbBin(), p_config.getStatHistLowerBound(), p_config.getStatHistUpperBound());
217 }
218 // Remove the confirmed message
219 getLog().getLogInfo() << "BaseDaemon::removeConfirmedMessage : remove confirmed transaction " << id << std::endl;
221 }else{
222 getLog().getLogError() << "BaseDaemon::processConfirmedMessage : transaction " << id << " not found in p_mapMessageToBeConfirmed" << std::endl;
223 }
224}
225
227
229void BaseDaemon::checkMessageTimeout(time_t currentTime){
230 std::vector<size_t> messagesToRemove;
231 for(auto it = p_mapMessageToBeConfirmed.begin(); it != p_mapMessageToBeConfirmed.end(); ++it){
232 const size_t & messageId = it->first;
233 const Message & message = it->second;
234 time_t elapsedTime = currentTime - message.getSendTime();
235 if(message.getVecRecver().size() == 0lu){
236 getLog().getLogError() << "BaseDaemon::checkMessageTimeout() : message " << messageId << " has no receiver." << std::endl;
237 continue;
238 }
239 std::map<PString, time_t>::const_iterator timeoutIt = p_config.getMapTimeout().find(message.getVecRecver().front());
240 if(timeoutIt == p_config.getMapTimeout().end()){
241 getLog().getLogError() << "BaseDaemon::checkMessageTimeout() : no timeout found for receiver '" << message.getVecRecver().front() << "' of message " << messageId << "." << std::endl;
242 continue;
243 }
244 time_t timeout = timeoutIt->second;
245 phoenix_assert(message.getVecRecver().size() != 0lu);
246 if (elapsedTime > timeout) {
247 messagesToRemove.push_back(messageId);
248 getLog().getLogWarning() << "BaseDaemon::checkMessageTimeout() : Timeout Reached for message " << messageId << " sent to '" << message.getVecRecver().front() << "'. Removing unconfirmed transaction" << std::endl;
249 }
250 }
251 for(const size_t & messageId : messagesToRemove){
252 p_mapMessageToBeConfirmed.erase(messageId);
253 }
254}
255
257
260 ++p_messageId;
261 return p_messageId;
262}
263
265
269 PString prototype(data.getType());
270 std::map<PString, AbstractDataFunction*>::iterator it(p_mapDataFunction.find(prototype));
271 if(it == p_mapDataFunction.end()){
272 getLog().getLogError() << "BaseDaemon::getDataFunction : function to process data '"<<prototype<<"' not found" << std::endl;
273 return nullptr;
274 }
275 return it->second;
276}
277
279
282bool BaseDaemon::processData(const Data & data){
283 AbstractDataFunction* function = getDataFunction(data);
284 if(function == nullptr){
285 return false;
286 }
287 getLog().getLogDebug() << "BaseDaemon::processData : process data '"<<data.getType()<<"'" << std::endl;
288 bool b = function->call(p_log, data);
289 return b;
290}
291
293
297 stat.setNbEvent(stat.getNbEvent() + 1lu);
298 getLog().getLogDebug() << "BaseDaemon::updateStatAccumulator : event nb is " << stat.getNbEvent() << std::endl;
299 if(stat.getNbEvent() == 1lu){
300 stat.setMin(value);
301 stat.setMax(value);
302 stat.setSum(value);
303 }else{
304 if(value < stat.getMin()){
305 stat.setMin(value);
306 }
307 if(value > stat.getMax()){
308 stat.setMax(value);
309 }
310 stat.setSum(stat.getSum() + value);
311 }
312 if(value > stat.getHistUpperBound()){
314 }
315 if(value < stat.getHistLowerBound()){
317 }
318 float binSize = (stat.getHistUpperBound() - stat.getHistLowerBound()) / stat.getVecHistogram().size();
319 size_t bin = (value - stat.getHistLowerBound()) / binSize;
320 if(bin < stat.getVecHistogram().size()){
321 std::vector<size_t> & vecHistogram = stat.getVecHistogram();
322 vecHistogram[bin] = vecHistogram[bin] + 1lu;
323 }
324}
325
327
332StatAccumulator BaseDaemon::createNewStat(size_t nbBin, float histLowerBound, float histUpperBound){
333 StatAccumulator newStat;
334 newStat.setNbEvent(0lu);
335 newStat.setMin(std::nan(""));
336 newStat.setMax(std::nan(""));
337 newStat.setSum(std::nan(""));
338 newStat.setNbEventAboveUpperBound(0lu);
339 newStat.setNbEventBelowLowerBound(0lu);
340 newStat.setHistUpperBound(histUpperBound);
341 newStat.setHistLowerBound(histLowerBound);
342 newStat.setVecHistogram(std::vector<size_t>(nbBin, 0lu));
343 return newStat;
344}
345
347
349const std::map<size_t, Message> & BaseDaemon::getMapMessageToBeConfirmed() const {
351}
352
353
356 for(MapStatAccumulator::iterator it = p_config.getDaemonStatAccumulator().getMapStatComputing().begin(); it != p_config.getDaemonStatAccumulator().getMapStatComputing().end(); ++it){
357 it->second.setNbEvent(0lu);
358 std::fill(it->second.getVecHistogram().begin(), it->second.getVecHistogram().end(), 0lu);
359 }
360 for(MapDaemonStatAccumulator::iterator itMap = p_config.getDaemonStatAccumulator().getMapStatCommunication().begin(); itMap != p_config.getDaemonStatAccumulator().getMapStatCommunication().end(); ++itMap){
361 for(MapStatAccumulator::iterator it = itMap->second.begin(); it != itMap->second.end(); ++it){
362 it->second.setNbEvent(0lu);
363 std::fill(it->second.getVecHistogram().begin(), it->second.getVecHistogram().end(), 0lu);
364 }
365 }
366}
367
369
374
376
381
383
388
390
393 return p_log;
394}
395
398 p_optionParser.setExampleLongOption("phoenix_daemon --daemonconfig=daemon_config.toml --daemonname=main");
399 p_optionParser.setExampleShortOption("phoenix_daemon -c daemon_config.toml -n main");
400 p_optionParser.addOption("daemonconfig", "c", OptionType::FILENAME, true, "Toml configuration file which define all Daemons of the swarm");
401 p_optionParser.addOption("daemonname", "n", OptionType::STRING, true, "Name of the current Daemon of the swarm configuration defined with --daemonconfig");
402 p_optionParser.addOption("mock", "m", OptionType::NONE, false, "Activate the Daemon in mock mode for the sockets and the clock");
403 p_optionParser.addOption("mockrecord", "r", OptionType::NONE, false, "Activate the Daemon in mock record mode for the sockets and the clock");
404 p_isRun = false;
405 p_messageId = 0lu;
406 p_isFullMock = false;
407 p_isFullMockRecord = false;
408}
409
411
417std::map<PString, StatAccumulator> BaseDaemon::createNewCommunicationStatMap(const PString & dataType, size_t nbBin, float histLowerBound, float histUpperBound){
418 std::map<PString, StatAccumulator> newStatMap;
419 newStatMap[dataType] = createNewStat(nbBin, histLowerBound, histUpperBound);
420 return newStatMap;
421}
422
424
431void BaseDaemon::getCommunicationStat(const PString & destName, const PString & dataType, float latency, size_t nbBin, float histLowerBound, float histUpperBound){
432 std::map<PString, std::map<PString, StatAccumulator> > & mapCommunication = p_config.getDaemonStatAccumulator().getMapStatCommunication();
433 MapDaemonStatAccumulator::iterator it = mapCommunication.find(destName);
434 if(it == mapCommunication.end()){
435 mapCommunication[destName] = createNewCommunicationStatMap(dataType, nbBin, histLowerBound, histUpperBound);
436 }
437 else{
438 std::map<PString, StatAccumulator>::iterator itDataType = it->second.find(dataType);
439 if(itDataType == it->second.end()){
440 it->second[dataType] = createNewStat(nbBin, histLowerBound, histUpperBound);
441 }
442 }
443 updateStatAccumulator(p_config.getDaemonStatAccumulator().getMapStatCommunication().find(destName)->second[dataType], latency);
444}
445
447
452VecStat BaseDaemon::fillVecStat(const StatAccumulator & accumulator, time_t startTimestamp, time_t endTimestamp){
453 VecStat vecStat;
454
455 // Compute event values
456 vecStat.getNbEvent().push_back(accumulator.getNbEvent());
457 vecStat.getMin().push_back(accumulator.getMin());
458 vecStat.getMax().push_back(accumulator.getMax());
459 vecStat.getAverage().push_back(accumulator.getSum() / accumulator.getNbEvent());
460
461 // Compute time values
462 vecStat.getStartTimestamp().push_back(startTimestamp);
463 vecStat.getEndTimestamp().push_back(endTimestamp);
464 time_t rate = endTimestamp - startTimestamp;
465 vecStat.getRate().push_back(accumulator.getNbEvent()*1e9 / rate);
466 vecStat.getRateEventAboveUpperBound().push_back(accumulator.getNbEventAboveUpperBound()*1e9 / rate);
467 vecStat.getRateEventBelowLowerBound().push_back(accumulator.getNbEventBelowLowerBound()*1e9 / rate);
468
469 vecStat.getVecRateQuantile().resize(accumulator.getVecHistogram().size());
470 for(size_t i = 0; i < accumulator.getVecHistogram().size(); ++i){
471 vecStat.getVecRateQuantile()[i].push_back(accumulator.getVecHistogram()[i]*1e9 / rate);
472 }
473 return vecStat;
474}
475
477
482void BaseDaemon::fillDaemonStat(Stat & stat, time_t startTimestamp, time_t endTimestamp){
483 // Fill the computing statistics
484 MapStatAccumulator & mapStatComputing = p_config.getDaemonStatAccumulator().getMapStatComputing();
485 for(MapStatAccumulator::iterator it = mapStatComputing.begin(); it != mapStatComputing.end(); ++it){
486 StatAccumulator & accumulator = it->second;
487 VecStat vecStat = fillVecStat(accumulator, startTimestamp, endTimestamp);
488 stat.getMapStatComputing()[it->first] = vecStat;
489 }
490
491 // Fill the communication statistics
492 MapDaemonStatAccumulator & mapStatCommunication = p_config.getDaemonStatAccumulator().getMapStatCommunication();
493 for(MapDaemonStatAccumulator::iterator itMap = mapStatCommunication.begin(); itMap != mapStatCommunication.end(); ++itMap){
494 const PString & destName = itMap->first;
495 std::map<PString, VecStat> & mapVecStat = stat.getMapStatCommunication()[destName];
496 for(MapStatAccumulator::iterator it = itMap->second.begin(); it != itMap->second.end(); ++it){
497 StatAccumulator & accumulator = it->second;
498 VecStat vecStat = fillVecStat(accumulator, startTimestamp, endTimestamp);
499 mapVecStat[it->first] = vecStat;
500 }
501 }
502}
503
std::map< PString, Swarm::StatAccumulator > MapStatAccumulator
Definition BaseDaemon.h:39
std::map< PString, std::map< PString, Swarm::StatAccumulator > > MapDaemonStatAccumulator
Definition BaseDaemon.h:38
Abstract function definition which will be callable in Daemon.
virtual bool call(PLog &log, const Swarm::Data &data)=0
std::map< PString, Swarm::AbstractDataFunction * > p_mapDataFunction
Map of methods which have to be called when receiving data.
Definition BaseDaemon.h:189
void clearCallableMethod()
Clear the map of callable methods.
bool p_isRun
True if the current BaseDaemon is running.
Definition BaseDaemon.h:168
void loadConfigFromNode(const ConfigNode &dico, const PString &daemonName)
Load configuration form a node of ConfigNode.
OptionParser p_optionParser
Option parser of the Daemon.
Definition BaseDaemon.h:180
bool isDaemonExist(const PString &name) const
Say if a neighbour Daemon does exist.
void updateStatAccumulator(StatAccumulator &stat, float value)
Update a computing statistic with a new value.
std::map< PString, Swarm::AbstractFunction * > p_mapCallableMethod
Map of callable method of the Daemon.
Definition BaseDaemon.h:182
void addMessageToConfirm(const Swarm::Message &message)
Add a message to confirm.
OptionParser & getOptionParser()
Return the OptionParser of the current BaseDaemon.
std::map< PString, StatAccumulator > createNewCommunicationStatMap(const PString &dataType, size_t nbBin, float histLowerBound, float histUpperBound)
Create a new map of communication statistic.
PLog & getLogger()
Get the logger of the current BaseDaemon.
bool load(const PString &configFileContent, const PString &daemonName, ConfigFormat::ConfigFormat format)
Load the Json configuration which define all BaseDaemons of the Swarm.
bool callMethod(Swarm::Data &result, const PString &name, const Swarm::Data &parameter)
Call an added callable method by name.
void initialisationBaseDaemon()
Initialisation function of the class BaseDaemon.
bool p_isFullMock
True if the daemon has to be executed in mock mode for socket and clock.
Definition BaseDaemon.h:170
MapDaemonConfig & getMapDaemonConfig()
Get the map of all Daemon configurations.
DaemonConfig & getConfig()
Get the configuration of the current BaseDaemon.
VecStat fillVecStat(const Swarm::StatAccumulator &accumulator, time_t startTimestamp, time_t endTimestamp)
Fill a VecStat from a StatAccumulator to send to the DamonStat.
void fillDaemonStat(Swarm::Stat &stat, time_t startTimestamp, time_t endTimestamp)
Fill the Stat with the current statistics of the daemon.
DaemonMainConfig & getMainConfig()
Get the main configuration of the swarm.
virtual void addCallMethod()
Do the addCallableMethod here.
bool getMessageToConfirm(Swarm::Message &message, size_t id) const
Get a message to confirm by id if it exists.
PLog p_log
Logger of the current Daemon.
Definition BaseDaemon.h:166
virtual bool extraLoad(const ConfigNode *config)
Extra call on load for the current Daemon.
PLog & getLog()
Get the log of the current BaseDaemon.
void clearStat()
Clear all the statistics of the daemon.
void stop()
Stops the BaseDaemon.
void checkMessageTimeout(time_t currentTime)
Check if a message has reached the timeout.
size_t p_messageId
Id counter of the message of the current Daemon.
Definition BaseDaemon.h:186
std::map< size_t, Swarm::Message > p_mapMessageToBeConfirmed
Map of messages which have to be confirmed by destination Daemon.
Definition BaseDaemon.h:184
size_t getMessageId()
Get current message id.
void getCommunicationStat(const PString &destName, const PString &dataType, float latency, size_t nbBin, float histLowerBound, float histUpperBound)
Add a communication statistic.
bool p_isFullMockRecord
True if the daemon has to be executed in mock record mode for socket and clock.
Definition BaseDaemon.h:172
BaseDaemon()
Default constructor of BaseDaemon.
StatAccumulator createNewStat(size_t nbBin, float histLowerBound, float histUpperBound)
Create a new clear computing statistic.
DaemonConfig p_config
Configuration of the curent Daemon.
Definition BaseDaemon.h:162
Swarm::AbstractDataFunction * getDataFunction(const Swarm::Data &data)
Get the data function associated with the given data.
const std::map< size_t, Swarm::Message > & getMapMessageToBeConfirmed() const
Get the map of message to be confirmed.
MapDaemonConfig p_mapDaemon
Map of the other Daemon of the Swarm.
Definition BaseDaemon.h:164
void processConfirmedMessage(size_t id, time_t currentTime)
Process confirmed message.
DaemonMainConfig p_mainConfig
Main configuration of the Daemon.
Definition BaseDaemon.h:160
virtual ~BaseDaemon()
Destructor of BaseDaemon.
bool parseArgument(int argc, char **argv)
Parse arguments given to the BaseDaemon with command line.
bool processData(const Swarm::Data &data)
Process given data with the proper method.
Describe a Daemon of the Swarm.
Basic Data exchanged in the swarm.
const PString & getType() const
Gets the type of the Data.
Message exchanged by Daemons.
const std::vector< PString > & getVecRecver() const
Gets the vecRecver of the Message.
const Swarm::Data & getData() const
Gets the data of the Message.
size_t getId() const
Gets the id of the Message.
const time_t & getSendTime() const
Gets the sendTime of the Message.
Accumulator of event occurence to build swarm statistics over a time period.
float getHistUpperBound() const
Gets the histUpperBound of the StatAccumulator.
void setMin(float min)
Sets the min of the StatAccumulator.
float getSum() const
Gets the sum of the StatAccumulator.
void setVecHistogram(const std::vector< size_t > &vecHistogram)
Sets the vecHistogram of the StatAccumulator.
size_t getNbEvent() const
Gets the nbEvent of the StatAccumulator.
float getMax() const
Gets the max of the StatAccumulator.
size_t getNbEventAboveUpperBound() const
Gets the nbEventAboveUpperBound of the StatAccumulator.
float getMin() const
Gets the min of the StatAccumulator.
float getHistLowerBound() const
Gets the histLowerBound of the StatAccumulator.
void setHistUpperBound(float histUpperBound)
Sets the histUpperBound of the StatAccumulator.
void setMax(float max)
Sets the max of the StatAccumulator.
void setNbEventAboveUpperBound(size_t nbEventAboveUpperBound)
Sets the nbEventAboveUpperBound of the StatAccumulator.
void setHistLowerBound(float histLowerBound)
Sets the histLowerBound of the StatAccumulator.
void setNbEventBelowLowerBound(size_t nbEventBelowLowerBound)
Sets the nbEventBelowLowerBound of the StatAccumulator.
void setSum(float sum)
Sets the sum of the StatAccumulator.
size_t getNbEventBelowLowerBound() const
Gets the nbEventBelowLowerBound of the StatAccumulator.
const std::vector< size_t > & getVecHistogram() const
Gets the vecHistogram of the StatAccumulator.
void setNbEvent(size_t nbEvent)
Sets the nbEvent of the StatAccumulator.
Statistics of a Daemon.
const std::map< DaemonName, std::map< DataType, Swarm::VecStat > > & getMapStatCommunication() const
Gets the mapStatCommunication of the Stat.
const std::map< PString, Swarm::VecStat > & getMapStatComputing() const
Gets the mapStatComputing of the Stat.
General statistics in the swarm.
const std::vector< float > & getMax() const
Gets the max of the VecStat.
const std::vector< time_t > & getEndTimestamp() const
Gets the endTimestamp of the VecStat.
const std::vector< float > & getRate() const
Gets the rate of the VecStat.
const std::vector< time_t > & getStartTimestamp() const
Gets the startTimestamp of the VecStat.
const std::vector< float > & getAverage() const
Gets the average of the VecStat.
const std::vector< float > & getRateEventBelowLowerBound() const
Gets the rateEventBelowLowerBound of the VecStat.
const std::vector< float > & getRateEventAboveUpperBound() const
Gets the rateEventAboveUpperBound of the VecStat.
const std::vector< float > & getMin() const
Gets the min of the VecStat.
const std::vector< size_t > & getNbEvent() const
Gets the nbEvent of the VecStat.
const std::vector< std::vector< float > > & getVecRateQuantile() const
Gets the vecRateQuantile of the VecStat.
PString daemon_loadString(const ConfigNode &dico, const PString &attributeName)
Load a string value.
void daemon_load_config(PLog &log, ConfigNode &dico, const PString &inputConfig, ConfigFormat::ConfigFormat format)
Load the daemon config into a ConfigNode from a json string.
void daemon_read_configNode(Swarm::DaemonConfig &daemonConfig, MapDaemonConfig &mapDaemon, PLog &log, MapTimeout &mapTimeout, const ConfigNode *&extraConfigParam, const ConfigNode &dico, const PString &daemonName)
Read the ConfigNode to initialise current Daemon.
ConfigFormat
Type of the Message which can be exchanged by Daemon.
std::map< PString, Swarm::DaemonConfig > MapDaemonConfig
Main Daemon configuration which drives timeouts and flags of send and recv calls.
Definition BaseDaemon.h:42