CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SMPSWebPageHelper.cc
Go to the documentation of this file.
1 // $Id: SMPSWebPageHelper.cc,v 1.1.2.14 2011/03/01 08:32:15 mommsen Exp $
3 
8 #include "EventFilter/StorageManager/src/ConsumerWebPageHelper.icc"
9 
10 #include <boost/pointer_cast.hpp>
11 
12 
13 namespace smproxy
14 {
16  (
17  xdaq::ApplicationDescriptor* appDesc,
18  StateMachinePtr stateMachine
19  ) :
21  stateMachine_(stateMachine),
22  consumerWebPageHelper_(appDesc, "$Name: SMPSdev_branch $", this, &smproxy::SMPSWebPageHelper::addDOMforHyperLinks)
23  { }
24 
25 
27  {
28  stor::XHTMLMonitor theMonitor;
30 
32  "Main",
33  stateMachine_->getExternallyVisibleStateName(),
34  stateMachine_->getStateName(),
35  stateMachine_->getReasonForFailed()
36  );
37 
39  stateMachine_->getStatisticsReporter()->
40  getDataRetrieverMonitorCollection().getSummaryStats(summaryStats);
41 
42  addDOMforConnectionInfo(maker, body, summaryStats);
43 
44  maker.addNode("br", body);
45 
46  addDOMforThroughputPerEventType(maker, body, summaryStats);
47 
48  addDOMforHyperLinks(maker, body);
49 
50  // Dump the webpage to the output stream
51  maker.out(*out);
52  }
53 
54 
56  {
57  stor::XHTMLMonitor theMonitor;
59 
61  "Data Retrieval",
62  stateMachine_->getExternallyVisibleStateName(),
63  stateMachine_->getStateName(),
64  stateMachine_->getReasonForFailed()
65  );
66 
67  addDOMforEventServers(maker, body);
68 
69  maker.addNode("hr", body);
70 
71  addDOMforDQMEventServers(maker, body);
72 
73  addDOMforHyperLinks(maker, body);
74 
75  // Dump the webpage to the output stream
76  maker.out(*out);
77  }
78 
79 
81  {
83  stateMachine_->getExternallyVisibleStateName(),
84  stateMachine_->getStateName(),
85  stateMachine_->getReasonForFailed(),
86  stateMachine_->getStatisticsReporter(),
87  stateMachine_->getRegistrationCollection(),
88  stateMachine_->getEventQueueCollection(),
89  stateMachine_->getDQMEventQueueCollection()
90  );
91  }
92 
93 
95  {
96  stor::XHTMLMonitor theMonitor;
98 
100  "DQM Event Processor",
101  stateMachine_->getExternallyVisibleStateName(),
102  stateMachine_->getStateName(),
103  stateMachine_->getReasonForFailed()
104  );
105 
106  const stor::DQMEventMonitorCollection& demc =
107  stateMachine_->getStatisticsReporter()->getDQMEventMonitorCollection();
108  addDOMforProcessedDQMEvents(maker, body, demc);
109  addDOMforDQMEventStatistics(maker, body, demc);
110 
111  addDOMforHyperLinks(maker, body);
112 
113  // Dump the webpage to the output stream
114  maker.out(*out);
115  }
116 
117 
119  (
122  ) const
123  {
124  std::string url = appDescriptor_->getContextDescriptor()->getURL()
125  + "/" + appDescriptor_->getURN();
126 
127  stor::XHTMLMaker::AttrMap linkAttr;
129 
130  maker.addNode("hr", parent);
131 
132  linkAttr[ "href" ] = url;
133  link = maker.addNode("a", parent, linkAttr);
134  maker.addText(link, "Main web page");
135 
136  maker.addNode("hr", parent);
137 
138  linkAttr[ "href" ] = url + "/dataRetriever";
139  link = maker.addNode("a", parent, linkAttr);
140  maker.addText(link, "Data retriever web page");
141 
142  maker.addNode("hr", parent);
143 
144  linkAttr[ "href" ] = url + "/dqmEventStatistics";
145  link = maker.addNode("a", parent, linkAttr);
146  maker.addText(link, "DQM event processor statistics");
147 
148  maker.addNode("hr", parent);
149 
150  linkAttr[ "href" ] = url + "/consumerStatistics";
151  link = maker.addNode("a", parent, linkAttr);
152  maker.addText(link, "Consumer Statistics");
153 
154  maker.addNode("hr", parent);
155  }
156 
157 
159  (
160  stor::XHTMLMaker& maker,
161  stor::XHTMLMaker::Node* parent,
163  ) const
164  {
165  stor::XHTMLMaker::AttrMap colspanAttr;
166  colspanAttr[ "colspan" ] = "2";
167 
168  stor::XHTMLMaker::AttrMap tableAttr = tableAttr_;
169  tableAttr[ "width" ] = "50%";
170 
171  stor::XHTMLMaker::AttrMap widthAttr;
172  widthAttr[ "width" ] = "70%";
173 
174  stor::XHTMLMaker::Node* table = maker.addNode("table", parent, tableAttr);
175 
176  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, rowAttr_);
177  stor::XHTMLMaker::Node* tableDiv = maker.addNode("th", tableRow, colspanAttr);
178  maker.addText(tableDiv, "Connection Information");
179 
180  // # of configured SMs
181  tableRow = maker.addNode("tr", table, rowAttr_);
182  tableDiv = maker.addNode("td", tableRow, widthAttr);
183  maker.addText(tableDiv, "# of configured StorageManagers");
184  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
185  const size_t configuredSMs = stateMachine_->getConfiguration()->
186  getDataRetrieverParams().smRegistrationList_.size();
187  maker.addInt(tableDiv, configuredSMs);
188 
189  // # of requested SMs connections
190  tableRow = maker.addNode("tr", table, rowAttr_);
191  tableDiv = maker.addNode("td", tableRow, widthAttr);
192  maker.addText(tableDiv, "# of requested SM connections");
193  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
194  maker.addInt(tableDiv, summaryStats.registeredSMs);
195 
196  // # of active SMs connections
197  tableRow = maker.addNode("tr", table, rowAttr_);
198  tableDiv = maker.addNode("td", tableRow, widthAttr);
199  maker.addText(tableDiv, "# of active SM connections");
200  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
201  maker.addInt(tableDiv, summaryStats.activeSMs);
202 
203  // # of connected event consumers
204  tableRow = maker.addNode("tr", table, rowAttr_);
205  tableDiv = maker.addNode("td", tableRow, widthAttr);
206  maker.addText(tableDiv, "# of connected event consumers");
207  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
209  stateMachine_->getRegistrationCollection()->
210  getEventConsumers(consumers);
211  maker.addInt(tableDiv, consumers.size());
212 
213  // # of connected DQM event (histogram) consumers
214  tableRow = maker.addNode("tr", table, rowAttr_);
215  tableDiv = maker.addNode("td", tableRow, widthAttr);
216  maker.addText(tableDiv, "# of connected histogram consumers");
217  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
219  stateMachine_->getRegistrationCollection()->
220  getDQMEventConsumers(dqmConsumers);
221  maker.addInt(tableDiv, dqmConsumers.size());
222  }
223 
224 
226  (
227  stor::XHTMLMaker& maker,
228  stor::XHTMLMaker::Node* parent,
230  ) const
231  {
232  stor::XHTMLMaker::AttrMap colspanAttr;
233  colspanAttr[ "colspan" ] = "11";
234 
235  stor::XHTMLMaker::AttrMap subColspanAttr;
236 
237  stor::XHTMLMaker::AttrMap rowspanAttr;
238  rowspanAttr[ "rowspan" ] = "3";
239  rowspanAttr[ "width" ] = "30%";
240 
241  stor::XHTMLMaker::AttrMap noWrapAttr;
242  noWrapAttr[ "style" ] = "white-space: nowrap;";
243 
244  stor::XHTMLMaker::Node* table = maker.addNode("table", parent, tableAttr_);
245  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, rowAttr_);
246  stor::XHTMLMaker::Node* tableDiv = maker.addNode("th", tableRow, colspanAttr);
247  maker.addText(tableDiv, "Throughput");
248 
249  tableRow = maker.addNode("tr", table, rowAttr_);
250  tableDiv = maker.addNode("th", tableRow, rowspanAttr);
251  maker.addText(tableDiv, "Requested Event Type");
252  subColspanAttr[ "colspan" ] = "2";
253  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
254  maker.addText(tableDiv, "");
255  subColspanAttr[ "colspan" ] = "4";
256  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
257  maker.addText(tableDiv, "Input");
258  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
259  maker.addText(tableDiv, "Output");
260 
261  subColspanAttr[ "colspan" ] = "2";
262  tableRow = maker.addNode("tr", table, rowAttr_);
263  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
264  maker.addText(tableDiv, "Average Event Size (kB)");
265  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
266  maker.addText(tableDiv, "Event Rate (Hz)");
267  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
268  maker.addText(tableDiv, "Bandwidth (kB/s)");
269  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
270  maker.addText(tableDiv, "Event Rate (Hz)");
271  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
272  maker.addText(tableDiv, "Bandwidth (kB/s)");
273 
274  tableRow = maker.addNode("tr", table, rowAttr_);
275  tableDiv = maker.addNode("th", tableRow);
276  maker.addText(tableDiv, "overall");
277  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
278  maker.addText(tableDiv, "last 60 s");
279  tableDiv = maker.addNode("th", tableRow);
280  maker.addText(tableDiv, "overall");
281  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
282  maker.addText(tableDiv, "last 60 s");
283  tableDiv = maker.addNode("th", tableRow);
284  maker.addText(tableDiv, "overall");
285  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
286  maker.addText(tableDiv, "last 60 s");
287  tableDiv = maker.addNode("th", tableRow);
288  maker.addText(tableDiv, "overall");
289  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
290  maker.addText(tableDiv, "last 60 s");
291  tableDiv = maker.addNode("th", tableRow);
292  maker.addText(tableDiv, "overall");
293  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
294  maker.addText(tableDiv, "last 60 s");
295 
296  if ( summaryStats.eventTypeStats.empty() )
297  {
298  stor::XHTMLMaker::AttrMap messageAttr = colspanAttr;
299  messageAttr[ "align" ] = "center";
300 
301  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, rowAttr_);
302  stor::XHTMLMaker::Node* tableDiv = maker.addNode("td", tableRow, messageAttr);
303  maker.addText(tableDiv, "No data flowing, yet.");
304  return;
305  }
306 
307  bool evenRow = false;
308 
309  for (DataRetrieverMonitorCollection::SummaryStats::EventTypeStatList::const_iterator
310  it = summaryStats.eventTypeStats.begin(), itEnd = summaryStats.eventTypeStats.end();
311  it != itEnd; ++it)
312  {
313  stor::XHTMLMaker::AttrMap rowAttr = rowAttr_;
314  if( evenRow )
315  {
316  rowAttr[ "style" ] = "background-color:#e0e0e0;";
317  evenRow = false;
318  }
319  else
320  {
321  evenRow = true;
322  }
323  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, rowAttr);
324  addRowForEventType(maker, tableRow, *it);
325  }
326 
327  addSummaryRowForThroughput(maker, table, summaryStats);
328  }
329 
330 
332  (
333  stor::XHTMLMaker& maker,
334  stor::XHTMLMaker::Node* tableRow,
336  ) const
337  {
338  // Event type
339  stor::XHTMLMaker::Node* tableDiv = maker.addNode("td", tableRow);
340  stor::XHTMLMaker::Node* pre = maker.addNode("pre", tableDiv);
341  std::ostringstream eventType;
342  stats.first->eventType(eventType);
343  maker.addText(pre, eventType.str());
344 
345  // Average event size
346  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
347  maker.addDouble(tableDiv, stats.second.getValueAverage(stor::MonitoredQuantity::FULL));
348  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
349  maker.addDouble(tableDiv, stats.second.getValueAverage(stor::MonitoredQuantity::RECENT));
350 
351  // Input event rate
352  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
353  maker.addDouble(tableDiv, stats.second.getSampleRate(stor::MonitoredQuantity::FULL));
354  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
355  maker.addDouble(tableDiv, stats.second.getSampleRate(stor::MonitoredQuantity::RECENT));
356 
357  // Input bandwidth
358  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
359  maker.addDouble(tableDiv, stats.second.getValueRate(stor::MonitoredQuantity::FULL));
360  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
361  maker.addDouble(tableDiv, stats.second.getValueRate(stor::MonitoredQuantity::RECENT));
362 
363  // Get statistics for consumers requesting this event type
364  stor::QueueIDs queueIDs;
365  bool isEventConsumer =
366  stateMachine_->getDataManager()->getQueueIDsFromDataEventRetrievers(
367  boost::dynamic_pointer_cast<stor::EventConsumerRegistrationInfo>(stats.first),
368  queueIDs
369  );
370  if ( ! isEventConsumer)
371  {
372  stateMachine_->getDataManager()->getQueueIDsFromDQMEventRetrievers(
373  boost::dynamic_pointer_cast<stor::DQMEventConsumerRegistrationInfo>(stats.first),
374  queueIDs
375  );
376  }
377 
378  if ( queueIDs.empty() )
379  {
380  stor::XHTMLMaker::AttrMap noConsumersAttr = tableLabelAttr_;
381  noConsumersAttr[ "colspan" ] = "4";
382  tableDiv = maker.addNode("td", tableRow, noConsumersAttr);
383  maker.addText(tableDiv, "no consumers connected");
384  return;
385  }
386 
388  stateMachine_->getStatisticsReporter()->getEventConsumerMonitorCollection();
390  stateMachine_->getStatisticsReporter()->getDQMConsumerMonitorCollection();
392  isEventConsumer ?
393  static_cast<const stor::ConsumerMonitorCollection&>(ecmc) :
394  static_cast<const stor::ConsumerMonitorCollection&>(dcmc);
395 
396  double rateOverall = 0;
397  double rateRecent = 0;
398  double bandwidthOverall = 0;
399  double bandwidthRecent = 0;
400 
401  for ( stor::QueueIDs::const_iterator it = queueIDs.begin(),
402  itEnd = queueIDs.end(); it != itEnd; ++it)
403  {
405  if ( cmc.getServed(*it, result) )
406  {
407  rateOverall += result.getSampleRate(stor::MonitoredQuantity::FULL);
408  rateRecent += result.getSampleRate(stor::MonitoredQuantity::RECENT);
409  bandwidthOverall += result.getValueRate(stor::MonitoredQuantity::FULL) / 1024;
410  bandwidthRecent += result.getValueRate(stor::MonitoredQuantity::RECENT) / 1024;
411  }
412  }
413 
414  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
415  maker.addDouble(tableDiv, rateOverall);
416  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
417  maker.addDouble(tableDiv, rateRecent);
418  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
419  maker.addDouble(tableDiv, bandwidthOverall);
420  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
421  maker.addDouble(tableDiv, bandwidthRecent);
422  }
423 
424 
426  (
427  stor::XHTMLMaker& maker,
430  ) const
431  {
432  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, specialRowAttr_);
433  stor::XHTMLMaker::Node* tableDiv = maker.addNode("td", tableRow);
434  maker.addText(tableDiv, "Total");
435 
436  // Average event size
437  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
438  maker.addDouble(tableDiv, summaryStats.sizeStats.getValueAverage(stor::MonitoredQuantity::FULL));
439  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
441 
442  // Input event rate
443  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
444  maker.addDouble(tableDiv, summaryStats.sizeStats.getSampleRate(stor::MonitoredQuantity::FULL));
445  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
446  maker.addDouble(tableDiv, summaryStats.sizeStats.getSampleRate(stor::MonitoredQuantity::RECENT));
447 
448  // Input bandwidth
449  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
450  maker.addDouble(tableDiv, summaryStats.sizeStats.getValueRate(stor::MonitoredQuantity::FULL));
451  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
452  maker.addDouble(tableDiv, summaryStats.sizeStats.getValueRate(stor::MonitoredQuantity::RECENT));
453 
455  stateMachine_->getStatisticsReporter()->getEventConsumerMonitorCollection();
457  stateMachine_->getStatisticsReporter()->getDQMConsumerMonitorCollection();
458  stor::ConsumerMonitorCollection::TotalStats ecmcStats, dcmcStats;
459  ecmc.getTotalStats(ecmcStats);
460  dcmc.getTotalStats(dcmcStats);
461 
462  // Output event rate
463  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
464  maker.addDouble(tableDiv,
467  );
468  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
469  maker.addDouble(tableDiv,
472  );
473 
474  // Output bandwidth
475  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
476  maker.addDouble(tableDiv,
479  );
480  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
481  maker.addDouble(tableDiv,
484  );
485  }
486 
487 
489  (
490  stor::XHTMLMaker& maker,
491  stor::XHTMLMaker::Node* parent
492  ) const
493  {
494  stor::XHTMLMaker::AttrMap colspanAttr;
495  colspanAttr[ "colspan" ] = "10";
496 
497  stor::XHTMLMaker::Node* table = maker.addNode("table", parent, tableAttr_);
498 
499  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, rowAttr_);
500  stor::XHTMLMaker::Node* tableDiv = maker.addNode("th", tableRow, colspanAttr);
501  maker.addText(tableDiv, "Event Servers");
502 
503  stor::XHTMLMaker::AttrMap rowspanAttr;
504  rowspanAttr[ "rowspan" ] = "2";
505 
506  stor::XHTMLMaker::AttrMap subColspanAttr;
507  subColspanAttr[ "colspan" ] = "2";
508 
509  stor::XHTMLMaker::AttrMap noWrapAttr;
510  noWrapAttr[ "style" ] = "white-space: nowrap;";
511 
512  // Header
513  tableRow = maker.addNode("tr", table, specialRowAttr_);
514  tableDiv = maker.addNode("th", tableRow, rowspanAttr);
515  maker.addText(tableDiv, "Hostname");
516  tableDiv = maker.addNode("th", tableRow, rowspanAttr);
517  maker.addText(tableDiv, "Status");
518  tableDiv = maker.addNode("th", tableRow, rowspanAttr);
519  maker.addText(tableDiv, "Requested Event Type");
520  tableDiv = maker.addNode("th", tableRow, rowspanAttr);
521  maker.addText(tableDiv, "Max Request Rate (Hz)");
522  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
523  maker.addText(tableDiv, "Event Rate (Hz)");
524  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
525  maker.addText(tableDiv, "Average Event Size (kB)");
526  tableDiv = maker.addNode("th", tableRow, subColspanAttr);
527  maker.addText(tableDiv, "Bandwidth (kB/s)");
528 
529  tableRow = maker.addNode("tr", table, specialRowAttr_);
530  tableDiv = maker.addNode("th", tableRow);
531  maker.addText(tableDiv, "overall");
532  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
533  maker.addText(tableDiv, "last 60 s");
534  tableDiv = maker.addNode("th", tableRow);
535  maker.addText(tableDiv, "overall");
536  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
537  maker.addText(tableDiv, "last 60 s");
538  tableDiv = maker.addNode("th", tableRow);
539  maker.addText(tableDiv, "overall");
540  tableDiv = maker.addNode("th", tableRow, noWrapAttr);
541  maker.addText(tableDiv, "last 60 s");
542 
544  stateMachine_->getStatisticsReporter()->getDataRetrieverMonitorCollection()
545  .getStatsByEventTypes(eventTypeStats);
546 
548  stateMachine_->getStatisticsReporter()->getDataRetrieverMonitorCollection()
549  .getStatsByConnection(connectionStats);
550 
551  if ( eventTypeStats.empty() )
552  {
553  stor::XHTMLMaker::AttrMap messageAttr = colspanAttr;
554  messageAttr[ "align" ] = "center";
555 
556  tableRow = maker.addNode("tr", table, rowAttr_);
557  tableDiv = maker.addNode("td", tableRow, messageAttr);
558  maker.addText(tableDiv, "Not registered to any event servers yet");
559  return;
560  }
561 
562  bool evenRow = false;
563 
564  for (DataRetrieverMonitorCollection::EventTypeStatList::const_iterator
565  it = eventTypeStats.begin(), itEnd = eventTypeStats.end();
566  it != itEnd; ++it)
567  {
568  stor::XHTMLMaker::AttrMap rowAttr = rowAttr_;
569  if( evenRow )
570  {
571  rowAttr[ "style" ] = "background-color:#e0e0e0;";
572  evenRow = false;
573  }
574  else
575  {
576  evenRow = true;
577  }
578  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, rowAttr);
579  addRowForEventServer(maker, tableRow, *it);
580 
581  const std::string currentSourceURL = it->regPtr->sourceURL();
582 
583  if ( (it+1) == eventTypeStats.end() ||
584  (it+1)->regPtr->sourceURL() != currentSourceURL )
585  {
586  addSummaryRowForEventServer(maker, table,
587  connectionStats.find(currentSourceURL));
588  }
589  }
590  }
591 
592 
594  (
595  stor::XHTMLMaker& maker,
596  stor::XHTMLMaker::Node* tableRow,
598  ) const
599  {
600  stor::XHTMLMaker::Node* tableDiv;
601 
602  // Hostname
603  addDOMforSMhost(maker, tableRow, stats.regPtr->sourceURL());
604 
605  // Status
607  {
608  tableDiv = maker.addNode("td", tableRow, tableLabelAttr_);
609  maker.addText(tableDiv, "Connected");
610  }
611  else
612  {
613  stor::XHTMLMaker::AttrMap statusAttr = tableLabelAttr_;
614  statusAttr[ "style" ] = "color:brown;";
615  tableDiv = maker.addNode("td", tableRow, statusAttr);
616  std::ostringstream status;
617  status << stats.connectionStatus;
618  maker.addText(tableDiv, status.str());
619  }
620 
621  // Requested event type
622  tableDiv = maker.addNode("td", tableRow, tableLabelAttr_);
623  stor::XHTMLMaker::Node* pre = maker.addNode("pre", tableDiv);
624  std::ostringstream eventType;
625  stats.regPtr->eventType(eventType);
626  maker.addText(pre, eventType.str());
627 
628  // Max request rate
629  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
631  stats.regPtr->minEventRequestInterval();
632  if ( interval.is_not_a_date_time() )
633  maker.addText(tableDiv, "unlimited");
634  else
635  maker.addDouble(tableDiv, 1 / stor::utils::durationToSeconds(interval), 1);
636 
637  // Event rate
638  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
640  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
642 
643  // Average event size
644  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
646  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
648 
649  // Bandwidth
650  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
652  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
654  }
655 
656 
658  (
659  stor::XHTMLMaker& maker,
660  stor::XHTMLMaker::Node* table,
661  DataRetrieverMonitorCollection::ConnectionStats::const_iterator pos
662  ) const
663  {
664  stor::XHTMLMaker::Node* tableRow = maker.addNode("tr", table, specialRowAttr_);
665 
666  // Hostname
667  addDOMforSMhost(maker, tableRow, pos->first);
668 
669  // Status, requst type, and max request rate not filled
670  stor::XHTMLMaker::Node* tableDiv = maker.addNode("td", tableRow);
671  tableDiv = maker.addNode("td", tableRow);
672  tableDiv = maker.addNode("td", tableRow);
673 
674  // Event rate
675  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
676  maker.addDouble(tableDiv, pos->second.getSampleRate(stor::MonitoredQuantity::FULL));
677  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
678  maker.addDouble(tableDiv, pos->second.getSampleRate(stor::MonitoredQuantity::RECENT));
679 
680  // Average event size
681  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
682  maker.addDouble(tableDiv, pos->second.getValueAverage(stor::MonitoredQuantity::FULL));
683  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
684  maker.addDouble(tableDiv, pos->second.getValueAverage(stor::MonitoredQuantity::RECENT));
685 
686  // Bandwidth
687  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
688  maker.addDouble(tableDiv, pos->second.getValueRate(stor::MonitoredQuantity::FULL));
689  tableDiv = maker.addNode("td", tableRow, tableValueAttr_);
690  maker.addDouble(tableDiv, pos->second.getValueRate(stor::MonitoredQuantity::RECENT));
691  }
692 
693 
695  (
696  stor::XHTMLMaker& maker,
697  stor::XHTMLMaker::Node* tableRow,
698  const std::string& sourceURL
699  ) const
700  {
701  stor::XHTMLMaker::Node* tableDiv = maker.addNode("td", tableRow, tableLabelAttr_);
702  std::string::size_type startPos = sourceURL.find("//");
703  if ( startPos == std::string::npos )
704  startPos = 0;
705  else
706  startPos += 2;
707  const std::string::size_type endPos = sourceURL.find('.');
708  const std::string hostname = sourceURL.substr(startPos,(endPos-startPos));
709  stor::XHTMLMaker::AttrMap linkAttr;
710  linkAttr[ "href" ] = sourceURL + "/consumerStatistics";
711  stor::XHTMLMaker::Node* link = maker.addNode("a", tableDiv, linkAttr);
712  maker.addText(link, hostname);
713  }
714 
715 
717  (
718  stor::XHTMLMaker& maker,
719  stor::XHTMLMaker::Node* parent
720  ) const
721  {
722  }
723 
724 } // namespace smproxy
725 
726 
double getValueRate(DataSetType t=FULL) const
list table
Definition: asciidump.py:386
Node * addNode(const std::string &name, Node *parent, const AttrMap &attrs)
Definition: XHTMLMaker.cc:146
void addDOMforDQMEventStatistics(XHTMLMaker &maker, XHTMLMaker::Node *parent, DQMEventMonitorCollection const &) const
void addDouble(Node *parent, const double &value, const unsigned int &precision=2)
Definition: XHTMLMaker.cc:244
std::vector< EventConsRegPtr > ConsumerRegistrations
bool getServed(const QueueID &qid, MonitoredQuantity::Stats &result) const
list parent
Definition: dbtoconf.py:74
void addText(Node *parent, const std::string &)
Definition: XHTMLMaker.cc:173
void addSummaryRowForThroughput(stor::XHTMLMaker &, stor::XHTMLMaker::Node *table, DataRetrieverMonitorCollection::SummaryStats const &) const
tuple interval
Definition: MergeJob_cfg.py:20
void addRowForEventServer(stor::XHTMLMaker &, stor::XHTMLMaker::Node *table, DataRetrieverMonitorCollection::EventTypeStats const &) const
std::vector< QueueID > QueueIDs
Definition: QueueID.h:80
void defaultWebPage(xgi::Output *) const
std::pair< stor::RegPtr, stor::MonitoredQuantity::Stats > EventTypeStats
void dataRetrieverWebPage(xgi::Output *) const
uint16_t size_type
std::string link(std::string &nm, std::string &ns)
Definition: hierarchy.cc:47
boost::posix_time::time_duration Duration_t
Definition: Utils.h:41
void addDOMforDQMEventServers(stor::XHTMLMaker &, stor::XHTMLMaker::Node *parent) const
edm::serviceregistry::AllArgsMaker< DTDataMonitorInterface, DTDataIntegrityTask > maker
Definition: plugins.cc:58
tuple result
Definition: query.py:137
std::map< std::string, std::string > AttrMap
Definition: XHTMLMaker.h:36
ConsumerWebPageHelper_t consumerWebPageHelper_
void addInt(Node *parent, const int &)
Definition: XHTMLMaker.cc:184
double getSampleRate(DataSetType t=FULL) const
void dqmEventStatisticsWebPage(xgi::Output *) const
double getValueAverage(DataSetType t=FULL) const
void addDOMforProcessedDQMEvents(XHTMLMaker &maker, XHTMLMaker::Node *parent, DQMEventMonitorCollection const &) const
void addSummaryRowForEventServer(stor::XHTMLMaker &, stor::XHTMLMaker::Node *table, DataRetrieverMonitorCollection::ConnectionStats::const_iterator) const
tuple out
Definition: dbtoconf.py:99
void addDOMforSMhost(stor::XHTMLMaker &, stor::XHTMLMaker::Node *tableRow, const std::string &sourceURL) const
SMPSWebPageHelper(xdaq::ApplicationDescriptor *, StateMachinePtr)
void addDOMforConnectionInfo(stor::XHTMLMaker &, stor::XHTMLMaker::Node *parent, const DataRetrieverMonitorCollection::SummaryStats &) const
boost::shared_ptr< StateMachine > StateMachinePtr
Definition: StateMachine.h:143
std::map< std::string, stor::MonitoredQuantity::Stats > ConnectionStats
#define Output(cl)
Definition: vmac.h:193
virtual void addDOMforHyperLinks(stor::XHTMLMaker &, stor::XHTMLMaker::Node *parent) const
void consumerStatistics(xgi::Output *, const std::string &externallyVisibleState, const std::string &innerStateName, const std::string &errorMsg, boost::shared_ptr< StatisticsReporter_t >, RegistrationCollectionPtr, boost::shared_ptr< EventQueueCollection_t >, DQMEventQueueCollectionPtr) const
std::vector< DQMEventConsRegPtr > DQMConsumerRegistrations
double durationToSeconds(Duration_t const &)
Definition: Utils.h:147
void addDOMforThroughputPerEventType(stor::XHTMLMaker &, stor::XHTMLMaker::Node *parent, const DataRetrieverMonitorCollection::SummaryStats &) const
xercesc::DOMElement Node
Definition: XHTMLMaker.h:35
tuple status
Definition: ntuplemaker.py:245
XHTMLMaker::Node * createWebPageBody(XHTMLMaker &, const std::string &pageTitle, const std::string &externallyVisibleState, const std::string &innerStateName, const std::string &errorMsg) const
void addDOMforEventServers(stor::XHTMLMaker &, stor::XHTMLMaker::Node *parent) const
void addRowForEventType(stor::XHTMLMaker &, stor::XHTMLMaker::Node *table, DataRetrieverMonitorCollection::SummaryStats::EventTypeStats const &) const
void consumerStatisticsWebPage(xgi::Output *) const