Browse Source

Allow for fs choice

check-vt100
Aleksander Kiryk 4 years ago
parent
commit
64bd9727cf
  1. 41
      sargraph.py

41
sargraph.py

@ -16,8 +16,9 @@ import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
from select import select from select import select
from fcntl import fcntl, F_GETFL, F_SETFL from fcntl import fcntl, F_GETFL, F_SETFL
from os.path import realpath
from socket import gethostname from socket import gethostname
from re import search from re import search, escape
global gnuplot global gnuplot
global die global die
@ -28,8 +29,10 @@ GNUPLOT_VERSION_EXPECTED = 5.0
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('session', metavar='SESSION-NAME', type=str, nargs='?', default=None, help='sargraph session name') parser.add_argument('session', metavar='SESSION-NAME', type=str, nargs='?', default=None, help='sargraph session name')
parser.add_argument('command', metavar='COMMAND', type=str, nargs='*', help='send command') parser.add_argument('command', metavar='COMMAND', type=str, nargs='*', help='send command')
parser.add_argument('-f', metavar='DEVICE-NAME', type=str, nargs='?', default=None, dest='fsdev', help='observe a chosen filesystem')
parser.add_argument('-m', metavar='MOUNT-DIR', type=str, nargs='?', default=None, dest='fspath', help='observe a chosen filesystem')
args = parser.parse_args() args = parser.parse_args()
@ -152,7 +155,7 @@ if args.session:
if cmd[0] == "start": if cmd[0] == "start":
print("Starting sargraph session '%s'" % sid) print("Starting sargraph session '%s'" % sid)
p = subprocess.Popen(["screen", "-dmSL", sid, os.path.realpath(__file__)]) p = subprocess.Popen(["screen", "-dmSL", sid, os.path.realpath(__file__), *sys.argv[3:]])
while p.poll() is None: while p.poll() is None:
time.sleep(0.1) time.sleep(0.1)
gpid = 0 gpid = 0
@ -257,12 +260,25 @@ g("set terminal %s size 1200,800 background '#222222' font 'Courier-New,8'" % OU
signal.signal(signal.SIGTERM, kill_handler) signal.signal(signal.SIGTERM, kill_handler)
i = 0 i = 0
if not args.fspath and not args.fsdev:
args.fspath = "/"
if args.fspath:
args.fspath = realpath(args.fspath)
with open("/proc/mounts", "r") as f:
while args.fsdev is None:
args.fsdev = scan("^(/dev/\S+)\s+%s\s+" % escape(args.fspath), str, f.readline())
if not args.fsdev:
print("Error: no device is mounted on %s" % args.fspath)
sys.exit(1)
START_DATE = "" START_DATE = ""
END_DATE = "" END_DATE = ""
AVERAGE_LOAD = 0.0 AVERAGE_LOAD = 0.0
MAX_USED_RAM = 0 MAX_USED_RAM = 0
MAX_USED_FS = 0 MAX_USED_FS = 0
FS_SAR_INDEX = None
flags = fcntl(sys.stdin, F_GETFL) flags = fcntl(sys.stdin, F_GETFL)
fcntl(sys.stdin, F_SETFL, flags | os.O_NONBLOCK) fcntl(sys.stdin, F_SETFL, flags | os.O_NONBLOCK)
labels = [] labels = []
@ -302,14 +318,15 @@ while 1:
# Read and process FS data # Read and process FS data
fs_data = read_table(p.stdout) fs_data = read_table(p.stdout)
END_DATE = now + " " + fs_data['time'][0] if FS_SAR_INDEX is None:
fs_data['time'][0] = now + "-" + fs_data['time'][0] FS_SAR_INDEX = fs_data['FILESYSTEM'].index(args.fsdev)
if MAX_USED_FS < int(fs_data['MBfsused'][0]): END_DATE = now + " " + fs_data['time'][FS_SAR_INDEX]
MAX_USED_FS = int(fs_data['MBfsused'][0]) fs_data['time'][FS_SAR_INDEX] = now + "-" + fs_data['time'][FS_SAR_INDEX]
if MAX_USED_FS < int(fs_data['MBfsused'][FS_SAR_INDEX]):
MAX_USED_FS = int(fs_data['MBfsused'][FS_SAR_INDEX])
with open("data.txt", "a") as f: with open("data.txt", "a") as f:
f.write("%s %s %s %s\n" % (cpu_data["time"][0], cpu_data["%user"][0], ram_data["%memused"][0], fs_data["%fsused"][0])) f.write("%s %s %s %s\n" % (cpu_data["time"][0], cpu_data["%user"][0], ram_data["%memused"][0], fs_data["%fsused"][FS_SAR_INDEX]))
if die: if die:
break break
@ -373,8 +390,8 @@ g("set ylabel 'ram % usage'")
g("set title 'ram usage (max = %.2f GB)'" % MAX_USED_RAM); g("set title 'ram usage (max = %.2f GB)'" % MAX_USED_RAM);
g("plot 'data.txt' using 1:3:3 title 'ram' with boxes palette") g("plot 'data.txt' using 1:3:3 title 'ram' with boxes palette")
g("set ylabel '%s %% usage'" % fs_data['FILESYSTEM'][0]) g("set ylabel '%s %% usage'" % fs_data['FILESYSTEM'][FS_SAR_INDEX])
g("set title '%s usage (max = %.2f MB)'" % (fs_data['FILESYSTEM'][0], MAX_USED_FS)); g("set title '%s usage (max = %.2f MB)'" % (fs_data['FILESYSTEM'][FS_SAR_INDEX], MAX_USED_FS));
g("plot 'data.txt' using 1:4:4 title 'fs' with boxes palette") g("plot 'data.txt' using 1:4:4 title 'fs' with boxes palette")
g("unset multiplot") g("unset multiplot")

Loading…
Cancel
Save