8 #include "EventFilter/StorageManager/src/ConsumerWebPageHelper.icc"
10 #include <boost/pointer_cast.hpp>
17 xdaq::ApplicationDescriptor* appDesc,
21 stateMachine_(stateMachine),
40 getDataRetrieverMonitorCollection().getSummaryStats(summaryStats);
100 "DQM Event Processor",
107 stateMachine_->getStatisticsReporter()->getDQMEventMonitorCollection();
124 std::string url = appDescriptor_->getContextDescriptor()->getURL()
125 +
"/" + appDescriptor_->getURN();
132 linkAttr[
"href" ] = url;
133 link = maker.
addNode(
"a", parent, linkAttr);
134 maker.
addText(link,
"Main web page");
138 linkAttr[
"href" ] = url +
"/dataRetriever";
139 link = maker.
addNode(
"a", parent, linkAttr);
140 maker.
addText(link,
"Data retriever web page");
144 linkAttr[
"href" ] = url +
"/dqmEventStatistics";
145 link = maker.
addNode(
"a", parent, linkAttr);
146 maker.
addText(link,
"DQM event processor statistics");
150 linkAttr[
"href" ] = url +
"/consumerStatistics";
151 link = maker.
addNode(
"a", parent, linkAttr);
152 maker.
addText(link,
"Consumer Statistics");
166 colspanAttr[
"colspan" ] =
"2";
169 tableAttr[
"width" ] =
"50%";
172 widthAttr[
"width" ] =
"70%";
178 maker.
addText(tableDiv,
"Connection Information");
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);
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_);
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_);
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());
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());
233 colspanAttr[
"colspan" ] =
"11";
238 rowspanAttr[
"rowspan" ] =
"3";
239 rowspanAttr[
"width" ] =
"30%";
242 noWrapAttr[
"style" ] =
"white-space: nowrap;";
247 maker.
addText(tableDiv,
"Throughput");
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);
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");
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)");
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");
299 messageAttr[
"align" ] =
"center";
303 maker.
addText(tableDiv,
"No data flowing, yet.");
307 bool evenRow =
false;
309 for (DataRetrieverMonitorCollection::SummaryStats::EventTypeStatList::const_iterator
316 rowAttr[
"style" ] =
"background-color:#e0e0e0;";
324 addRowForEventType(maker, tableRow, *it);
327 addSummaryRowForThroughput(maker, table, summaryStats);
341 std::ostringstream eventType;
342 stats.first->eventType(eventType);
343 maker.
addText(pre, eventType.str());
346 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
348 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
352 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
354 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
358 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
360 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
365 bool isEventConsumer =
366 stateMachine_->getDataManager()->getQueueIDsFromDataEventRetrievers(
367 boost::dynamic_pointer_cast<stor::EventConsumerRegistrationInfo>(stats.first),
370 if ( ! isEventConsumer)
372 stateMachine_->getDataManager()->getQueueIDsFromDQMEventRetrievers(
373 boost::dynamic_pointer_cast<stor::DQMEventConsumerRegistrationInfo>(stats.first),
378 if ( queueIDs.empty() )
381 noConsumersAttr[
"colspan" ] =
"4";
382 tableDiv = maker.
addNode(
"td", tableRow, noConsumersAttr);
383 maker.
addText(tableDiv,
"no consumers connected");
388 stateMachine_->getStatisticsReporter()->getEventConsumerMonitorCollection();
390 stateMachine_->getStatisticsReporter()->getDQMConsumerMonitorCollection();
394 static_cast<const stor::ConsumerMonitorCollection&>(dcmc);
396 double rateOverall = 0;
397 double rateRecent = 0;
398 double bandwidthOverall = 0;
399 double bandwidthRecent = 0;
401 for ( stor::QueueIDs::const_iterator it = queueIDs.begin(),
402 itEnd = queueIDs.end(); it != itEnd; ++it)
414 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
416 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
418 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
419 maker.
addDouble(tableDiv, bandwidthOverall);
420 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
421 maker.
addDouble(tableDiv, bandwidthRecent);
434 maker.
addText(tableDiv,
"Total");
437 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
439 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
443 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
445 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
449 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
451 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
455 stateMachine_->getStatisticsReporter()->getEventConsumerMonitorCollection();
457 stateMachine_->getStatisticsReporter()->getDQMConsumerMonitorCollection();
463 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
468 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
475 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
480 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
495 colspanAttr[
"colspan" ] =
"10";
501 maker.
addText(tableDiv,
"Event Servers");
504 rowspanAttr[
"rowspan" ] =
"2";
507 subColspanAttr[
"colspan" ] =
"2";
510 noWrapAttr[
"style" ] =
"white-space: nowrap;";
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)");
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");
544 stateMachine_->getStatisticsReporter()->getDataRetrieverMonitorCollection()
545 .getStatsByEventTypes(eventTypeStats);
548 stateMachine_->getStatisticsReporter()->getDataRetrieverMonitorCollection()
549 .getStatsByConnection(connectionStats);
551 if ( eventTypeStats.empty() )
554 messageAttr[
"align" ] =
"center";
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");
562 bool evenRow =
false;
564 for (DataRetrieverMonitorCollection::EventTypeStatList::const_iterator
565 it = eventTypeStats.begin(), itEnd = eventTypeStats.end();
571 rowAttr[
"style" ] =
"background-color:#e0e0e0;";
579 addRowForEventServer(maker, tableRow, *it);
581 const std::string currentSourceURL = it->regPtr->sourceURL();
583 if ( (it+1) == eventTypeStats.end() ||
584 (it+1)->regPtr->sourceURL() != currentSourceURL )
586 addSummaryRowForEventServer(maker, table,
587 connectionStats.find(currentSourceURL));
603 addDOMforSMhost(maker, tableRow, stats.
regPtr->sourceURL());
608 tableDiv = maker.
addNode(
"td", tableRow, tableLabelAttr_);
609 maker.
addText(tableDiv,
"Connected");
614 statusAttr[
"style" ] =
"color:brown;";
615 tableDiv = maker.
addNode(
"td", tableRow, statusAttr);
616 std::ostringstream
status;
618 maker.
addText(tableDiv, status.str());
622 tableDiv = maker.
addNode(
"td", tableRow, tableLabelAttr_);
624 std::ostringstream eventType;
625 stats.
regPtr->eventType(eventType);
626 maker.
addText(pre, eventType.str());
629 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
631 stats.
regPtr->minEventRequestInterval();
632 if ( interval.is_not_a_date_time() )
633 maker.
addText(tableDiv,
"unlimited");
638 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
640 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
644 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
646 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
650 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
652 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
661 DataRetrieverMonitorCollection::ConnectionStats::const_iterator
pos
667 addDOMforSMhost(maker, tableRow, pos->first);
671 tableDiv = maker.
addNode(
"td", tableRow);
672 tableDiv = maker.
addNode(
"td", tableRow);
675 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
677 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
681 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
683 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
687 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
689 tableDiv = maker.
addNode(
"td", tableRow, tableValueAttr_);
703 if ( startPos == std::string::npos )
708 const std::string hostname = sourceURL.substr(startPos,(endPos-startPos));
710 linkAttr[
"href" ] = sourceURL +
"/consumerStatistics";
double getValueRate(DataSetType t=FULL) const
Node * addNode(const std::string &name, Node *parent, const AttrMap &attrs)
void addDOMforDQMEventStatistics(XHTMLMaker &maker, XHTMLMaker::Node *parent, DQMEventMonitorCollection const &) const
std::vector< EventTypeStats > EventTypeStatList
void addDouble(Node *parent, const double &value, const unsigned int &precision=2)
std::vector< EventConsRegPtr > ConsumerRegistrations
bool getServed(const QueueID &qid, MonitoredQuantity::Stats &result) const
void addText(Node *parent, const std::string &)
void addSummaryRowForThroughput(stor::XHTMLMaker &, stor::XHTMLMaker::Node *table, DataRetrieverMonitorCollection::SummaryStats const &) const
stor::MonitoredQuantity::Stats sizeStats
void addRowForEventServer(stor::XHTMLMaker &, stor::XHTMLMaker::Node *table, DataRetrieverMonitorCollection::EventTypeStats const &) const
std::vector< QueueID > QueueIDs
void defaultWebPage(xgi::Output *) const
std::pair< stor::RegPtr, stor::MonitoredQuantity::Stats > EventTypeStats
MonitoredQuantity::Stats servedStats
void dataRetrieverWebPage(xgi::Output *) const
std::string link(std::string &nm, std::string &ns)
ConnectionStatus connectionStatus
boost::posix_time::time_duration Duration_t
stor::MonitoredQuantity::Stats sizeStats
void addDOMforDQMEventServers(stor::XHTMLMaker &, stor::XHTMLMaker::Node *parent) const
edm::serviceregistry::AllArgsMaker< DTDataMonitorInterface, DTDataIntegrityTask > maker
std::map< std::string, std::string > AttrMap
ConsumerWebPageHelper_t consumerWebPageHelper_
void addInt(Node *parent, const int &)
void getTotalStats(TotalStats &) const
double getSampleRate(DataSetType t=FULL) const
void dqmEventStatisticsWebPage(xgi::Output *) const
StateMachinePtr stateMachine_
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
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
EventTypeStatList eventTypeStats
boost::shared_ptr< StateMachine > StateMachinePtr
std::map< std::string, stor::MonitoredQuantity::Stats > ConnectionStats
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 &)
void addDOMforThroughputPerEventType(stor::XHTMLMaker &, stor::XHTMLMaker::Node *parent, const DataRetrieverMonitorCollection::SummaryStats &) const
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