otsdaq  3.10.00
SupervisorInfo.h
1 #ifndef _ots_SupervisorInfo_h_
2 #define _ots_SupervisorInfo_h_
3 
4 #include <algorithm>
5 #include <string>
6 #include "otsdaq/Macros/CoutMacros.h" /* also for XDAQ_CONST_CALL */
7 #include "otsdaq/TablePlugins/XDAQContextTable/XDAQContextTable.h"
8 
9 #pragma GCC diagnostic push
10 #pragma GCC diagnostic ignored "-Wunused-parameter"
11 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
12 #if __GNUC__ >= 8
13 #pragma GCC diagnostic ignored "-Wcatch-value"
14 #endif
15 #if __GNUC__ >= 9
16 #pragma GCC diagnostic ignored "-Wdeprecated-copy"
17 #endif
18 #include <xdaq/Application.h>
19 #pragma GCC diagnostic pop
20 #include "otsdaq/Macros/XDAQApplicationMacros.h"
21 
22 // clang-format off
23 namespace ots
24 {
26 {
27  public:
30  SupervisorInfo(XDAQ_CONST_CALL xdaq::ApplicationDescriptor* descriptor, const std::string& name, const std::string& contextName)
31  : descriptor_(descriptor)
32  , contextDescriptor_(descriptor ? descriptor->getContextDescriptor() : 0)
33  , name_(name)
34  , mfSubject_(name_)
35  , contextName_(contextName)
36  , id_(descriptor ? descriptor->getLocalId() : 0)
37  , class_(descriptor ? descriptor->getClassName() : "")
38  , contextURL_(contextDescriptor_ ? contextDescriptor_->getURL() : "")
39  , hostname_(SupervisorInfo::extractHostname(contextURL_))
40  , URN_(descriptor ? descriptor->getURN() : "")
41  , URL_(contextURL_ + "/" + URN_)
42  , port_(0)
43  , status_(SupervisorInfo::APP_STATUS_UNKNOWN)
44  {
45  // when no configuration, e.g. Wizard Mode, then
46  // name and contextName are derived from the class name and LID
47  if(name_ == "")
48  name_ = "LID-" + std::to_string(id_);
49  if(contextName_ == "")
50  contextName_ = class_;
51  } //end constructor
52 
53  ~SupervisorInfo(void) { ; }
54 
55 
56  struct SubappInfo {
57  std::string name {""};
58  std::string status {""};
59  unsigned int progress = 0, id = 0;
60  std::string detail {""};
61  int64_t availableLogSpaceKB = 0, availableDataSpaceKB = 0;
62  float logUsageRateKBps = 0, dataUsageRateKBps = 0;
63  time_t lastStatusTime = 0;
64  time_t lastStatusChangeTime = 0;
65  std::string url {""} , parent_url {""};
66  std::string class_name {""};
67  std::deque<std::pair<time_t, int64_t>> availableLogSpaceKB_, availableDataSpaceKB_; //keep time series of last, 3.75 minutes, 7.5, 15, 30, 60 minutes to monitor rate trends
68  }; // end SubappInfo struct
69 
70  static const std::string APP_STATUS_UNKNOWN;
71  static const std::string APP_STATUS_NOT_MONITORED;
72 
74  bool isGatewaySupervisor (void) const { return class_ == XDAQContextTable::GATEWAY_SUPERVISOR_CLASS; }
75  bool isWizardSupervisor (void) const { return class_ == XDAQContextTable::WIZARD_SUPERVISOR_CLASS; }
76  bool isTypeFESupervisor (void) const { return XDAQContextTable::FETypeClassNames_.find(class_) != XDAQContextTable::FETypeClassNames_.end(); }
77  bool isTypeDMSupervisor (void) const { return XDAQContextTable::DMTypeClassNames_.find(class_) != XDAQContextTable::DMTypeClassNames_.end(); }
78  bool isTypeLogbookSupervisor (void) const { return XDAQContextTable::LogbookTypeClassNames_.find(class_) != XDAQContextTable::LogbookTypeClassNames_.end(); }
79  bool isTypeMacroMakerSupervisor (void) const { return XDAQContextTable::MacroMakerTypeClassNames_.find(class_) != XDAQContextTable::MacroMakerTypeClassNames_.end(); }
80  bool isTypeConfigurationGUISupervisor (void) const { return XDAQContextTable::ConfigurationGUITypeClassNames_.find(class_) != XDAQContextTable::ConfigurationGUITypeClassNames_.end(); }
81  bool isTypeChatSupervisor (void) const { return XDAQContextTable::ChatTypeClassNames_.find(class_) != XDAQContextTable::ChatTypeClassNames_.end(); }
82  bool isTypeConsoleSupervisor (void) const { return XDAQContextTable::ConsoleTypeClassNames_.find(class_) != XDAQContextTable::ConsoleTypeClassNames_.end(); }
83  bool isTypeCodeEditorSupervisor (void) const { return XDAQContextTable::CodeEditorTypeClassNames_.find(class_) != XDAQContextTable::CodeEditorTypeClassNames_.end(); }
84  bool isTypeARTDAQSupervisor (void) const { return class_ == XDAQContextTable::ARTDAQ_SUPERVISOR_CLASS; }
85 
87  XDAQ_CONST_CALL xdaq::ApplicationDescriptor* getDescriptor (void) const { return descriptor_; }
88  const xdaq::ContextDescriptor* getContextDescriptor (void) const { return contextDescriptor_; }
89  const std::string& getName (void) const { return name_; }
90  const std::string& getHostname (void) const { return hostname_; }
91  const std::string& getContextName (void) const { return contextName_; }
92  const unsigned int& getId (void) const { return id_; }
93  const std::string& getClass (void) const { return class_; }
94 
96  const std::string& getStatus (void) const { return status_; }
97  time_t getLastStatusTime (void) const { return lastStatusTime_; }
98  time_t getLastStatusChangeTime (void) const { return lastStatusChangeTime_; }
99  const unsigned int& getProgress (void) const { return progress_; }
100  const std::string& getDetail (void) const { return detail_; }
101 
102  const std::string& getURL (void) const { return contextURL_; }
103  const std::string& getURN (void) const { return URN_; }
104  const std::string& getFullURL (void) const { return URL_; }
105  const uint16_t& getPort (void) const { return port_; }
106  const std::map<std::string, SubappInfo>& getSubappInfo (void) const { return subapps_; }
107 
108 
109  int64_t getAvailableLogSpaceKB (void) const { return availableLogSpaceKB_.size() > 0 ? availableLogSpaceKB_.front().second : 0; }
110  int64_t getAvailableDataSpaceKB (void) const { return availableDataSpaceKB_.size() > 0 ? availableDataSpaceKB_.front().second : 0; }
111 
112  // Actual lookback span (seconds) between the newest sample and the sample at the
113  // given slot. Used by the disk-space alarm to refuse rates whose historical
114  // sample is still too young to be meaningful (e.g. just after startup).
115  time_t getLogSpaceSampleAgeSeconds (size_t slot) const { return availableLogSpaceKB_.size() > slot ? availableLogSpaceKB_.front().first - availableLogSpaceKB_[slot].first : 0; }
116  time_t getDataSpaceSampleAgeSeconds (size_t slot) const { return availableDataSpaceKB_.size() > slot ? availableDataSpaceKB_.front().first - availableDataSpaceKB_[slot].first : 0; }
117 
118  float getLogUsageRateLastHourKBps (void) const { return availableLogSpaceKB_.size() > 9 ? (availableLogSpaceKB_[9].second - availableLogSpaceKB_.front().second)*1.0f/
119  std::max(static_cast<time_t>(1), availableLogSpaceKB_.front().first - availableLogSpaceKB_[9].first) : 0; }
120  float getLogUsageRateLastHalfHourKBps (void) const { return availableLogSpaceKB_.size() > 7 ? (availableLogSpaceKB_[7].second - availableLogSpaceKB_.front().second)*1.0f/
121  std::max(static_cast<time_t>(1), availableLogSpaceKB_.front().first - availableLogSpaceKB_[7].first): 0; }
122  float getLogUsageRateLastQuarterHourKBps (void) const { return availableLogSpaceKB_.size() > 5 ? (availableLogSpaceKB_[5].second - availableLogSpaceKB_.front().second)*1.0f/
123  std::max(static_cast<time_t>(1), availableLogSpaceKB_.front().first - availableLogSpaceKB_[5].first): 0; }
124  float getLogUsageRateNowKBps (void) const { return availableLogSpaceKB_.size() > 1 ? (availableLogSpaceKB_[1].second - availableLogSpaceKB_.front().second)*1.0f/
125  std::max(static_cast<time_t>(1), availableLogSpaceKB_.front().first - availableLogSpaceKB_[1].first) : 0; }
126  float getDataUsageRateLastHourKBps (void) const { return availableDataSpaceKB_.size() > 9 ? (availableDataSpaceKB_[9].second - availableDataSpaceKB_.front().second)*1.0f/
127  std::max(static_cast<time_t>(1), availableDataSpaceKB_.front().first - availableDataSpaceKB_[9].first) : 0; }
128  float getDataUsageRateLastHalfHourKBps (void) const { return availableDataSpaceKB_.size() > 7 ? (availableDataSpaceKB_[7].second - availableDataSpaceKB_.front().second)*1.0f/
129  std::max(static_cast<time_t>(1), availableDataSpaceKB_.front().first - availableDataSpaceKB_[7].first): 0; }
130  float getDataUsageRateLastQuarterHourKBps(void) const { return availableDataSpaceKB_.size() > 5 ? (availableDataSpaceKB_[5].second - availableDataSpaceKB_.front().second)*1.0f/
131  std::max(static_cast<time_t>(1), availableDataSpaceKB_.front().first - availableDataSpaceKB_[5].first): 0; }
132  float getDataUsageRateNowKBps (void) const { return availableDataSpaceKB_.size() > 1 ? (availableDataSpaceKB_[1].second - availableDataSpaceKB_.front().second)*1.0f/
133  std::max(static_cast<time_t>(1), availableDataSpaceKB_.front().first - availableDataSpaceKB_[1].first) : 0; }
135  void setStatus(const std::string& status, const unsigned int progress, const std::string& detail = "", const int64_t availableLogSpaceKB = 0, const int64_t availableDataSpaceKB = 0);
136  void setSubappStatus(const std::string& name, const std::string& status, const unsigned int progress, const std::string& detail = "", const int64_t availableLogSpaceKB = 0, const int64_t availableDataSpaceKB = 0);
137  void copySubappStatus(const SubappInfo& info);
138  void clearSubapps() { subapps_.clear(); };
139 
140  static std::string serializeSubappInfos(std::vector<SubappInfo> infos);
141  static std::vector<SubappInfo> deserializeSubappInfos(std::string info_string);
142 
143  private:
145  static std::string extractHostname (const std::string& URL);
146  void emplaceAvailableSpace (const int64_t availableSpaceKB, std::deque<std::pair<time_t, int64_t>>& availableSpaceDeque);
147 
148 
149  XDAQ_CONST_CALL xdaq::ApplicationDescriptor* descriptor_;
150  XDAQ_CONST_CALL xdaq::ContextDescriptor* contextDescriptor_;
151  std::string name_, mfSubject_;
152  std::string contextName_;
153  unsigned int id_;
154  std::string class_;
155  std::string contextURL_;
156  std::string hostname_;
157  std::string URN_;
158  std::string URL_;
159  uint16_t port_;
160  std::string status_;
161  unsigned int progress_;
162  std::string detail_;
163  time_t lastStatusTime_;
164  time_t lastStatusChangeTime_ = 0;
165  std::map<std::string, SubappInfo> subapps_;
166  std::deque<std::pair<time_t, int64_t>> availableLogSpaceKB_, availableDataSpaceKB_; //keep time series of last, 3.75 minutes, 7.5, 15, 30, 60 minutes to monitor rate trends
167 };
168 // clang-format on
169 } // namespace ots
170 
171 #endif
bool isGatewaySupervisor(void) const
BOOLs ----------------—.
XDAQ_CONST_CALL xdaq::ApplicationDescriptor * getDescriptor(void) const
Getters ----------------—.
const std::string & getStatus(void) const
Note: be careful accessing status_ in multithreaded code (need higher level lock, a la getSupervisorI...
SupervisorInfo(XDAQ_CONST_CALL xdaq::ApplicationDescriptor *descriptor, const std::string &name, const std::string &contextName)
void setStatus(const std::string &status, const unsigned int progress, const std::string &detail="", const int64_t availableLogSpaceKB=0, const int64_t availableDataSpaceKB=0)
Setters ----------------—.
defines used also by OtsConfigurationWizardSupervisor
std::string name
Also key in map.