97 lines
2.6 KiB
Python
Raw Normal View History

#!/usr/bin/python3
#
# SPDX-License-Identifier: Apache-2.0
#
"""
This module provides functions to track and report key performance indicators (KPIs) for a program.
"""
import time
from utils.install_log import LOG
STAGES = []
METRICS = {}
START = 0
def init_kpi_metrics():
"""
Initializes the global variable START with the current time to start tracking the
duration of a program.
"""
global START # pylint: disable=global-statement
START = time.time()
def get_formated_time(sec):
"""
Takes the duration in seconds and formats it in hours, minutes and seconds.
Returns the formatted string.
"""
hours = sec // 3600
sec %= 3600
minutes = sec // 60
sec %= 60
seconds = sec
if hours:
return f"{hours:.0f}h {minutes:.0f}m {seconds:.2f}s"
if minutes:
return f"{minutes:.0f}m {seconds:.2f}s"
return f"{seconds:.2f}s"
def set_kpi_metric(metric, duration):
"""Sets the duration of a metric and adds the metric to the global list of STAGES."""
global METRICS, STAGES # pylint: disable=global-statement, global-variable-not-assigned
METRICS[metric] = duration
STAGES.append(metric)
def print_kpi(metric):
"""Takes a metric as input and prints the duration of that metric using the LOG module."""
if metric in STAGES:
sec = METRICS[metric]
LOG.info(" Time in stage '%s': %s ", metric, get_formated_time(sec))
elif metric == 'total' and START:
duration = time.time() - START
LOG.info(" Total time: %s", get_formated_time(duration))
def get_kpi_str(metric):
"""Takes a metric as input and returns the duration of that metric as a formatted string."""
msg = ""
if metric in STAGES:
sec = METRICS[metric]
msg += f" Time in stage '{metric}': {get_formated_time(sec)} \n"
elif metric == 'total' and START:
duration = time.time() - START
msg += f" Total time: {get_formated_time(duration)}\n"
return msg
def get_kpi_metrics_str():
"""Returns a formatted string with all the metrics and their durations."""
msg = "===================== Metrics ====================\n"
for stage in STAGES:
msg += get_kpi_str(stage)
msg += get_kpi_str('total')
msg += "===============================================\n"
return msg
def print_kpi_metrics():
"""Prints all the metrics and their durations using the LOG module."""
LOG.info("===================== Metrics ====================")
for stage in STAGES:
print_kpi(stage)
print_kpi('total')
LOG.info("==================================================")