d65811f2d5
Enabling automatic tests with tox and zuul for each new patchset. To see the unit test logs, go to: 1- Zuul Summary 2- tox-unittests 3- Logs 4- job-output.txt Test Plan: PASS: Run "tox -e unittests" in the terminal, this will: - Set the PYTHONPATH environment variable - Run the tests - Show the coverage report Task: 47929 Story: 2005051 Change-Id: I7f527860f3498c53b28691c654035d017d70f68b Signed-off-by: Lindley Werner <lindley.vieira@encora.com>
97 lines
2.6 KiB
Python
97 lines
2.6 KiB
Python
#!/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("==================================================")
|