otsdaq  3.03.00
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(
43  std::string const& name,
44  TraceMasks const& lvl,
45  std::string const& hostname = "localhost",
46  std::string const& mode = "ALL") = 0;
47 
48  virtual bool getIsTriggered(void) = 0;
49  virtual void setTriggerEnable(size_t entriesAfterTrigger) = 0;
50 
51  virtual void resetTraceBuffer(void) = 0;
52  virtual void enableTrace(bool enable = true) = 0;
53 
54  //=====================================
55  std::string getTraceBufferDump(std::string const& filterFor = "",
56  std::string const& filterOut = "")
57  {
58  std::string command = "";
59 
60  std::vector<std::string> grepArr;
61  StringMacros::getVectorFromString(filterFor, grepArr, {','});
62 
63  std::string safeGrep = "";
64  for(const auto& grepVal : grepArr)
65  {
66  std::cout << "grepVal = " << grepVal << std::endl;
67 
68  if(grepVal.size() < 3)
69  continue;
70 
71  safeGrep += " | grep \" ";
72  for(unsigned int i = 0; i < grepVal.size(); ++i)
73  if((grepVal[i] >= 'a' && grepVal[i] <= 'z') ||
74  (grepVal[i] >= 'A' && grepVal[i] <= 'Z') ||
75  (grepVal[i] >= '0' && grepVal[i] <= '9') ||
76  (grepVal[i] == '.' && i && grepVal[i - 1] != '.') ||
77  (grepVal[i] == '-' || grepVal[i] == '_'))
78  safeGrep += grepVal[i];
79  safeGrep += " \"";
80  }
81  std::cout << "safeGrep = " << safeGrep << std::endl;
82 
83  grepArr.clear();
84  StringMacros::getVectorFromString(filterOut, grepArr, {','});
85 
86  for(const auto& grepVal : grepArr)
87  {
88  std::cout << "grepVal = " << grepVal << std::endl;
89 
90  if(grepVal.size() < 3)
91  continue;
92 
93  safeGrep += " | grep -v \" ";
94  for(unsigned int i = 0; i < grepVal.size(); ++i)
95  if((grepVal[i] >= 'a' && grepVal[i] <= 'z') ||
96  (grepVal[i] >= 'A' && grepVal[i] <= 'Z') ||
97  (grepVal[i] >= '0' && grepVal[i] <= '9') ||
98  (grepVal[i] == '.' && i && grepVal[i - 1] != '.') ||
99  (grepVal[i] == '-' || grepVal[i] == '_'))
100  safeGrep += grepVal[i];
101  safeGrep += " \"";
102  }
103  std::cout << "safeGrep = " << safeGrep << std::endl;
104 
105  // command += " | grep \"" + safeGrep + "\"";
106  // command += " | tdelta";
107  // command += " | test -n \"${PAGER-}\" && trace_delta \"$@\" | $PAGER || trace_delta \"$@\";";
108  // try source $TRACE_BIN/trace_functions.sh; tshow | tdelta
109  command += " source $TRACE_BIN/trace_functions.sh; tshow ";
110  // command += " | grep Console ";///< 2>/dev/null ;
111  command += safeGrep;
112  command += " | tdelta -d 1 ";
113  TLOG(TLVL_DEBUG) << "getTraceBufferDump command: " << command;
114  return StringMacros::exec(command.c_str());
115  } // end getTraceBufferDump()
116 
117  //=====================================
118  std::string getHostnameString(void)
119  {
120  char hostname_c[HOST_NAME_MAX];
121  gethostname(hostname_c, HOST_NAME_MAX);
122  return std::string(hostname_c);
123  } // end getHostnameString()
124 
125  protected:
126  //=====================================
127  void addTraceLevelsForThisHost(void)
128  {
129  auto hostname = getHostnameString();
130  TLOG(TLVL_DEBUG) << "Adding TRACE levels [" << hostname << "]";
131 
132  unsigned ee = traceControl_p->num_namLvlTblEnts;
133  for(unsigned ii = 0; ii < ee; ++ii)
134  {
135  if(TRACE_TID2NAME(ii)[0])
136  {
137  std::string name = std::string(TRACE_TID2NAME(ii));
138  traceLevelsMap_[hostname][name].M = traceLvls_p[ii].M;
139  traceLevelsMap_[hostname][name].S = traceLvls_p[ii].S;
140  traceLevelsMap_[hostname][name].T = traceLvls_p[ii].T;
141  }
142  }
143  } // end addTraceLevelsForThisHost()
144 
145  //=====================================
146  void setTraceLevelsForThisHost(std::string const& name,
147  TraceMasks const& lvl,
148  std::string const& mode = "ALL")
149  {
150  auto hostname = getHostnameString();
151  TLOG(TLVL_DEBUG) << "Setting TRACE levels [" << hostname << "]";
152 
153  bool allMode = mode == "ALL";
154  TLOG(TLVL_DEBUG) << "Setting " << mode << " levels for name '" << name << "' to "
155  << std::hex << std::showbase << lvl.M << " " << lvl.S << " "
156  << lvl.T;
157  if(name != "ALL")
158  {
159  if(allMode || mode == "FAST")
160  TRACE_CNTL("lvlmsknM", name.c_str(), lvl.M);
161  if(allMode || mode == "SLOW")
162  TRACE_CNTL("lvlmsknS", name.c_str(), lvl.S);
163  if(allMode || mode == "TRIGGER")
164  TRACE_CNTL("lvlmsknT", name.c_str(), lvl.T);
165  }
166  else
167  {
168  if(allMode || mode == "FAST")
169  TRACE_CNTL("lvlmskMg", lvl.M);
170  if(allMode || mode == "SLOW")
171  TRACE_CNTL("lvlmskSg", lvl.S);
172  if(allMode || mode == "TRIGGER")
173  TRACE_CNTL("lvlmskTg", lvl.T);
174  }
175  } // end setTraceLevelsForThisHost()
176 
177  HostTraceLevelMap traceLevelsMap_;
178 };
179 
180 } // namespace ots
181 
182 #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)