00001
00002
00003 #include "GaudiKernel/IAlgorithm.h"
00004 #include "GaudiKernel/IAlgTool.h"
00005 #include "GaudiKernel/Service.h"
00006 #include "GaudiKernel/SvcFactory.h"
00007 #include "GaudiKernel/MsgStream.h"
00008 #include "GaudiKernel/IIncidentSvc.h"
00009 #include "DataListenerSvc.h"
00010 #include "ValueMap.h"
00011 #include "XmlCode.h"
00012 #ifdef _WIN32
00013 #define NOMSG
00014 #define NOGDI
00015 #include <windows.h>
00016 #include <winsock.h>
00017 #include <process.h>
00018 #undef NOMSG
00019 #undef NOGDI
00020 #else
00021 #include <unistd.h>
00022 #include <exception>
00023 #endif
00024 #include <sys/types.h>
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 DECLARE_SERVICE_FACTORY(DataListenerSvc)
00041
00042 namespace {
00043
00044 int numIncidents = 0;
00045 int defaultMLFrequency = 100;
00046 int defaultjobID = 0;
00047 std::string defaultClusterName = "DataListenerSvc";
00048 std::string defaultApMonSettingsFile = "http://ganga.web.cern.ch/ganga/monalisa.conf";
00049 int defaultMonALISAMonitoring = 1;
00050 int defaultXMLMonitoring = 1;
00051 int defaultFileMonitoring = 1;
00052
00053
00054 int fileCounter = 0;
00055 int defaultFrequency = 100;
00056 }
00057
00058
00059 DataListenerSvc::DataListenerSvc(const std::string& name, ISvcLocator* sl)
00060 : base_class(name, sl) {
00061
00062 declareProperty ("EventFrequency", m_EventFrequency=defaultFrequency);
00063 declareProperty ("MLEventFrequency", m_MLEventFrequency=defaultMLFrequency);
00064 declareProperty ("MLjobID", m_MLjobID=defaultjobID);
00065 declareProperty ("MLClusterName", m_MLClusterName=defaultClusterName);
00066 declareProperty ("MonALISAMonitoring", m_MonALISAMonitoring=defaultMonALISAMonitoring);
00067 declareProperty ("ApMonSource", m_ApMonSettingsFile=defaultApMonSettingsFile);
00068
00069 declareProperty ("XMLMonitoring", m_XMLMonitoring=defaultXMLMonitoring);
00070 declareProperty ("FileMonitoring", m_FileMonitoring=defaultFileMonitoring);
00071
00072 }
00073
00074
00075 StatusCode DataListenerSvc::initialize()
00076 {
00077
00078 m_ApMonSettingsFile = defaultApMonSettingsFile;
00079 StatusCode sc = Service::initialize();
00080 MsgStream msg(msgSvc(),name());
00081
00082 jobIDString = "jobID: " + stringConverter(m_MLjobID);
00083
00084 if ( !sc.isSuccess() ) {
00085 msg << MSG::ERROR << "Failed to initialize Service base class." << endmsg;
00086 return StatusCode::FAILURE;
00087 }
00088
00089 sc = service("IncidentSvc", m_incidentSvc, true);
00090 if (!sc.isSuccess()) {
00091 msg << MSG::ERROR << "Failed to access incident service." << endmsg;
00092 return StatusCode::FAILURE;
00093 }
00094 m_incidentSvc->addListener(this, IncidentType::EndEvent);
00095
00096 if (m_MonALISAMonitoring){
00097
00098 apm = new ApMon(const_cast<char*>(m_ApMonSettingsFile.c_str()));
00099 }
00100
00101
00102 if (m_MLEventFrequency == defaultMLFrequency) {
00103 msg << MSG::DEBUG
00104 << "Frequency to send data to MonALISA not specified, taken as the default value: "
00105 << defaultMLFrequency << endmsg;
00106 } else {
00107 msg << MSG::INFO
00108 << "Data sent to MonALISA every "
00109 << m_MLEventFrequency << " events" << endmsg;
00110 }
00111
00112 if (m_MLjobID == defaultjobID){
00113 msg << MSG::DEBUG
00114 << "DataListenerSvc MonALISA Job ID not specified, taken as the default value: "
00115 << defaultjobID << endmsg;
00116 }
00117
00118 if (m_MLClusterName == defaultClusterName){
00119 msg << MSG::DEBUG
00120 << "DataListenerSvc MonALISA cluster name not specified, taken as the default value: "
00121 << defaultClusterName << endmsg;
00122 }
00123
00124 if (m_ApMonSettingsFile == defaultApMonSettingsFile){
00125 msg << MSG::DEBUG
00126 << "MonALISA ApMon configuration file destination not specified, will be read from: "
00127 << defaultClusterName << endmsg;
00128 }
00129
00130 if (m_EventFrequency == defaultFrequency){
00131 msg << MSG::INFO
00132 << "XML Log file frequency not specified, taken as the default value: "
00133 << defaultFrequency << endmsg;
00134 } else {
00135 msg << MSG::INFO
00136 << "Frequency XML logs are written at: "
00137 << m_EventFrequency << endmsg;
00138 }
00139
00140 if (m_MonALISAMonitoring) {
00141 msg << MSG::INFO
00142 << "Data will be published to a MonALISA server"
00143 << endmsg;
00144 }
00145
00146 if (m_XMLMonitoring) {
00147 msg << MSG::INFO
00148 << "Data will be written to XML log files"
00149 << endmsg;
00150 }
00151 if (m_FileMonitoring) {
00152 msg << MSG::INFO
00153 << "Data will be updated in a Text log file"
00154 << endmsg;
00155 }
00156
00157 return StatusCode::SUCCESS;
00158 }
00159
00160
00161 StatusCode DataListenerSvc::finalize()
00162 {
00163 MsgStream msg(msgSvc(),"DataListenerSvc");
00164
00165 m_infoDescriptions.clear();
00166 m_ValNamesMap.clear();
00167
00168 if (m_MonALISAMonitoring){
00169 if ( 0!= apm ) {
00170 delete apm;
00171 apm = 0 ;
00172 }
00173 }
00174
00175 msg << MSG::DEBUG << "ApMon deleted" << endmsg;
00176 msg << MSG::INFO << "finalized successfully" << endmsg;
00177
00178 if( m_incidentSvc ) m_incidentSvc->release();
00179
00180 return Service::finalize();
00181 }
00182
00183 void DataListenerSvc::declareInfo(const std::string& name, const double& var,
00184 const std::string& ,
00185 const IInterface* )
00186 {
00187 ValueMap::m_type vartype;
00188 vartype = ValueMap::m_double;
00189
00190 MsgStream msg(msgSvc(),"DataListenerSvc");
00191
00192
00193
00194 m_ValueMap.set_ptr( static_cast <void*> (const_cast <double*> (&var) ) );
00195 m_ValueMap.set_ptrType(vartype);
00196
00197 Entry p1(name, m_ValueMap);
00198
00199
00200 m_ValNamesMap.insert(p1);
00201
00202 }
00203
00204 void DataListenerSvc::declareInfo(const std::string& name, const long& var,
00205 const std::string& ,
00206 const IInterface* )
00207 {
00208
00209 ValueMap::m_type vartype;
00210 vartype = ValueMap::m_long;
00211
00212 MsgStream msg(msgSvc(),"DataListenerSvc");
00213
00214 m_ValueMap.set_ptr( static_cast <void*> (const_cast <long*> (&var) ) );
00215 m_ValueMap.set_ptrType(vartype);
00216
00217 Entry p1(name, m_ValueMap);
00218
00219 m_ValNamesMap.insert(p1);
00220
00221 }
00222
00223 void DataListenerSvc::declareInfo(const std::string& name, const int& var,
00224 const std::string& ,
00225 const IInterface* )
00226 {
00227 ValueMap::m_type vartype;
00228 vartype = ValueMap::m_int;
00229
00230 MsgStream msg(msgSvc(),"DataListenerSvc");
00231
00232 m_ValueMap.set_ptr( static_cast <void*> (const_cast <int*> (&var) ) );
00233 m_ValueMap.set_ptrType(vartype);
00234
00235 Entry p1(name, m_ValueMap);
00236
00237 m_ValNamesMap.insert(p1);
00238
00239 }
00240
00241 void DataListenerSvc::declareInfo(const std::string& name, const bool& var,
00242 const std::string& ,
00243 const IInterface* )
00244 {
00245
00246 ValueMap::m_type vartype;
00247 vartype = ValueMap::m_bool;
00248
00249 MsgStream msg(msgSvc(),"DataListenerSvc");
00250
00251 m_ValueMap.set_ptr( static_cast <void*> (const_cast <bool*> (&var) ) );
00252 m_ValueMap.set_ptrType(vartype);
00253
00254 Entry p1(name, m_ValueMap);
00255
00256 m_ValNamesMap.insert(p1);
00257
00258 }
00259
00260 void DataListenerSvc::declareInfo(const std::string& name,
00261 const std::string& var,
00262 const std::string& ,
00263 const IInterface* )
00264 {
00265 ValueMap::m_type vartype;
00266 vartype = ValueMap::m_string;
00267
00268 MsgStream msg(msgSvc(),"DataListenerSvc");
00269
00270 m_ValueMap.set_ptr( static_cast <void*> (const_cast <std::string*> (&var) ) ); m_ValueMap.set_ptrType(vartype);
00271
00272 Entry p1(name, m_ValueMap);
00273
00274 m_ValNamesMap.insert(p1);
00275
00276 }
00277
00278 void DataListenerSvc::declareInfo(const std::string& ,
00279 const std::pair<double,double>& ,
00280 const std::string& ,
00281 const IInterface* )
00282 {
00283 }
00284
00285 void DataListenerSvc::declareInfo(const std::string& ,
00286 const StatEntity& ,
00287 const std::string& ,
00288 const IInterface* )
00289 {
00290 }
00291
00292 void DataListenerSvc::declareInfo(const std::string& ,
00293 const AIDA::IBaseHistogram* ,
00294 const std::string& ,
00295 const IInterface* )
00296 {
00297 }
00298
00299 void DataListenerSvc::declareInfo(const std::string& ,
00300 const std::string& ,
00301 const void* ,
00302 int ,
00303 const std::string& ,
00304 const IInterface* )
00305 {
00306 }
00307
00308 void DataListenerSvc::undeclareInfo( const std::string& ,
00309 const IInterface* )
00310 {
00311 }
00312
00313 void DataListenerSvc::undeclareAll( const IInterface* )
00314 {
00315 }
00316
00317 std::set<std::string> * DataListenerSvc::getInfos(const IInterface* )
00318 {
00319 std::set<std::string> * returnData = NULL;
00320 return returnData;
00321 }
00322
00323 std::string DataListenerSvc::infoOwnerName( const IInterface* )
00324 {
00325 std::string returnData = "";
00326 return returnData;
00327 }
00328
00329 void DataListenerSvc::handle (const Incident& Inc)
00330 {
00331
00332 MsgStream msg(msgSvc(),"DataListenerSvc");
00333 numIncidents++;
00334
00335
00336 if (numIncidents % m_EventFrequency == 0){
00337
00338 try {
00339 Log4.open("MonitorLog.txt", std::ios::trunc);
00340 XMLLog.open(("./log" + stringConverter(fileCounter) + ".xml").c_str() , std::ios::trunc);
00341 } catch(std::exception ) {
00342 msg << MSG::INFO
00343 << "Log File could not be opened, no monitoring available"
00344 << endmsg;
00345 }
00346
00347 if (m_MonALISAMonitoring){
00348
00349 sendData(&m_ValNamesMap);
00350 }
00351
00352 if (m_FileMonitoring){
00353
00354 writeMap(&m_ValNamesMap, Inc, &Log4 );
00355 Log4.close();
00356 }
00357
00358 if (m_XMLMonitoring){
00359
00360 writeXML(&m_ValNamesMap, Inc, &XMLLog );
00361 XMLLog.close();
00362 }
00363
00364 fileCounter++;
00365 }
00366
00367 }
00368
00369
00370 std::string DataListenerSvc::resizeString ( const std::string text,
00371 const unsigned int length)
00372 {
00373 std::string temp;
00374 unsigned int counter=0;
00375
00376 do {
00377
00378 if (text.length() > length) {
00379 temp = text.substr(0,(length-1));
00380 } else {
00381 if (counter==0) {
00382 temp = text;
00383 counter++;
00384 }
00385 temp.append(" ");
00386 }
00387
00388 } while (temp.length() != length);
00389
00390 return temp;
00391 }
00392
00393
00394 std::string DataListenerSvc::stringConverter (const int convertee)
00395 {
00396 std::stringstream s;
00397 std::string temp;
00398 s << convertee;
00399 s >> temp;
00400 s.flush();
00401 return temp;
00402 }
00403
00404 std::string DataListenerSvc::stringConverter (const double convertee)
00405 {
00406 std::stringstream s;
00407 std::string temp;
00408 s << convertee;
00409 s >> temp;
00410 s.flush();
00411 return temp;
00412 }
00413
00414 std::string DataListenerSvc::stringConverter (const long convertee)
00415 {
00416 std::stringstream s;
00417 std::string temp;
00418 s << convertee;
00419 s >> temp;
00420 s.flush();
00421 return temp;
00422 }
00423
00424 std::string DataListenerSvc::stringConverter (const bool convertee)
00425 {
00426 std::stringstream s;
00427 std::string temp;
00428 s << convertee;
00429 s >> temp;
00430 s.flush();
00431 return temp;
00432 }
00433
00434
00435 void DataListenerSvc::writeXML(ValNamesMap* m_ValNamesMap,
00436 const Incident& Inc,
00437 std::ofstream* MyFile)
00438 {
00439
00440 MsgStream msg(msgSvc(),"DataListenerSvc");
00441
00442
00443 time ( &rawTime );
00444 sprintf (buffer, "%s", ctime(&rawTime));
00445 timeDate = buffer;
00446 timeDate.erase(timeDate.size()-1, 1);
00447
00448
00449 msg << MSG::INFO << "XML written to file: " << MyFile << endmsg;
00450
00451
00452 *MyFile << xml.declaration("1.0", "ASCII", "yes") << std::endl;
00453
00454 *MyFile << xml.tagBegin("Results", 0, "Time", timeDate)
00455 << xml.tagBegin("Run",1);
00456
00457
00458 for (m_ValNamesMapIt = m_ValNamesMap->begin();
00459 m_ValNamesMapIt != m_ValNamesMap->end();
00460 ++m_ValNamesMapIt) {
00461
00462 m_ValueMapTemp = m_ValNamesMapIt->second;
00463
00464 *MyFile << xml.tagBegin("Incident",2);
00465
00466 *MyFile << xml.tagBegin("IncType", 3)
00467 << xml.data(resizeString(Inc.type(),18))
00468 << xml.tagEnd("IncType", 0);
00469
00470 *MyFile << xml.tagBegin("IncSource", 3)
00471 << xml.data(resizeString(Inc.source(),18))
00472 << xml.tagEnd("IncSource", 0);
00473
00474 *MyFile << xml.tagBegin("VarName", 3)
00475 << xml.data(resizeString(m_ValNamesMapIt->first,20))
00476 << xml.tagEnd("VarName", 0);
00477
00478 *MyFile << xml.tagBegin("Value", 3, "Result", stringConverter(numIncidents));
00479
00480
00481
00482
00483
00484
00485 if (m_ValueMapTemp.get_ptrType() == ValueMap::m_double){
00486 valToWrite = stringConverter(*(double*)m_ValueMapTemp.get_ptr());
00487 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_int){
00488 valToWrite = stringConverter(*(int*)m_ValueMapTemp.get_ptr());
00489 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_long){
00490 valToWrite = stringConverter(*(long*)m_ValueMapTemp.get_ptr());
00491 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_bool){
00492 valToWrite = stringConverter(*(bool*)m_ValueMapTemp.get_ptr());
00493 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_string){
00494 valToWrite = *(std::string*)m_ValueMapTemp.get_ptr();
00495 }
00496
00497
00498 *MyFile << xml.data(valToWrite);
00499 msg << MSG::DEBUG << "XML written: " << m_ValNamesMapIt->first << " , "
00500 << valToWrite << endmsg;
00501
00502 *MyFile << xml.tagEnd("Value", 0);
00503 *MyFile << xml.tagEnd("Incident",2);
00504 }
00505
00506
00507 *MyFile << xml.tagEnd("Run",1)
00508 << xml.tagEnd("Results", 0);
00509
00510 }
00511
00512
00513
00514 void DataListenerSvc::writeMap (ValNamesMap* m_ValNamesMap,
00515 const Incident& Inc, std::ofstream* MyFile)
00516 {
00517
00518 time ( &rawTime2 );
00519 sprintf (buffer2, "%s", ctime(&rawTime2));
00520 timeDate2 = buffer2;
00521 timeDate2.erase(timeDate2.size()-1, 1);
00522
00523
00524 std::string space = " ";
00525 std::string heading0 = "Time ";
00526 std::string heading1 = "No ";
00527 std::string heading2 = "Incident Type ";
00528 std::string heading3 = "Incident Source ";
00529 std::string heading4 = "Name ";
00530 std::string heading5 = "Value ";
00531
00532 *MyFile << heading0 + heading1 + heading2 + heading3 + heading4 + heading5
00533 << std::endl;
00534
00535 for (m_ValNamesMapIt = m_ValNamesMap->begin();
00536 m_ValNamesMapIt != m_ValNamesMap->end();
00537 ++m_ValNamesMapIt){
00538
00539 m_ValueMapTemp = m_ValNamesMapIt->second;
00540
00541 *MyFile << timeDate2 << space
00542
00543 << resizeString(stringConverter(numIncidents),8)
00544 << resizeString(Inc.type(),18)
00545 << resizeString(Inc.source(),18)
00546 << resizeString(m_ValNamesMapIt->first,20);
00547
00548
00549 if (m_ValueMapTemp.get_ptrType() == ValueMap::m_double){
00550 *MyFile << resizeString(stringConverter(*(double*)m_ValueMapTemp.get_ptr()), 12)
00551 << std::endl;
00552 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_int){
00553 *MyFile << resizeString(stringConverter(*(int*)m_ValueMapTemp.get_ptr()), 12)
00554 << std::endl;
00555 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_long){
00556 *MyFile << resizeString(stringConverter(*(long*)m_ValueMapTemp.get_ptr()), 12)
00557 << std::endl;
00558 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_bool){
00559 *MyFile << resizeString(stringConverter(*(bool*)m_ValueMapTemp.get_ptr()), 12)
00560 << std::endl;
00561 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_string){
00562 *MyFile << resizeString((*(std::string*)m_ValueMapTemp.get_ptr()), 12)
00563 << std::endl;
00564 }
00565
00566 }
00567
00568 }
00569
00570
00571 void DataListenerSvc::sendData(ValNamesMap* m_ValNamesMap)
00572 {
00573
00574 for (m_ValNamesMapIt = m_ValNamesMap->begin();
00575 m_ValNamesMapIt != m_ValNamesMap->end();
00576 ++m_ValNamesMapIt){
00577
00578 m_ValueMapTemp = m_ValNamesMapIt->second;
00579 keyToSend = const_cast<char*>((m_ValNamesMapIt->first).c_str());
00580
00581
00582 if (m_ValueMapTemp.get_ptrType() == ValueMap::m_double){
00583 apmSend(const_cast <char*>(m_MLClusterName.c_str()),
00584 const_cast <char*> (jobIDString.c_str()),
00585 keyToSend, *(double*)m_ValueMapTemp.get_ptr());
00586 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_int){
00587 apmSend(const_cast <char*>(m_MLClusterName.c_str()),
00588 const_cast <char*> (jobIDString.c_str()),
00589 keyToSend, *(int*)m_ValueMapTemp.get_ptr());
00590 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_long){
00591 apmSend(const_cast <char*>(m_MLClusterName.c_str()),
00592 const_cast <char*> (jobIDString.c_str()),
00593 keyToSend, *(long*)m_ValueMapTemp.get_ptr());
00594 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_bool){
00595 apmSend(const_cast <char*>(m_MLClusterName.c_str()),
00596 const_cast <char*> (jobIDString.c_str()),
00597 keyToSend, *(bool*)m_ValueMapTemp.get_ptr());
00598 } else if (m_ValueMapTemp.get_ptrType() == ValueMap::m_string){
00599 apmSend(const_cast <char*>(m_MLClusterName.c_str()),
00600 const_cast <char*> (jobIDString.c_str()),
00601 keyToSend, const_cast <char*>((*(std::string*)m_ValueMapTemp.get_ptr()).c_str()));
00602 }
00603 }
00604
00605 }
00606
00607
00608 void DataListenerSvc::apmSend(char* clusterName, char* clusterNode,
00609 char* key, double val)
00610 {
00611 MsgStream msg(msgSvc(),"DataListenerSvc");
00612 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00613
00614 try {
00615 DataListenerSvc::apm->sendParameter( clusterName, clusterNode, key, val);
00616 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00617 msg << MSG::INFO << "Sent parameters to MonALISA sever:"
00618 << m_MLClusterName << "->"
00619 << jobIDString.c_str() << "->"
00620 << key << ":" << val << endmsg;
00621 } catch(std::runtime_error &e) {
00622 msg << MSG::WARNING << "WARNING sending to ApMon:\t" << e.what() << endmsg;
00623 }
00624 }
00625
00626 void DataListenerSvc::apmSend(char* clusterName, char* clusterNode,
00627 char* key, int val)
00628 {
00629 MsgStream msg(msgSvc(),"DataListenerSvc");
00630 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00631 try {
00632 DataListenerSvc::apm->sendParameter( clusterName, clusterNode, key, val);
00633 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00634 msg << MSG::INFO << "Sent parameters to MonALISA sever:"
00635 << m_MLClusterName << "->"
00636 << jobIDString.c_str() << "->"
00637 << key << ":" << val << endmsg;
00638 } catch(std::runtime_error &e) {
00639 msg << MSG::WARNING << "WARNING sending to ApMon:\t" << e.what() << endmsg;
00640 }
00641 }
00642
00643 void DataListenerSvc::apmSend(char* clusterName, char* clusterNode,
00644 char* key, long val)
00645 {
00646 MsgStream msg(msgSvc(),"DataListenerSvc");
00647 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00648 double temp;
00649 temp = *(double*)val;
00650
00651 try {
00652 DataListenerSvc::apm->sendParameter( clusterName, clusterNode, key, temp);
00653 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00654 msg << MSG::INFO << "Sent parameters to MonALISA sever:"
00655 << m_MLClusterName << "->"
00656 << jobIDString.c_str() << "->"
00657 << key << ":" << val << endmsg;
00658 } catch (std::runtime_error &e){
00659 msg << MSG::WARNING << "WARNING sending to ApMon:\t" << e.what() << endmsg;
00660 }
00661 }
00662
00663 void DataListenerSvc::apmSend(char* clusterName, char* clusterNode,
00664 char* key, bool val)
00665 {
00666 MsgStream msg(msgSvc(),"DataListenerSvc");
00667 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00668 try {
00669 DataListenerSvc::apm->sendParameter( clusterName, clusterNode, key, val);
00670 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00671 msg << MSG::INFO << "Sent parameters to MonALISA sever:"
00672 << m_MLClusterName << "->"
00673 << jobIDString.c_str() << "->"
00674 << key << ":" << val << endmsg;
00675 } catch (std::runtime_error &e){
00676 msg << MSG::WARNING << "WARNING sending to ApMon:\t" << e.what() << endmsg;
00677 }
00678 }
00679
00680 void DataListenerSvc::apmSend(char* clusterName, char* clusterNode,
00681 char* key, char* val)
00682 {
00683 MsgStream msg(msgSvc(),"DataListenerSvc");
00684 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00685 try {
00686 DataListenerSvc::apm->sendParameter( clusterName, clusterNode, key, val);
00687 msg << MSG::DEBUG << "ApMon instantiated" << endmsg;
00688 msg << MSG::INFO << "Sent parameters to MonALISA sever:"
00689 << m_MLClusterName << "->"
00690 << jobIDString.c_str() << "->"
00691 << key << ":" << val << endmsg;
00692 } catch (std::runtime_error &e){
00693 msg << MSG::WARNING << "WARNING sending to ApMon:\t" << e.what() << endmsg;
00694 }
00695 }