perfrunbook/utilities/mpstat_parse.py (51 lines of code) (raw):
#! /usr/bin/env python3
import numpy as np
import pandas as pd
# Pass in a dict s:
# { date: string in YYYY-MM-DD
# time: string in hh:mm:ss
# }
# Pass in a last_date as an np.datetime64 obj or None
# Returns a np.datetime64 object
def parse_time(time, last_date):
# Get ourselves a date in ISO format from last_date
date = f"{last_date.tolist().year}-{last_date.tolist().month:02d}-{last_date.tolist().day:02d}"
d = np.datetime64(f"{date} {time}")
if last_date:
while (d - last_date) < np.timedelta64(0, 's'):
d = d + np.timedelta64(1, 'D')
return d
def parse_mpstat_json_all_irqs(data):
"""
Parses IRQs for entire system
"""
irq_data = data["sysstat"]["hosts"][0]["statistics"]
date = data["sysstat"]["hosts"][0]["date"]
data = {"time": [],
"irq_s": []}
last_date = None
for stats in irq_data:
timestamp = stats["timestamp"]
all_irqs = float(stats["sum-interrupts"][0]["intr"])
if last_date:
date = parse_time(timestamp, last_date)
else:
date = np.datetime64(f"{date} {timestamp}")
last_date = date
data["time"].append(date)
data["irq_s"].append(all_irqs)
df = pd.DataFrame(data)
df = df.set_index('time')
return df
def parse_mpstat_json_single_irq(data, irq):
"""
Does the generic parsing and combining
"""
irq_data = data["sysstat"]["hosts"][0]["statistics"]
date = data["sysstat"]["hosts"][0]["date"]
data = {"time": []}
data[irq] = []
last_date = None
for stats in irq_data:
timestamp = stats["timestamp"]
single_irq = 0
for cpus in stats["individual-interrupts"]:
for irqs in cpus["intr"]:
if irqs["name"] == irq:
single_irq += int(irqs["value"])
if last_date:
date = parse_time(timestamp, last_date)
else:
date = np.datetime64(f"{date} {timestamp}")
last_date = date
data["time"].append(date)
data[irq].append(single_irq)
df = pd.DataFrame(data)
df = df.set_index('time')
return df