from django.http import HttpResponse from django.db.utils import OperationalError from prometheus_client import generate_latest, Gauge from queues.models import Queue, PlaylistSong # Export queue length queue_length_gauge = Gauge('marietje_queue_length', 'Marietje queue length', ['name']) # Export the queue duration queue_duration_gauge = Gauge('marietje_queue_duration', 'Marietje queue duration in seconds', ['name']) # Export the amount of different users in the queue queue_users_gauge = Gauge('marietje_queue_users', 'Users holding a queue at some point', ['name']) try: for queue in Queue.objects.all(): def _get_queue_length(): return PlaylistSong.objects.filter(playlist=queue.playlist_id, state=0).count() def _get_queue_duration(): playlist_songs = (PlaylistSong.objects.filter(playlist=queue.playlist_id, state=0) .select_related('song') .all()) return sum(ps.song.duration for ps in playlist_songs) def _get_queue_distinct_users(): # Ideally, we would use .distinct() here, but it is not supported on # sqlite3. This makes testing a bit tedious. Also, it does not give me # that much of confidence that it would also work on mysql. # Furtermore, we do not expect the queue to be very long at any moment. return len(set(PlaylistSong.objects.filter(playlist=queue.playlist_id, state=0) .values_list('user'))) queue_length_gauge.labels(name=queue).set_function(_get_queue_length) queue_duration_gauge.labels(name=queue).set_function(_get_queue_duration) queue_users_gauge.labels(name=queue).set_function(_get_queue_distinct_users) except OperationalError: pass def metrics(request): return HttpResponse(generate_latest(), content_type="text/plain")