mirror of
https://gitlab.science.ru.nl/technicie/MarietjeDjango.git
synced 2025-12-09 19:22:22 +01:00
44 lines
1.8 KiB
Python
44 lines
1.8 KiB
Python
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")
|