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;
43 std::string
const& name,
45 std::string
const& hostname =
"localhost",
46 std::string
const& mode =
"ALL") = 0;
56 std::string
const& filterOut =
"")
58 std::string command =
"";
60 std::vector<std::string> grepArr;
63 std::string safeGrep =
"";
64 for(
const auto& grepVal : grepArr)
66 std::cout <<
"grepVal = " << grepVal << std::endl;
68 if(grepVal.size() < 3)
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];
81 std::cout <<
"safeGrep = " << safeGrep << std::endl;
86 for(
const auto& grepVal : grepArr)
88 std::cout <<
"grepVal = " << grepVal << std::endl;
90 if(grepVal.size() < 3)
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];
103 std::cout <<
"safeGrep = " << safeGrep << std::endl;
109 command +=
" source $TRACE_BIN/trace_functions.sh; tshow ";
112 command +=
" | tdelta -d 1 ";
113 TLOG(TLVL_DEBUG) <<
"getTraceBufferDump command: " << command;
118 std::string getHostnameString(
void)
120 char hostname_c[HOST_NAME_MAX];
121 gethostname(hostname_c, HOST_NAME_MAX);
122 return std::string(hostname_c);
127 void addTraceLevelsForThisHost(
void)
129 auto hostname = getHostnameString();
130 TLOG(TLVL_DEBUG) <<
"Adding TRACE levels [" << hostname <<
"]";
132 unsigned ee = traceControl_p->num_namLvlTblEnts;
133 for(
unsigned ii = 0; ii < ee; ++ii)
135 if(TRACE_TID2NAME(ii)[0])
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;
146 void setTraceLevelsForThisHost(std::string
const& name,
147 TraceMasks
const& lvl,
148 std::string
const& mode =
"ALL")
150 auto hostname = getHostnameString();
151 TLOG(TLVL_DEBUG) <<
"Setting TRACE levels [" << hostname <<
"]";
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 <<
" "
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);
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);
177 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)