1 #ifndef OTSDAQ_MESSAGEFACILITY_ITRACECONTROLLER_H
2 #define OTSDAQ_MESSAGEFACILITY_ITRACECONTROLLER_H
9 #include <unordered_map>
10 #include "TRACE/trace.h"
11 #include "otsdaq/Macros/StringMacros.h"
13 #if TRACE_REVNUM < 1394
14 #define traceLvls_p traceNamLvls_p
15 #define TRACE_TID2NAME(idx) traceNamLvls_p[idx].name
28 friend std::ostream& operator<<(std::ostream& out,
const TraceMasks& traceMask)
30 out <<
"Memory:" << traceMask.M <<
",Slow:" << traceMask.S
31 <<
",Trigger:" << traceMask.T;
35 typedef std::unordered_map<std::string, TraceMasks> TraceLevelMap;
36 typedef std::unordered_map<std::string, TraceLevelMap> HostTraceLevelMap;
44 std::string
const& hostname =
"localhost",
45 std::string
const& mode =
"ALL") = 0;
55 std::string
const& filterOut =
"")
57 std::string command =
"";
59 std::vector<std::string> grepArr;
62 std::string safeGrep =
"";
63 for(
const auto& grepVal : grepArr)
65 std::cout <<
"grepVal = " << grepVal << std::endl;
67 if(grepVal.size() < 3)
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];
80 std::cout <<
"safeGrep = " << safeGrep << std::endl;
85 for(
const auto& grepVal : grepArr)
87 std::cout <<
"grepVal = " << grepVal << std::endl;
89 if(grepVal.size() < 3)
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];
102 std::cout <<
"safeGrep = " << safeGrep << std::endl;
108 command +=
" source $TRACE_BIN/trace_functions.sh; tshow ";
111 command +=
" | tdelta -d 1 ";
112 TLOG(TLVL_DEBUG) <<
"getTraceBufferDump command: " << command;
117 std::string getHostnameString(
void)
119 char hostname_c[HOST_NAME_MAX];
120 gethostname(hostname_c, HOST_NAME_MAX);
121 return std::string(hostname_c);
126 void addTraceLevelsForThisHost(
void)
128 auto hostname = getHostnameString();
129 TLOG(TLVL_DEBUG) <<
"Adding TRACE levels [" << hostname <<
"]";
131 unsigned ee = traceControl_p->num_namLvlTblEnts;
132 for(
unsigned ii = 0; ii < ee; ++ii)
134 if(TRACE_TID2NAME(ii)[0])
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;
145 void setTraceLevelsForThisHost(std::string
const& name,
146 TraceMasks
const& lvl,
147 std::string
const& mode =
"ALL")
149 auto hostname = getHostnameString();
150 TLOG(TLVL_DEBUG) <<
"Setting TRACE levels [" << hostname <<
"]";
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 <<
" "
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);
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);
176 HostTraceLevelMap traceLevelsMap_;
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)