Source code for glideinwms.lib.servicePerformance
#!/bin/env python
# SPDX-FileCopyrightText: 2009 Fermi Research Alliance, LLC
# SPDX-License-Identifier: Apache-2.0
###############################################################################
# servicePerf.py
#
# Description:
#
# Author:
# Parag Mhashilkar (November 2016)
#
# License:
# Fermitools
#
###############################################################################
import time
[docs]
class PerfMetric:
"""
Class to store performance metrics for different events in a service
"""
def __init__(self, name):
self.name = name
# metric is a dict of dict with following structure
# {event_name: {'start_time': time(), 'end_time': time()}}
self.metric = {}
[docs]
def register_event_time(self, event_name, t_tag, t=None):
if not t:
t = time.time()
if event_name not in self.metric:
self.metric[event_name] = {}
self.metric[event_name][t_tag] = t
[docs]
def deregister_event(self, event_name):
self.metric.pop(event_name, None)
[docs]
def event_start(self, event_name, t=None):
self.register_event_time(event_name, "start_time", t=t)
[docs]
def event_end(self, event_name, t=None):
self.register_event_time(event_name, "end_time", t=t)
[docs]
def event_lifetime(self, event_name, check_active_event=True):
lifetime = -1
if event_name in self.metric:
if ("start_time" in self.metric[event_name]) and ("end_time" in self.metric[event_name]):
lifetime = self.metric[event_name]["end_time"] - self.metric[event_name]["start_time"]
# Event still alive, consider current time instead of end time
if (lifetime < 0) and (check_active_event):
lifetime = time.time() - self.metric[event_name]["start_time"]
return float(f"{lifetime:.3f}")
def __str__(self):
return self.__repr__()
def __repr__(self):
return f"{{'{self.name}': {self.metric}}}"
# Internal global dict of performance metric objects
# Should not be used directly
_perf_metric = {}
################################################################################
# User functions
################################################################################
[docs]
def startPerfMetricEvent(name, event_name, t=None):
perf_metric = getPerfMetric(name)
perf_metric.event_start(event_name, t=t)
[docs]
def endPerfMetricEvent(name, event_name, t=None):
perf_metric = getPerfMetric(name)
perf_metric.event_end(event_name, t=t)
[docs]
def getPerfMetricEventLifetime(name, event_name):
return getPerfMetric(name).event_lifetime(event_name)
[docs]
def getPerfMetric(name):
"""
Given the name of the service, return the PerfMetric object
"""
global _perf_metric
if name not in _perf_metric:
_perf_metric[name] = PerfMetric(name)
return _perf_metric[name]