import logging import time from app import app, metric_queue from data.database import UseThenDisconnect from data import model from util.locking import GlobalLock, LockNotAcquiredException from workers.worker import Worker logger = logging.getLogger(__name__) WORKER_FREQUENCY = app.config.get('GLOBAL_PROMETHEUS_STATS_FREQUENCY', 60 * 60) class GlobalPrometheusStatsWorker(Worker): """ Worker which reports global stats (# of users, orgs, repos, etc) to Prometheus periodically. """ def __init__(self): super(GlobalPrometheusStatsWorker, self).__init__() self.add_operation(self._try_report_stats, WORKER_FREQUENCY) def _try_report_stats(self): logger.debug('Attempting to report stats') try: with GlobalLock('GLOBAL_PROM_STATS'): self._report_stats() except LockNotAcquiredException: logger.debug('Could not acquire global lock for global prometheus stats') return def _report_stats(self): logger.debug('Reporting global stats') with UseThenDisconnect(app.config): # Repository count. metric_queue.repository_count.Set(model.repository.get_repository_count()) # User counts. metric_queue.user_count.Set(model.user.get_active_user_count()) metric_queue.org_count.Set(model.organization.get_active_org_count()) metric_queue.robot_count.Set(model.user.get_robot_count()) def main(): logging.config.fileConfig('conf/logging_debug.conf', disable_existing_loggers=False) if not app.config.get('PROMETHEUS_AGGREGATOR_URL'): logger.debug('Prometheus not enabled; skipping global stats reporting') while True: time.sleep(100000) worker = GlobalPrometheusStatsWorker() worker.start() if __name__ == "__main__": main()