Source code for perfmon.common.report.__init__

"""This module contains class to generate job report"""

import os
import logging

from perfmon.common.utils.json_wrappers import load_json
from perfmon.common.utils.pdf import PDF

_log = logging.getLogger(__name__)

# pylint: disable=E0401,W0201,C0301


[docs]class GenReport(object): """This class does all the post monitoring steps like making plots and generating reports""" # pylint: disable=too-many-instance-attributes def __init__(self, config): """Initialize setup""" self.config = config.copy() # Initialise plot related parameters self.initialise_plot_per_page()
[docs] def initialise_plot_per_page(self): """Initialises plot related parameters""" # Define plots per page self.plots_per_page = [ [ 'Average_CPU_Load_all_nodes.png', 'Average_Memory_all_nodes.png', 'Average_Memory_Bandwidth_(Read)_all_nodes.png', ], [ 'Total_Output_Traffic_all_nodes.png', 'Total_Input_Traffic_all_nodes.png', 'Total_Packets_Output_all_nodes.png', 'Total_Packets_Input_all_nodes.png', ], [ 'Total_Interconnect_Output_Traffic_all_nodes.png', 'Total_Interconnect_Input_Traffic_all_nodes.png', 'Total_Interconnect_Packets_Output_all_nodes.png', 'Total_Interconnect_Packets_Input_all_nodes.png', ], [ 'Total_RAPL_Package_Power_all_nodes.png', 'Total_RAPL_DRAM_Power_all_nodes.png', 'Total_RAPL_Core_Power_all_nodes.png', 'Total_RAPL_Uncore_Power_all_nodes.png', ], [ 'CPU_Load_per_node.png', 'Memory_per_node.png', 'Memory_Bandwidth_(Read)_per_node.png', ], [ 'Output_Traffic_per_node.png', 'Input_Traffic_per_node.png', 'Packets_Output_per_node.png', 'Packets_Input_per_node.png', ], [ 'Interconnect_Output_Traffic_per_node.png', 'Interconnect_Input_Traffic_per_node.png', 'Interconnect_Packets_Output_per_node.png', 'Interconnect_Packets_Input_per_node.png', ], [ 'RAPL_Package_Power_per_node.png', 'RAPL_DRAM_Power_per_node.png', 'RAPL_Core_Power_per_node.png', 'RAPL_Uncore_Power_per_node.png', ], ]
[docs] def create_job_report(self, content): """Create a job report using FPDF module""" # Number of nodes in the job num_nodes = len(content['host_names']) # Get username of the job user_name = os.environ['USER'] # Add them to the config file self.config['user'] = user_name self.config['num_nodes'] = num_nodes # Initiate the class pdf = PDF(self.config) # Add each page to pdf for elem in self.plots_per_page: image_list = [] for image in elem: image_path = os.path.join(self.config['plot_dir'], image) if os.path.isfile(image_path): image_list.append(image_path) pdf.print_page(image_list) # Finally save pdf pdf.output(self.config['report_path'], 'F')
[docs] def go(self): """Entry point for creating report""" _log.info('Creating job report...') # Load CPU metric data content = load_json(os.path.join(self.config['data_dir'], 'cpu_metrics.json')) if content['host_names']: self.create_job_report(content) _log.info('Job report generated') else: _log.warning('No metric data found. Skipping job report generation.')