#! /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