CMS 3D CMS Logo

FastMonitor.cc
Go to the documentation of this file.
1 /*
2  * FastMonitor.cc
3  *
4  * Created on: Nov 27, 2012
5  * Author: aspataru
6  */
7 
12 
13 #include <fstream>
14 #include <iostream>
15 #include <sstream>
16 #include <cassert>
17 #include <sys/types.h>
18 #include <unistd.h>
19 
20 using namespace jsoncollector;
21 
23  std::string const& defPath, std::string const defGroup, bool strictChecking, bool useSource, bool useDefinition)
24  : defPath_(defPath),
25  strictChecking_(strictChecking),
26  useSource_(useSource),
27  useDefinition_(useDefinition),
28  nStreams_(1),
29  deleteDef_(true) {
30  //get host and PID info
31  if (useSource)
33 
34  //load definition file
35  auto temp = new DataPointDefinition();
37  dpd_ = temp;
38 }
39 
40 FastMonitor::FastMonitor(DataPointDefinition const* dpd, bool strictChecking, bool useSource, bool useDefinition)
41  : strictChecking_(strictChecking), useSource_(useSource), useDefinition_(useDefinition), nStreams_(1), dpd_(dpd) {
42  //get host and PID info
43  if (useSource)
45 }
46 
48  for (auto dp : dataPoints_)
49  delete dp;
50  if (deleteDef_)
51  delete dpd_;
52  if (deleteDefFast_)
53  delete dpdFast_;
54 }
55 
56 void FastMonitor::addFastPathDefinition(std::string const& defPathFast, std::string const defGroupFast, bool strict) {
57  haveFastPath_ = true;
58  defPathFast_ = defPathFast;
59  auto temp = new DataPointDefinition();
61  dpdFast_ = temp;
62  fastPathStrictChecking_ = strict;
63  deleteDefFast_ = true;
64 }
65 
66 //per-process variables
68  bool NAifZeroUpdates,
69  unsigned int* nBins) {
71  dp->trackMonitorable(newMonitorable, NAifZeroUpdates);
72  dp->setNBins(nBins);
73  dataPoints_.push_back(dp);
74  dpNameMap_[newMonitorable->getName()] = dataPoints_.size() - 1;
75 
76  //checks if the same name is registered twice
77  assert(uids_.insert(newMonitorable->getName()).second);
78 }
79 
80 //fast path: no merge operation is performed
83  dp->trackMonitorable(newMonitorable, false);
84  dataPointsFastOnly_.push_back(dp);
85 }
86 
87 //per-stream variables
89  std::vector<unsigned int>* inputs,
90  bool NAifZeroUpdates,
91  unsigned int* nBins) {
93  dp->trackVectorUInt(name, inputs, NAifZeroUpdates);
94  dp->setNBins(nBins);
95  dataPoints_.push_back(dp);
96  dpNameMap_[name] = dataPoints_.size() - 1;
97  assert(uids_.insert(name).second);
98 }
99 
100 //atomic variables with guaranteed updates at the time of reading
102  std::vector<AtomicMonUInt*>* inputs,
103  bool NAifZeroUpdates,
104  unsigned int* nBins) {
105  std::string definitionToPass;
106  if (useDefinition_)
107  definitionToPass = defPath_;
108  DataPoint* dp = new DataPoint(definitionToPass, sourceInfo_);
109  dp->trackVectorUIntAtomic(name, inputs, NAifZeroUpdates);
110  dp->setNBins(nBins);
111  dataPoints_.push_back(dp);
112  dpNameMap_[name] = dataPoints_.size() - 1;
113  assert(uids_.insert(name).second);
114 }
115 
116 void FastMonitor::commit(std::vector<unsigned int>* streamLumisPtr) {
117  std::vector<std::string> const& jsonNames = dpd_->getNames();
118  regDpCount_ = dataPoints_.size();
119  if (strictChecking_)
120  assert(jsonNames.size() == regDpCount_);
121 
122  std::map<unsigned int, bool> hasJson;
123  for (unsigned int i = 0; i < jsonNames.size(); i++) {
124  bool notFoundVar = true;
125  for (unsigned int j = 0; j < regDpCount_; j++) {
126  if (dataPoints_[j]->getName() == jsonNames[i]) {
127  dataPoints_[j]->setOperation(dpd_->getOperationFor(i));
128  jsonDpIndex_.push_back(j);
129  hasJson[j] = true;
130  notFoundVar = false;
131  break;
132  }
133  }
134  if (notFoundVar) {
136  //push dummy DP if not registered by the service so that we output required JSON/CSV
137  DataPoint* dummyDp = new DataPoint(sourceInfo_, defPath_);
138  dummyDp->trackDummy(jsonNames[i], true);
139  dataPoints_.push_back(dummyDp);
140  jsonDpIndex_.push_back(dataPoints_.size() - 1);
141  }
142  }
143  for (unsigned int i = 0; i < regDpCount_; i++) {
144  dataPoints_[i]->setStreamLumiPtr(streamLumisPtr);
145  }
146 
147  //fast path:
148  if (haveFastPath_) {
149  std::vector<std::string> const& fjsonNames = dpdFast_->getNames();
151  assert(!(fastPathStrictChecking_ && fjsonNames.size() == fregDpCount_));
152  std::map<unsigned int, bool> fhasJson;
153  for (unsigned int i = 0; i < fjsonNames.size(); i++) {
154  bool notFoundVar = true;
155  for (unsigned int j = 0; j < fregDpCount_; j++) {
156  if (dataPointsFastOnly_[j]->getName() == fjsonNames[i]) {
158  fhasJson[j] = true;
159  notFoundVar = false;
160  break;
161  }
162  }
163  if (notFoundVar) {
164  //try to find variable among slow variables
165 
166  bool notFoundVarSlow = true;
167  for (unsigned int j = 0; j < regDpCount_; j++) {
168  if (dataPoints_[j]->getName() == fjsonNames[i]) {
169  jsonDpIndexFast_.push_back(dataPoints_[j]);
170  //fhasJson[j]=true;
171  notFoundVarSlow = false;
172  break;
173  }
174  }
175 
176  assert(!(fastPathStrictChecking_ && !notFoundVarSlow));
177  //push dummy DP if not registered by the service so that we output required JSON/CSV
178  if (notFoundVarSlow) {
179  DataPoint* dummyDp = new DataPoint(sourceInfo_, defPathFast_);
180  dummyDp->trackDummy(fjsonNames[i], true);
181  dataPointsFastOnly_.push_back(dummyDp);
182  jsonDpIndexFast_.push_back(dummyDp);
183  }
184  }
185  }
186  }
187 }
188 
189 //update everything
190 void FastMonitor::snap(unsigned int ls) {
191  recentSnaps_++;
193  for (unsigned int i = 0; i < regDpCount_; i++) {
194  dataPoints_[i]->snap(ls);
195  }
196 }
197 
198 //update for global variables as most of them are correct only at global EOL
199 void FastMonitor::snapGlobal(unsigned int ls) {
200  recentSnaps_++;
201  for (unsigned int i = 0; i < regDpCount_; i++) {
202  dataPoints_[i]->snapGlobal(ls);
203  }
204 }
205 
206 //update atomic per-stream vars(e.g. event counters) not updating time-based measurements (mini/microstate)
207 void FastMonitor::snapStreamAtomic(unsigned int ls, unsigned int streamID) {
208  recentSnaps_++;
209  for (unsigned int i = 0; i < regDpCount_; i++) {
210  dataPoints_[i]->snapStreamAtomic(ls, streamID);
211  }
212 }
213 
215  //output what was specified in JSON in the same order (including dummies)
216  unsigned int monSize = jsonDpIndexFast_.size();
217  std::stringstream ss;
218  if (monSize) {
219  for (unsigned int j = 0; j < monSize; j++) {
220  ss << jsonDpIndexFast_[j]->fastOutCSV(sid);
221  if (j < monSize - 1)
222  ss << ",";
223  }
224  }
225  return ss.str();
226 }
227 
228 void FastMonitor::outputCSV(std::string const& path, std::string const& csvString) {
229  std::ofstream outputFile;
231  outputFile << defPathFast_ << std::endl;
232  outputFile << csvString << std::endl;
233  outputFile.close();
234 }
235 
236 //get one variable (caller must delete it later)
238  auto it = dpNameMap_.find(name);
239  assert(it != dpNameMap_.end());
240  return dataPoints_[it->second]->mergeAndRetrieveValue(forLumi);
241 }
242 
243 bool FastMonitor::outputFullJSONs(std::string const& pathstem, std::string const& ext, unsigned int lumi, bool output) {
244  LogDebug("FastMonitor") << "SNAP updates -: " << recentSnaps_ << " (by timer: " << recentSnapsTimer_
245  << ") in lumisection ";
246 
248  for (unsigned int i = 0; i < nStreams_; i++) {
249  //merge even if no output
250  Json::Value serializeRoot;
251  for (unsigned int j = 0; j < jsonDpIndex_.size(); j++) {
252  dataPoints_[jsonDpIndex_[j]]->mergeAndSerialize(serializeRoot, lumi, true, i);
253  }
254  if (!output)
255  continue;
256  //get extension
257  std::stringstream tidext;
258  tidext << "_tid" << i;
259  std::string path = pathstem + tidext.str() + ext;
260 
262  std::string&& result = writer.write(serializeRoot);
264  }
265  return output;
266 }
267 
268 bool FastMonitor::outputFullJSON(std::string const& path, unsigned int lumi, bool output) {
269  LogDebug("FastMonitor") << "SNAP updates -: " << recentSnaps_ << " (by timer: " << recentSnapsTimer_
270  << ") in lumisection ";
271 
273  Json::Value serializeRoot;
274  for (unsigned int j = 0; j < jsonDpIndex_.size(); j++) {
275  dataPoints_[jsonDpIndex_[j]]->mergeAndSerialize(serializeRoot, lumi, j == 0, -1);
276  }
277  if (!output)
278  return false;
279 
281  std::string&& result = writer.write(serializeRoot);
283  return true;
284 }
285 
286 void FastMonitor::discardCollected(unsigned int forLumi) {
287  for (auto dp : dataPoints_)
288  dp->discardCollected(forLumi);
289 }
290 
292  std::stringstream hpid;
293  int pid = (int)getpid();
294  char hostname[128];
295  gethostname(hostname, sizeof hostname);
296  hpid << hostname << "_" << pid;
297  sHPid = hpid.str();
298 }
void registerFastGlobalMonitorable(JsonMonitorable *newMonitorable)
Definition: FastMonitor.cc:81
void addFastPathDefinition(std::string const &defPathFast, std::string const defGroupFast, bool strict)
Definition: FastMonitor.cc:56
void registerStreamMonitorableUIntVecAtomic(std::string const &name, std::vector< AtomicMonUInt *> *inputs, bool NAifZeroUpdates, unsigned int *nBins=nullptr)
Definition: FastMonitor.cc:101
DataPointDefinition const * dpd_
Definition: FastMonitor.h:107
void trackDummy(std::string const &name, bool setNAifZeroUpdates)
Definition: DataPoint.h:82
void snapStreamAtomic(unsigned int ls, unsigned int streamID)
Definition: FastMonitor.cc:207
std::vector< DataPoint * > dataPointsFastOnly_
Definition: FastMonitor.h:113
Represents a JSON value.
Definition: value.h:99
assert(be >=bs)
FastMonitor(std::string const &defPath, std::string const defGroup, bool strictChecking, bool useSource=true, bool useDefinition=true)
Definition: FastMonitor.cc:22
void registerGlobalMonitorable(JsonMonitorable *newMonitorable, bool NAifZeroUpdates, unsigned int *nBins=nullptr)
Definition: FastMonitor.cc:67
std::vector< unsigned int > jsonDpIndex_
Definition: FastMonitor.h:114
U second(std::pair< T, U > const &p)
static bool getDataPointDefinitionFor(std::string &defFilePath, DataPointDefinition *dpd, const std::string *defaultGroup=nullptr)
std::vector< DataPoint * > dataPoints_
Definition: FastMonitor.h:112
void registerStreamMonitorableUIntVec(std::string const &name, std::vector< unsigned int > *inputs, bool NAifZeroUpdates, unsigned int *nBins=nullptr)
Definition: FastMonitor.cc:88
std::map< std::string, unsigned int > dpNameMap_
Definition: FastMonitor.h:117
std::unordered_set< std::string > uids_
Definition: FastMonitor.h:124
static void writeStringToFile(std::string const &filename, std::string &content)
Definition: FileIO.cc:21
void commit(std::vector< unsigned int > *streamLumisPtr)
Definition: FastMonitor.cc:116
virtual std::string const & getName() const
def ls(path, rec=False)
Definition: eostools.py:349
std::string getCSVString(int sid=-1)
Definition: FastMonitor.cc:214
std::vector< std::string > const & getNames() const
bool outputFullJSON(std::string const &path, unsigned int lumi, bool output=true)
Definition: FastMonitor.cc:268
std::vector< DataPoint * > jsonDpIndexFast_
Definition: FastMonitor.h:115
DataPointDefinition const * dpdFast_
Definition: FastMonitor.h:108
void outputCSV(std::string const &path, std::string const &csvString)
Definition: FastMonitor.cc:228
void snap(unsigned int ls)
Definition: FastMonitor.cc:190
OperationType getOperationFor(unsigned int index) const
JsonMonitorable * getMergedIntJForLumi(std::string const &name, unsigned int forLumi)
Definition: FastMonitor.cc:237
std::string getName(const G4String &)
Definition: ForwardName.cc:3
unsigned int recentSnapsTimer_
Definition: FastMonitor.h:120
Definition: output.py:1
void getHostAndPID(std::string &sHPid)
Definition: FastMonitor.cc:291
Definition: memstream.h:15
Writes a Value in JSON format in a human friendly way.
Definition: writer.h:63
void discardCollected(unsigned int forLumi)
Definition: FastMonitor.cc:286
bool outputFullJSONs(std::string const &pathstem, std::string const &ext, unsigned int lumi, bool output=true)
Definition: FastMonitor.cc:243
void snapGlobal(unsigned int ls)
Definition: FastMonitor.cc:199
#define LogDebug(id)