Indentation is lost in that code, but if I read that correctly, it works
exactly the same as now. No data arrives until trace is stopped?


On Thu, Oct 24, 2013 at 1:18 PM, Pavel Cisar <pci...@ibphoenix.cz> wrote:

> **
>
>
>
>
> Dne 24.10.2013 11:46, Harriv napsal(a):
>
> >
> >
> > I don't need main thread to be responsive, I want to read the data as
> > soon as possible. It's possible to control the tracing from command line
> > or another application, or I can use multiprocessing module to help.
> >
> > How to do that? How to get data before trace has stopped?
> >
> > It's probably possible to pipe the output of fbtracemgr to Python
> > program, but I'm still interested how to do it with plain Python program.
>
> You were on right track with svc.readline(), as it returns with data if
> there are any trace data at server. If it do not returns, then there are
> no data which means that no events happen in database that match your
> trace config. If you're sure it should report something, then check your
> trace config as problem is most likely there.
>
> If you want to read everything that trace session returns immediately as
> it's available, use simple loop over service (service object acts
> similarly like file object here), for example:
>
> svc = fdb.sevices.connect(...)
> for line in svc:
> print line
>
> However, it never stops looping until trace session is canceled by other
> means.
>
> Here is sample script that traces all SELECT statements in given
> database and shows information when select finishes:
>
> import fdb
> import argparse
> import os
>
> def main():
>
> parser = argparse.ArgumentParser(description="Tool to analyze index
> usage.")
>
> parser.add_argument('database',
> help="Full path to database.")
> parser.add_argument('-o','--host',
> help="Server host.")
> parser.add_argument('-u','--user',
> default=os.environ.get('ISC_USER', 'sysdba'),
> help="User name")
> parser.add_argument('-p','--password',
> default=os.environ.get('ISC_PASSWORD', None),
> help="User password")
>
> args = parser.parse_args()
>
> # We need password
> if not args.password:
> print "A password is required to use the Services Manager."
> print
> parser.print_help()
> return
>
> trace_config = """<database %s>
> enabled true
> log_statement_finish true
> print_plan true
> include_filter %%SELECT%%
> exclude_filter %%RDB$%%
> time_threshold 0
> max_sql_length 2048
> </database>
> """
> try:
> if args.host:
> svc_host = args.host + ':service_mgr'
> else:
> svc_host = 'service_mgr'
> svc =
> fdb.services.connect(host=svc_host,user=args.user,password=args.password)
>
> trace_id = svc.trace_start(config=trace_config % args.database)
> trace_start = datetime.datetime.now()
> print "Trace session %i started." % trace_id
> except Exception as e:
> print e
> exit
>
> print "Use tracex.py to stop this trace session."
>
> try:
> for line in svc:
> print line
> except Exception as e:
> print 'Trace ended with exception:\n%s\n' % str(e)
> else:
> print "Trace session stopped"
>
> svc.close()
>
> if __name__ == '__main__':
> main()
>
> To control trace services you can use next script (tracex.py mentioned
> in previous one):
>
> import fdb
> import argparse
> import os
>
> def main():
>
> parser = argparse.ArgumentParser(description="Tool to manage trace
> sessions")
>
> parser.add_argument('-o','--host',
> help="Server host.")
> parser.add_argument('-u','--user',
> default=os.environ.get('ISC_USER', 'sysdba'),
> help="User name")
> parser.add_argument('-p','--password',
> default=os.environ.get('ISC_PASSWORD', None),
> help="User password")
> parser.add_argument('-l','--list', action='store_true',
> help="List trace sessions.")
> parser.add_argument('-s','--suspend', type=int, metavar='SESSION_ID',
> help="Pause trace # session.")
> parser.add_argument('-r','--resume', type=int, metavar='SESSION_ID',
> help="resume trace # session.")
> parser.add_argument('-c','--cancel', type=int, metavar='SESSION_ID',
> help="cancel trace # session.")
>
> args = parser.parse_args()
>
> if not args.password:
> print "A password is required to use the Services Manager."
> print
> parser.print_help()
> return
>
> if args.host:
> svc_host = args.host + ':service_mgr'
> else:
> svc_host = 'service_mgr'
> svc =
> fdb.services.connect(host=svc_host,user=args.user,password=args.password)
>
> if args.list:
> sessions = svc.trace_list()
> if len(sessions.keys()) == 0:
> print "No trace sessions."
> else:
> for sid, data in sessions.items():
> print "Trace session %i" % sid
> if data.has_key('name'):
> print " name:", data['name']
> print " date:", data['date'].strftime('%Y-%m-%d %H:%M:%S')
> print " user:", data['user']
> print " flags:", ', '.join(data['flags'])
> elif args.suspend:
> try:
> print svc.trace_suspend(args.suspend)
> except Exception as e:
> print "ERROR:"
> print e.args
> elif args.resume:
> try:
> print svc.trace_resume(args.resume)
> except Exception as e:
> print "ERROR:"
> print e.args
> elif args.cancel:
> try:
> print svc.trace_stop(args.cancel)
> except Exception as e:
> print "ERROR:"
> print e.args
>
> if __name__ == '__main__':
> main()
>
>
> best regards
> Pavel Cisar
> IBPhoenix
>
>  
>

Reply via email to