tdaq-develop-2025-02-12
ITRACEController.h
1 #ifndef OTSDAQ_MESSAGEFACILITY_ITRACECONTROLLER_H
2 #define OTSDAQ_MESSAGEFACILITY_ITRACECONTROLLER_H
3 
4 #include <limits.h>
5 #include <unistd.h>
6 #include <deque>
7 #include <list>
8 #include <string>
9 #include <unordered_map>
10 #include "TRACE/trace.h"
11 #include "otsdaq/Macros/StringMacros.h"
12 
13 #if TRACE_REVNUM < 1394
14 #define traceLvls_p traceNamLvls_p
15 #define TRACE_TID2NAME(idx) traceNamLvls_p[idx].name
16 #endif
17 
18 namespace ots
19 {
21 {
22  public:
23  struct TraceMasks
24  {
25  uint64_t M;
26  uint64_t S;
27  uint64_t T;
28  friend std::ostream& operator<<(std::ostream& out, const TraceMasks& traceMask)
29  {
30  out << "Memory:" << traceMask.M << ",Slow:" << traceMask.S
31  << ",Trigger:" << traceMask.T;
32  return out;
33  }
34  };
35  typedef std::unordered_map<std::string, TraceMasks> TraceLevelMap;
36  typedef std::unordered_map<std::string, TraceLevelMap> HostTraceLevelMap;
37 
38  ITRACEController() {}
39  virtual ~ITRACEController() = default;
40 
41  virtual const HostTraceLevelMap& getTraceLevels(void) = 0;
42  virtual void setTraceLevelMask(std::string const& name,
43  TraceMasks const& lvl,
44  std::string const& hostname = "localhost",
45  std::string const& mode = "ALL") = 0;
46 
47  virtual bool getIsTriggered(void) = 0;
48  virtual void setTriggerEnable(size_t entriesAfterTrigger) = 0;
49 
50  virtual void resetTraceBuffer(void) = 0;
51  virtual void enableTrace(bool enable = true) = 0;
52 
53  //=====================================
54  std::string getTraceBufferDump(std::string const& filterFor = "",
55  std::string const& filterOut = "")
56  {
57  std::string command = "";
58 
59  std::vector<std::string> grepArr;
60  StringMacros::getVectorFromString(filterFor, grepArr, {','});
61 
62  std::string safeGrep = "";
63  for(const auto& grepVal : grepArr)
64  {
65  std::cout << "grepVal = " << grepVal << std::endl;
66 
67  if(grepVal.size() < 3)
68  continue;
69 
70  safeGrep += " | grep \" ";
71  for(unsigned int i = 0; i < grepVal.size(); ++i)
72  if((grepVal[i] >= 'a' && grepVal[i] <= 'z') ||
73  (grepVal[i] >= 'A' && grepVal[i] <= 'Z') ||
74  (grepVal[i] >= '0' && grepVal[i] <= '9') ||
75  (grepVal[i] == '.' && i && grepVal[i - 1] != '.') ||
76  (grepVal[i] == '-' || grepVal[i] == '_'))
77  safeGrep += grepVal[i];
78  safeGrep += " \"";
79  }
80  std::cout << "safeGrep = " << safeGrep << std::endl;
81 
82  grepArr.clear();
83  StringMacros::getVectorFromString(filterOut, grepArr, {','});
84 
85  for(const auto& grepVal : grepArr)
86  {
87  std::cout << "grepVal = " << grepVal << std::endl;
88 
89  if(grepVal.size() < 3)
90  continue;
91 
92  safeGrep += " | grep -v \" ";
93  for(unsigned int i = 0; i < grepVal.size(); ++i)
94  if((grepVal[i] >= 'a' && grepVal[i] <= 'z') ||
95  (grepVal[i] >= 'A' && grepVal[i] <= 'Z') ||
96  (grepVal[i] >= '0' && grepVal[i] <= '9') ||
97  (grepVal[i] == '.' && i && grepVal[i - 1] != '.') ||
98  (grepVal[i] == '-' || grepVal[i] == '_'))
99  safeGrep += grepVal[i];
100  safeGrep += " \"";
101  }
102  std::cout << "safeGrep = " << safeGrep << std::endl;
103 
104  // command += " | grep \"" + safeGrep + "\"";
105  // command += " | tdelta";
106  // command += " | test -n \"${PAGER-}\" && trace_delta \"$@\" | $PAGER || trace_delta \"$@\";";
107  // try source $TRACE_BIN/trace_functions.sh; tshow | tdelta
108  command += " source $TRACE_BIN/trace_functions.sh; tshow ";
109  // command += " | grep Console ";///< 2>/dev/null ;
110  command += safeGrep;
111  command += " | tdelta -d 1 ";
112  TLOG(TLVL_DEBUG) << "getTraceBufferDump command: " << command;
113  return StringMacros::exec(command.c_str());
114  } // end getTraceBufferDump()
115 
116  //=====================================
117  std::string getHostnameString(void)
118  {
119  char hostname_c[HOST_NAME_MAX];
120  gethostname(hostname_c, HOST_NAME_MAX);
121  return std::string(hostname_c);
122  } // end getHostnameString()
123 
124  protected:
125  //=====================================
126  void addTraceLevelsForThisHost(void)
127  {
128  auto hostname = getHostnameString();
129  TLOG(TLVL_DEBUG) << "Adding TRACE levels [" << hostname << "]";
130 
131  unsigned ee = traceControl_p->num_namLvlTblEnts;
132  for(unsigned ii = 0; ii < ee; ++ii)
133  {
134  if(TRACE_TID2NAME(ii)[0])
135  {
136  std::string name = std::string(TRACE_TID2NAME(ii));
137  traceLevelsMap_[hostname][name].M = traceLvls_p[ii].M;
138  traceLevelsMap_[hostname][name].S = traceLvls_p[ii].S;
139  traceLevelsMap_[hostname][name].T = traceLvls_p[ii].T;
140  }
141  }
142  } // end addTraceLevelsForThisHost()
143 
144  //=====================================
145  void setTraceLevelsForThisHost(std::string const& name,
146  TraceMasks const& lvl,
147  std::string const& mode = "ALL")
148  {
149  auto hostname = getHostnameString();
150  TLOG(TLVL_DEBUG) << "Setting TRACE levels [" << hostname << "]";
151 
152  bool allMode = mode == "ALL";
153  TLOG(TLVL_DEBUG) << "Setting " << mode << " levels for name '" << name << "' to "
154  << std::hex << std::showbase << lvl.M << " " << lvl.S << " "
155  << lvl.T;
156  if(name != "ALL")
157  {
158  if(allMode || mode == "FAST")
159  TRACE_CNTL("lvlmsknM", name.c_str(), lvl.M);
160  if(allMode || mode == "SLOW")
161  TRACE_CNTL("lvlmsknS", name.c_str(), lvl.S);
162  if(allMode || mode == "TRIGGER")
163  TRACE_CNTL("lvlmsknT", name.c_str(), lvl.T);
164  }
165  else
166  {
167  if(allMode || mode == "FAST")
168  TRACE_CNTL("lvlmskMg", lvl.M);
169  if(allMode || mode == "SLOW")
170  TRACE_CNTL("lvlmskSg", lvl.S);
171  if(allMode || mode == "TRIGGER")
172  TRACE_CNTL("lvlmskTg", lvl.T);
173  }
174  } // end setTraceLevelsForThisHost()
175 
176  HostTraceLevelMap traceLevelsMap_;
177 };
178 
179 } // namespace ots
180 
181 #endif // OTSDAQ_MESSAGEFACILITY_ITRACECONTROLLER_H
std::string getTraceBufferDump(std::string const &filterFor="", std::string const &filterOut="")
virtual void setTraceLevelMask(std::string const &name, TraceMasks const &lvl, std::string const &hostname="localhost", std::string const &mode="ALL")=0
pure virtual
virtual void resetTraceBuffer(void)=0
pure virtual
virtual bool getIsTriggered(void)=0
pure virtual
virtual const HostTraceLevelMap & getTraceLevels(void)=0
pure virtual
virtual void enableTrace(bool enable=true)=0
pure virtual
virtual void setTriggerEnable(size_t entriesAfterTrigger)=0
pure virtual
static void getVectorFromString(const std::string &inputString, std::vector< std::string > &listToReturn, const std::set< char > &delimiter={',', '|', '&'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'}, std::vector< char > *listOfDelimiters=0, bool decodeURIComponents=false)
static std::string exec(const char *cmd)