Spaces:
Runtime error
Runtime error
import time | |
import traceback | |
import requests | |
from apscheduler.schedulers.background import BackgroundScheduler | |
from inference.core.devices.utils import GLOBAL_DEVICE_ID, GLOBAL_INFERENCE_SERVER_ID | |
from inference.core.env import ( | |
API_KEY, | |
METRICS_ENABLED, | |
METRICS_INTERVAL, | |
METRICS_URL, | |
TAGS, | |
) | |
from inference.core.logger import logger | |
from inference.core.managers.metrics import ( | |
get_inference_results_for_model, | |
get_system_info, | |
) | |
from inference.core.utils.requests import api_key_safe_raise_for_status | |
from inference.core.utils.url_utils import wrap_url | |
from inference.core.version import __version__ | |
class PingbackInfo: | |
"""Class responsible for managing pingback information for Roboflow. | |
This class initializes a scheduler to periodically post data to Roboflow, containing information about the models, | |
container, and device. | |
Attributes: | |
scheduler (BackgroundScheduler): A scheduler for running jobs in the background. | |
model_manager (ModelManager): Reference to the model manager object. | |
process_startup_time (str): Unix timestamp indicating when the process started. | |
METRICS_URL (str): URL to send the pingback data to. | |
system_info (dict): Information about the system. | |
window_start_timestamp (str): Unix timestamp indicating the start of the current window. | |
""" | |
def __init__(self, manager): | |
"""Initializes PingbackInfo with the given manager. | |
Args: | |
manager (ModelManager): Reference to the model manager object. | |
""" | |
try: | |
self.scheduler = BackgroundScheduler() | |
self.model_manager = manager | |
self.process_startup_time = str(int(time.time())) | |
logger.debug( | |
"UUID: " + self.model_manager.uuid | |
) # To correlate with UI container view | |
self.window_start_timestamp = str(int(time.time())) | |
context = { | |
"api_key": API_KEY, | |
"timestamp": str(int(time.time())), | |
"device_id": GLOBAL_DEVICE_ID, | |
"inference_server_id": GLOBAL_INFERENCE_SERVER_ID, | |
"inference_server_version": __version__, | |
"tags": TAGS, | |
} | |
self.environment_info = context | get_system_info() | |
except Exception as e: | |
logger.debug( | |
"Error sending pingback to Roboflow, if you want to disable this feature unset the ROBOFLOW_ENABLED environment variable. " | |
+ str(e) | |
) | |
def start(self): | |
"""Starts the scheduler to periodically post data to Roboflow. | |
If METRICS_ENABLED is False, a warning is logged, and the method returns without starting the scheduler. | |
""" | |
if METRICS_ENABLED == False: | |
logger.warning( | |
"Metrics reporting to Roboflow is disabled; not sending back stats to Roboflow." | |
) | |
return | |
try: | |
self.scheduler.add_job( | |
self.post_data, | |
"interval", | |
seconds=METRICS_INTERVAL, | |
args=[self.model_manager], | |
) | |
self.scheduler.start() | |
except Exception as e: | |
logger.debug(e) | |
def stop(self): | |
"""Stops the scheduler.""" | |
self.scheduler.shutdown() | |
def post_data(self, model_manager): | |
"""Posts data to Roboflow about the models, container, device, and other relevant metrics. | |
Args: | |
model_manager (ModelManager): Reference to the model manager object. | |
The data is collected and reset for the next window, and a POST request is made to the pingback URL. | |
""" | |
all_data = self.environment_info.copy() | |
all_data["inference_results"] = [] | |
try: | |
now = time.time() | |
start = now - METRICS_INTERVAL | |
for model_id in model_manager.models(): | |
results = get_inference_results_for_model( | |
GLOBAL_INFERENCE_SERVER_ID, model_id, min=start, max=now | |
) | |
all_data["inference_results"] = all_data["inference_results"] + results | |
res = requests.post(wrap_url(METRICS_URL), json=all_data) | |
try: | |
api_key_safe_raise_for_status(response=res) | |
logger.debug( | |
"Sent metrics to Roboflow {} at {}.".format( | |
METRICS_URL, str(all_data) | |
) | |
) | |
except Exception as e: | |
logger.debug( | |
f"Error sending metrics to Roboflow, if you want to disable this feature unset the METRICS_ENABLED environment variable." | |
) | |
except Exception as e: | |
try: | |
logger.debug( | |
f"Error sending metrics to Roboflow, if you want to disable this feature unset the METRICS_ENABLED environment variable. Error was: {e}. Data was: {all_data}" | |
) | |
traceback.print_exc() | |
except Exception as e2: | |
logger.debug( | |
f"Error sending metrics to Roboflow, if you want to disable this feature unset the METRICS_ENABLED environment variable. Error was: {e}." | |
) | |