import logging from prometheus_client import Counter, Histogram, start_http_server NAMESPACE = "skyembed" logger = logging.getLogger(__name__) class PromMetrics: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance._initialized = False return cls._instance def __init__(self): if self._initialized: return self.embedding_performed = Counter( name="embedding_performed", namespace=NAMESPACE, documentation="Number of embeddings performed", labelnames=["status"], ) self.embedding_duration = Histogram( name="embedding_duration_seconds", namespace=NAMESPACE, buckets=( 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, ), labelnames=["status"], documentation="Time taken to create an embedding", ) self.events_handled = Counter( name="events_handled", namespace=NAMESPACE, documentation="Number of events handled", labelnames=["kind", "status"], ) self.upserts = Counter( name="upserts", namespace=NAMESPACE, documentation="Number of database upserts", labelnames=["kind", "status"], ) self.upsert_duration = Histogram( name="upsert_duration_seconds", namespace=NAMESPACE, buckets=( 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, ), labelnames=["kind", "status"], documentation="Time taken to perform an upsert", ) self._initialized = True def start_http(self, port: int, addr: str = "0.0.0.0"): logger.info(f"Starting Prometheus client on {addr}:{port}") start_http_server(port=port, addr=addr) logger.info(f"Prometheus client running on {addr}:{port}") prom_metrics = PromMetrics()