]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Send execution traces to a server. omu/stuc
authorOvidiu Mircescu <ovidiu.mircescu@edf.fr>
Mon, 4 Aug 2014 12:57:11 +0000 (14:57 +0200)
committerOvidiu Mircescu <ovidiu.mircescu@edf.fr>
Mon, 4 Aug 2014 12:57:11 +0000 (14:57 +0200)
bin/CMakeLists.txt
bin/runSalome.py
bin/sendTraces.py [new file with mode: 0755]
src/Container/Container_i.cxx
src/SALOMELocalTrace/CMakeLists.txt
src/SALOMELocalTrace/StucTrace.cxx [new file with mode: 0644]
src/SALOMELocalTrace/StucTrace.hxx [new file with mode: 0644]

index 455fc61e15aaa94f3e6589de0b9f6f60d576cb2d..30d577485580f553f945dcd954ad50887305f829 100755 (executable)
@@ -54,6 +54,7 @@ SET(SCRIPTS
   salome_session.py
   salome_utils.py
   searchFreePort.py
+  sendTraces.py
   server.py
   setenv.py
   showNS.py
index c819b857c8513c044d2a650d8e4e63e69cbf26d6..fd3cacb5b42ee13f6a249748d98a86c02ba42a2d 100755 (executable)
@@ -33,6 +33,7 @@ from launchConfigureParser import verbose
 from server import process_id, Server
 import json
 import subprocess
+import sendTraces
 
 # -----------------------------------------------------------------------------
 
@@ -236,6 +237,7 @@ class LoggerServer(Server):
         print logfile
         print "==========================================================="
         self.CMD=['SALOME_Logger_Server', logfile]
+        self.logfile = logfile
         pass
     pass # end of LoggerServer class
 
@@ -480,9 +482,11 @@ def startSalome(args, modules_list, modules_root_dir):
     # and wait until it is registered in naming service
     #
 
+    sendTraces.logfile=None
     if args['logger']:
         myServer=LoggerServer(args)
         myServer.run()
+        sendTraces.logfile=myServer.logfile
         clt.waitLogger("Logger")
 
     # set siman python path before the session server launching to import scripts inside python console
@@ -888,6 +892,12 @@ def foreGround(clt, args):
         from killSalomeWithPort import killMyPort
         killMyPort(port)
         pass
+    if not sendTraces.logfile is None:
+      try:
+        sendTraces.sendSalome(sendTraces.logfile)
+      except Exception as err:
+        print "sendTraces failed:"
+        print err
     return
 #
 
diff --git a/bin/sendTraces.py b/bin/sendTraces.py
new file mode 100755 (executable)
index 0000000..16604d4
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+"""
+   This module is used to send execution traces to a server.
+"""
+
+import sys
+import os
+import json
+import urllib2
+import urllib
+
+class TracesSender(object):
+  """
+     Collect and send STUC traces to a server.
+  """
+  
+  def loadLogFile(self, filePath):
+    """
+       Load STUC traces from a log file.
+       
+       STUC traces have this format:
+       [STUC TRACE]{ "label":"name","begin":"2014-07-24 14:18:45","end":"2014-07-24 14:18:47"}
+       
+       Lines which don't containt the flag "[STUC TRACE]" are ignored.
+       Between [STUC TRACE] and the end of the line, there should be 
+       the trace data in json format.
+    """
+    self.traces = []
+    logFile = open(filePath)
+    flag = '[STUC TRACE]'
+    for line in logFile:
+      x, y, p = line.partition(flag)
+      if p != '':
+        trace = json.loads(p)
+        self.traces.append(trace)
+      pass
+    logFile.close()
+    pass
+  
+  def setInfo(self, appName, appVersion, installPath):
+    """
+       Informations to join to the traces.
+       
+       :param appName: name of the current application
+       :param appVersion: version of the current application
+       :param installPath: installation path of the current application
+    """
+    self.appName = appName
+    self.appVersion = appVersion
+    self.installPath = installPath
+    pass
+  
+  def send(self, serverUrl):
+    """
+       Send STUC traces to a server.
+       
+       :param serverUrl: complet url where the traces should be sent
+    """
+    session = {'appName'    : self.appName,
+               'appVersion' : self.appVersion,
+               'installPath': self.installPath,
+               'traces'     : json.dumps(self.traces)}
+    dataToSend = urllib.urlencode(session)
+#    headers = {"Content-type": "application/x-www-form-urlencoded",
+#               "Accept": "text/plain"}
+#    req = urllib2.Request(serverUrl, dataToSend,headers )
+    req = urllib2.Request(serverUrl, dataToSend)
+    response = urllib2.urlopen(req)
+    return response
+  
+  pass
+
+def sendSalome(logfilepath):
+  """
+     TracesSender usecase for SALOME
+  """
+  ts = TracesSender()
+  salome_path = os.getenv("ROOT_SALOME")
+  kernel_path = os.getenv('KERNEL_ROOT_DIR', '' )
+  version_path = os.path.join(kernel_path, "bin", "salome", "VERSION")
+  version_file = open(version_path)
+  version = "unknown"
+  for line in version_file:
+    x, y, p = line.partition("[SALOME KERNEL] :")
+    if p != '':
+      version = p
+      break
+      pass
+    pass
+  
+  ts.setInfo("SALOME", version, salome_path)
+  ts.loadLogFile(logfilepath)
+  ts.send("http://localhost:8000/cgi-bin/traces.py")
+
+### MAIN ##
+if __name__ == "__main__":
+  try:
+    serverUrl = sys.argv[1]
+    appName = sys.argv[2]
+    appVersion = sys.argv[3]
+    installPath = sys.argv[4]
+    logFile = sys.argv[5]
+  except:
+    print "usage:"
+    print "  sendTraces.py <serverUrl> <appName> <appVersion> <installPath> <logFile>"
+    exit()
+    pass
+  
+  ts = TracesSender()
+  ts.setInfo(appName, appVersion, installPath)
+  ts.loadLogFile(logFile)
+  ts.send(serverUrl)
index a8a5f01473bc53a12d5d23a4128f023fd5342a3a..d110b5c74348491cc67670d6c74333d52a89db15 100644 (file)
@@ -44,6 +44,7 @@ int SIGUSR1 = 1000;
 #endif
 
 #include "utilities.h"
+#include "StucTrace.hxx"
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOME_Component)
 #include CORBA_SERVER_HEADER(SALOME_Exception)
@@ -396,7 +397,7 @@ void Engines_Container_i::Shutdown()
 bool
 Engines_Container_i::load_component_Library(const char* componentName, CORBA::String_out reason)
 {
-
+  STUC_TRACE("load_component_Library: " << componentName)
   //=================================================================
   // --- C++ implementation section 
   //=================================================================
index 1be50d8f5aa378d9d325c444163a5ce48689c98b..0e4cb5928c0be4e44cbc0c3d9aa9c5db751866cf 100755 (executable)
@@ -28,6 +28,7 @@ SET(COMMON_HEADERS
   LocalTraceBufferPool.hxx
   BaseTraceCollector.hxx
   SALOME_LocalTrace.hxx
+  StucTrace.hxx
 )
 
 SET(SALOMELocalTrace_SOURCES
@@ -40,6 +41,8 @@ SET(SALOMELocalTrace_SOURCES
   LocalTraceBufferPool.cxx
   LocalTraceBufferPool.hxx
   SALOME_LocalTrace.hxx
+  StucTrace.hxx
+  StucTrace.cxx
 )
 
 ADD_LIBRARY(SALOMELocalTrace ${SALOMELocalTrace_SOURCES})
diff --git a/src/SALOMELocalTrace/StucTrace.cxx b/src/SALOMELocalTrace/StucTrace.cxx
new file mode 100644 (file)
index 0000000..872247f
--- /dev/null
@@ -0,0 +1,51 @@
+#include "StucTrace.hxx"
+#include <ctime>
+#include <iostream>
+
+#include "LocalTraceBufferPool.hxx"
+
+StucTrace::StucTrace(const std::string& label)
+: _label(label),
+  _beginTime(),
+  _endTime(),
+  _trace()
+{
+  begin();
+}
+
+StucTrace::~StucTrace()
+{
+}
+
+void StucTrace::begin()
+{
+  time_t now = time(0);
+  struct tm tstruct = *localtime(&now);
+  strftime(_beginTime, sizeof(_beginTime), "%Y-%m-%d %X", &tstruct);
+}
+
+void StucTrace::end()
+{
+  time_t now = time(0);
+  struct tm tstruct = *localtime(&now);
+  strftime(_endTime, sizeof(_endTime), "%Y-%m-%d %X", &tstruct);
+  
+  print();
+}
+
+const std::string& StucTrace::getTrace()const
+{
+  _trace = "[STUC TRACE]{\"label\":\"";
+  _trace += _label + "\",\"begin\":\"";
+  _trace += _beginTime;
+  _trace += "\",\"end\":\"";
+  _trace += _endTime;
+  _trace += "\"}";
+  
+  return _trace;
+}
+
+void StucTrace::print()const
+{
+  LocalTraceBufferPool::instance()->insert(NORMAL_MESS,(getTrace()+"\n").c_str());
+}
diff --git a/src/SALOMELocalTrace/StucTrace.hxx b/src/SALOMELocalTrace/StucTrace.hxx
new file mode 100644 (file)
index 0000000..57199f5
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef __STUC__TRACE__HXX__
+#define __STUC__TRACE__HXX__
+
+#include <string>
+
+/*!
+ * Print a timestamped and labeled trace.
+ * These traces will be recognised by sendTraces.py.
+ */
+class StucTrace
+{
+  public:
+    /*!
+    *  Save the label and the begin time.
+    *  The begin time can be changed later by begin().
+    */
+    StucTrace(const std::string& label);
+    
+    virtual ~StucTrace();
+    
+    /*!
+    *  Reset the begin time
+    */
+    void begin();
+    
+    /*!
+    *  Save the end time and print the trace
+    */
+    void end();
+    
+    /*!
+    *  Get the formated trace.
+    */
+    const std::string& getTrace()const;
+    
+    /*!
+    *  Overload this method in your derived class in order to define where
+    *  the trace should be written.
+    */
+    virtual void print()const;
+    
+  private:
+    std::string _label;
+    char _beginTime[64];
+    char _endTime[64];
+    mutable std::string _trace;
+};
+
+#define STUC_TRACE(label) std::ostringstream os; os << label; StucTrace t(os.str().c_str()); t.print();
+
+#endif
\ No newline at end of file