diff --git a/marietje/api/views.py b/marietje/api/views.py index 358312c..d750765 100644 --- a/marietje/api/views.py +++ b/marietje/api/views.py @@ -12,11 +12,16 @@ from django.shortcuts import get_object_or_404 from django.views.decorators.http import require_http_methods from django.conf import settings from mutagen import File +from prometheus_client import Counter + from marietje.utils import song_to_dict, playlist_song_to_dict, send_to_bertha from queues.models import PlaylistSong, QueueCommand from songs.models import Song +request_counter = Counter('marietje_requests', 'Queue requests on marietje', ['queue']) +upload_counter = Counter('marietje_uploads', 'Songs uploaded to marietje') + def api_auth_required(view_func): @wraps(view_func) @@ -215,6 +220,7 @@ def request(request): queue = request.user.queue song = get_object_or_404(Song, id=request.POST.get('id'), deleted=False) if queue.request(song, request.user): + request_counter.labels(queue=queue.name).inc() return JsonResponse({ 'success': True }) @@ -265,6 +271,7 @@ def upload(request): song = Song(user=request.user, artist=artists[i], title=titles[i], hash=hash, duration=duration) song.save() + upload_counter.inc() return JsonResponse({'success': True}) diff --git a/marietje/marietje/urls.py b/marietje/marietje/urls.py index 60ae0ad..93377fc 100644 --- a/marietje/marietje/urls.py +++ b/marietje/marietje/urls.py @@ -15,6 +15,7 @@ Including another URLconf """ from django.conf.urls import include, url from django.contrib import admin +from metrics.views import metrics from queues.views import index from django.contrib.auth.views import login, logout from .views import register, activate, forgotpassword, resetpassword @@ -34,4 +35,5 @@ urlpatterns = [ url(r'^api/', include('api.urls')), url(r'^playerapi/', include('playerapi.urls')), url(r'^stats/', include('stats.urls')), + url(r'^metrics', metrics, name='metrics'), ] diff --git a/marietje/metrics/__init__.py b/marietje/metrics/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/marietje/metrics/admin.py b/marietje/metrics/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/marietje/metrics/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/marietje/metrics/apps.py b/marietje/metrics/apps.py new file mode 100644 index 0000000..1e777e4 --- /dev/null +++ b/marietje/metrics/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MetricsConfig(AppConfig): + name = 'metrics' diff --git a/marietje/metrics/migrations/__init__.py b/marietje/metrics/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/marietje/metrics/models.py b/marietje/metrics/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/marietje/metrics/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/marietje/metrics/tests.py b/marietje/metrics/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/marietje/metrics/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/marietje/metrics/views.py b/marietje/metrics/views.py new file mode 100644 index 0000000..e975772 --- /dev/null +++ b/marietje/metrics/views.py @@ -0,0 +1,18 @@ +from prometheus_client import generate_latest, Gauge + +from django.db.models import Q +from django.http import HttpResponse + +from queues.models import Queue, PlaylistSong + +# Export queue length +g = Gauge('marietje_queue_length', 'Marietje queue length', ['name']) +for queue in Queue.objects.all(): + def _get_queue_length(): + return PlaylistSong.objects.filter(Q(playlist=queue.playlist_id), + Q(state=0) | Q(state=1)).count() + g.labels(name=queue).set_function(_get_queue_length) + + +def metrics(request): + return HttpResponse(generate_latest(), content_type="text/plain") diff --git a/requirements.txt b/requirements.txt index 1c2216c..cff865b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ django mutagen argon2-cffi +prometheus_client