Spaces:
Running
on
Zero
Running
on
Zero
File size: 5,306 Bytes
2eafbc4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
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}."
)
|