<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Sar.py</id>
	<title>Sar.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Sar.py"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Sar.py&amp;action=history"/>
	<updated>2026-06-05T09:42:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Sar.py&amp;diff=1483&amp;oldid=prev</id>
		<title>PeterHarding: New page: =Overview=  A Python script to summarize Systems Activity Reporting (sar) data.  Intention was to fit this on top of gnuplot or matplotlib to generate graphs  ==Script==  &lt;pre&gt; #!/usr/bin/...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Sar.py&amp;diff=1483&amp;oldid=prev"/>
		<updated>2008-02-25T04:10:27Z</updated>

		<summary type="html">&lt;p&gt;New page: =Overview=  A Python script to summarize Systems Activity Reporting (sar) data.  Intention was to fit this on top of gnuplot or matplotlib to generate graphs  ==Script==  &amp;lt;pre&amp;gt; #!/usr/bin/...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Overview=&lt;br /&gt;
&lt;br /&gt;
A Python script to summarize Systems Activity Reporting (sar) data.  Intention was to fit this on top of gnuplot or matplotlib to generate graphs&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#&lt;br /&gt;
#  Purpose: Process SAR data&lt;br /&gt;
#&lt;br /&gt;
#  Copyright (C) Peter Harding, 2003&lt;br /&gt;
#                All rights reserved&lt;br /&gt;
#&lt;br /&gt;
#  $Id:$&lt;br /&gt;
#&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Usage:  sar.py -o &amp;lt;option&amp;gt; -p &amp;lt;prefix&amp;gt; -s &amp;lt;starttime&amp;gt; -e &amp;lt;endtime&amp;gt; -d&lt;br /&gt;
&lt;br /&gt;
  Args:&lt;br /&gt;
&lt;br /&gt;
   -d             - Run in debug mode&lt;br /&gt;
   -e             - End time on the graph&lt;br /&gt;
   -h             - Help.  Print this syntax message.&lt;br /&gt;
   -p &amp;lt;prefix&amp;gt;    - Specify file prefix&lt;br /&gt;
   -o &amp;lt;option&amp;gt;    - Specify a sar function, such u, g, p, ...&lt;br /&gt;
                    The default is u (CPU).&lt;br /&gt;
   -s             - Start time on the graph&lt;br /&gt;
   -v             - Run in verbose mode&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;sar.py -ou -i20030705&amp;#039;  Process 20030705.sadc&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import string&lt;br /&gt;
import whrandom&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
__version__ = &amp;quot;@(#) 1.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
OPTS        = &amp;#039;df:he:o:p:s:vV?&amp;#039;&lt;br /&gt;
&lt;br /&gt;
debugFlg    = 0&lt;br /&gt;
verboseFlg  = 0&lt;br /&gt;
&lt;br /&gt;
cpu         = 0&lt;br /&gt;
&lt;br /&gt;
range_start = &amp;quot;0:00&amp;quot;&lt;br /&gt;
range_end   = &amp;quot;23:59&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start_min   = -1&lt;br /&gt;
end_min     = 1440&lt;br /&gt;
&lt;br /&gt;
opt         = &amp;#039;&amp;#039;&lt;br /&gt;
prefix      = &amp;#039;pre&amp;#039;&lt;br /&gt;
&lt;br /&gt;
SADCDIR     = &amp;quot;.&amp;quot;&lt;br /&gt;
WRKDIR      = &amp;quot;.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
datecode    = &amp;#039;&amp;#039;&lt;br /&gt;
sadcfile    = &amp;#039;&amp;#039;&lt;br /&gt;
inputfile   = &amp;#039;&amp;#039;&lt;br /&gt;
csvfile     = &amp;#039;&amp;#039;&lt;br /&gt;
plotfile    = &amp;#039;&amp;#039;&lt;br /&gt;
psfile      = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
##### Some stuff #####################################################&lt;br /&gt;
&lt;br /&gt;
def setup_xtics():&lt;br /&gt;
   if (( range / 5 ) &amp;lt; 15 ):&lt;br /&gt;
      increment = 5&lt;br /&gt;
   elif (( range / 10 ) &amp;lt; 15 ):&lt;br /&gt;
      increment = 10&lt;br /&gt;
   elif (( range / 15 ) &amp;lt; 15 ):&lt;br /&gt;
      increment = 15&lt;br /&gt;
   elif (( range / 20 ) &amp;lt; 15 ):&lt;br /&gt;
      increment = 20&lt;br /&gt;
   elif (( range / 30 ) &amp;lt; 15 ):&lt;br /&gt;
      increment = 30&lt;br /&gt;
   elif (( range / 60 ) &amp;lt; 15 ):&lt;br /&gt;
      increment = 60&lt;br /&gt;
   elif (( range / 120 ) &amp;lt; 15 ):&lt;br /&gt;
      increment = 120&lt;br /&gt;
&lt;br /&gt;
   no = ( range - ( range % increment ) ) / increment&lt;br /&gt;
&lt;br /&gt;
   start = start_time - ( start_time % increment )&lt;br /&gt;
   end   = end_time   - ( end_time % increment )&lt;br /&gt;
&lt;br /&gt;
   xtics = &amp;quot;(&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   for i in range(start, end, increment):&lt;br /&gt;
      hour = i / 60&lt;br /&gt;
      min  = i % 60&lt;br /&gt;
&lt;br /&gt;
      str = &amp;quot;&amp;#039;%02d:%02d&amp;#039; %d&amp;quot; % hour, min, i&lt;br /&gt;
&lt;br /&gt;
      xtics = xtics + str&lt;br /&gt;
&lt;br /&gt;
      if ( i != end ):&lt;br /&gt;
         xtics = xtics + &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   xtics = xtics + &amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def parse(filename):&lt;br /&gt;
   global cpu&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
      f = open(filename, &amp;#039;r&amp;#039;)&lt;br /&gt;
   except IOError, msg:&lt;br /&gt;
      err(filename + &amp;#039;: cannot open: &amp;#039; + `msg` + &amp;#039;\n&amp;#039;)&lt;br /&gt;
      return 1&lt;br /&gt;
&lt;br /&gt;
   lineno = 0&lt;br /&gt;
&lt;br /&gt;
   while 1:&lt;br /&gt;
      line = f.readline()&lt;br /&gt;
&lt;br /&gt;
      if not line: break&lt;br /&gt;
&lt;br /&gt;
      x = line.find(&amp;quot;%usr&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      if (line.find(&amp;quot;%usr&amp;quot;) != -1):&lt;br /&gt;
         # Start of CPU&lt;br /&gt;
         cpu = 1&lt;br /&gt;
&lt;br /&gt;
      lineno += 1&lt;br /&gt;
&lt;br /&gt;
      if &amp;#039;\0&amp;#039; in line:&lt;br /&gt;
         # Check for binary files&lt;br /&gt;
         err(filename + &amp;#039;: contains null bytes\n&amp;#039;)&lt;br /&gt;
         f.close()&lt;br /&gt;
         return 1&lt;br /&gt;
&lt;br /&gt;
      line = line[:-1]&lt;br /&gt;
&lt;br /&gt;
      if (cpu):&lt;br /&gt;
         print&amp;quot;[&amp;quot; + line + &amp;quot;]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      if (len(line) == 0):&lt;br /&gt;
         cpu = 0&lt;br /&gt;
&lt;br /&gt;
      if (lineno &amp;gt; 2000):&lt;br /&gt;
         break&lt;br /&gt;
&lt;br /&gt;
   f.close()&lt;br /&gt;
&lt;br /&gt;
   return 0&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def setup():&lt;br /&gt;
   global opt, prefix&lt;br /&gt;
   global sadcfile, inputfile, csvfile, plotfile, psfile&lt;br /&gt;
&lt;br /&gt;
   WRKDIR = prefix&lt;br /&gt;
&lt;br /&gt;
   print WRKDIR&lt;br /&gt;
&lt;br /&gt;
   os.chdir(WRKDIR)&lt;br /&gt;
&lt;br /&gt;
   sadcfile   = SADCDIR + &amp;quot;/&amp;quot; + datecode + &amp;quot;.sadc&amp;quot;&lt;br /&gt;
   inputfile  = &amp;quot;sar_&amp;quot; + opt + &amp;quot;.&amp;quot; + datecode&lt;br /&gt;
   csvfile    = datecode + &amp;quot;-&amp;quot; + opt + &amp;quot;.csv&amp;quot;&lt;br /&gt;
   plotfile   = datecode + &amp;quot;-&amp;quot; + opt + &amp;quot;.plt&amp;quot;&lt;br /&gt;
   psfile     = datecode + &amp;quot;-&amp;quot; + opt + &amp;quot;.ps&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   print psfile&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def process(str):&lt;br /&gt;
   global filename&lt;br /&gt;
   global datecode&lt;br /&gt;
&lt;br /&gt;
   datecode = str&lt;br /&gt;
&lt;br /&gt;
   print datecode&lt;br /&gt;
&lt;br /&gt;
   filename = &amp;quot;sar_A.&amp;quot; + datecode&lt;br /&gt;
&lt;br /&gt;
   setup()&lt;br /&gt;
&lt;br /&gt;
   print &amp;quot;Processing %s...\n&amp;quot; % inputfile&lt;br /&gt;
&lt;br /&gt;
   cmd = &amp;quot;sar -&amp;quot; + opt + &amp;quot; -f &amp;quot; + sadcfile + &amp;quot; &amp;gt; &amp;quot; + inputfile&lt;br /&gt;
&lt;br /&gt;
   print cmd&lt;br /&gt;
&lt;br /&gt;
   # os.system( cmd )&lt;br /&gt;
&lt;br /&gt;
   parse(filename)&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def minutes(str):&lt;br /&gt;
   t = str.split(&amp;quot;:&amp;quot;)&lt;br /&gt;
   min = (string.atoi(t[0]) * 60) + string.atoi(t[1])&lt;br /&gt;
   return min&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
   global filename&lt;br /&gt;
   global debugFlg&lt;br /&gt;
   global verboseFlg&lt;br /&gt;
   global prefix&lt;br /&gt;
   global opt&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
      opts, args = getopt.getopt(sys.argv[1:], OPTS)&lt;br /&gt;
   except getopt.error, msg:&lt;br /&gt;
      print __doc__&lt;br /&gt;
      return 1&lt;br /&gt;
&lt;br /&gt;
   filename   = &amp;quot;xx&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   for o, a in opts:&lt;br /&gt;
      if o == &amp;#039;-d&amp;#039;:&lt;br /&gt;
         debugFlg = 1&lt;br /&gt;
      elif o == &amp;#039;-o&amp;#039;:&lt;br /&gt;
         opt = a&lt;br /&gt;
      elif o == &amp;#039;-p&amp;#039;:&lt;br /&gt;
         prefix = a&lt;br /&gt;
      elif o == &amp;#039;-f&amp;#039;:&lt;br /&gt;
         filename = a&lt;br /&gt;
         #filename = string.atoi(a)&lt;br /&gt;
      elif o == &amp;#039;-h&amp;#039;:&lt;br /&gt;
         print __doc__&lt;br /&gt;
         return 1&lt;br /&gt;
      elif o == &amp;#039;-s&amp;#039;:&lt;br /&gt;
         range_start = minutes(a)&lt;br /&gt;
         start_min = a&lt;br /&gt;
      elif o == &amp;#039;-e&amp;#039;:&lt;br /&gt;
         range_end_s = minutes(a)&lt;br /&gt;
         end_min = a&lt;br /&gt;
      elif o == &amp;#039;-v&amp;#039;:&lt;br /&gt;
         verboseFlg = 1&lt;br /&gt;
      elif o == &amp;#039;-V&amp;#039;:&lt;br /&gt;
         print &amp;quot;Version: %s&amp;quot; % __version__&lt;br /&gt;
         return 1&lt;br /&gt;
      elif o == &amp;#039;-?&amp;#039;:&lt;br /&gt;
         print __doc__&lt;br /&gt;
         return 1&lt;br /&gt;
&lt;br /&gt;
   if (debugFlg):&lt;br /&gt;
      print &amp;quot;&amp;gt;&amp;gt; Opt    %s&amp;quot; % opt&lt;br /&gt;
      print &amp;quot;&amp;gt;&amp;gt; Prefix %s&amp;quot; % prefix&lt;br /&gt;
&lt;br /&gt;
   if args:&lt;br /&gt;
      for arg in args:&lt;br /&gt;
         print arg&lt;br /&gt;
   else:&lt;br /&gt;
      pass&lt;br /&gt;
&lt;br /&gt;
   xxx()&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039; or __name__ == sys.argv[0]:&lt;br /&gt;
   sys.exit(main())&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
##### Process the data file ##########################################&lt;br /&gt;
# &lt;br /&gt;
# range_start = $opt_s&lt;br /&gt;
# range_end = $opt_e&lt;br /&gt;
# @t = split( &amp;quot;:&amp;quot;, $range_start )&lt;br /&gt;
# $start_time = $t[0] * 60 + $t[1]&lt;br /&gt;
# &lt;br /&gt;
# @t = split( &amp;quot;:&amp;quot;, $range_end )&lt;br /&gt;
# $end_time   = $t[0] * 60 + $t[1]&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# $before_start_time = 1&lt;br /&gt;
# $no                = 0&lt;br /&gt;
# &lt;br /&gt;
# @data              = ()&lt;br /&gt;
# @time              = ()&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Revision History:&lt;br /&gt;
&lt;br /&gt;
     Date     Who   Description&lt;br /&gt;
   --------   ---   --------------------------------------------------&lt;br /&gt;
   20030920   plh   Initial implementation&lt;br /&gt;
   20031002   plh   Cleaned up args in main().  Added &amp;#039;-h&amp;#039;, &amp;#039;-?&amp;#039;, &amp;#039;-V&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Problems to fix:&lt;br /&gt;
&lt;br /&gt;
To Do:&lt;br /&gt;
&lt;br /&gt;
Issues:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>