Add basic metrics export

This commit is contained in:
Daan Sprenkels
2018-04-09 14:58:37 +02:00
parent 684710ebae
commit 17858c4aae
10 changed files with 42 additions and 0 deletions

View File

@ -12,11 +12,16 @@ from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_http_methods from django.views.decorators.http import require_http_methods
from django.conf import settings from django.conf import settings
from mutagen import File from mutagen import File
from prometheus_client import Counter
from marietje.utils import song_to_dict, playlist_song_to_dict, send_to_bertha from marietje.utils import song_to_dict, playlist_song_to_dict, send_to_bertha
from queues.models import PlaylistSong, QueueCommand from queues.models import PlaylistSong, QueueCommand
from songs.models import Song 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): def api_auth_required(view_func):
@wraps(view_func) @wraps(view_func)
@ -215,6 +220,7 @@ def request(request):
queue = request.user.queue queue = request.user.queue
song = get_object_or_404(Song, id=request.POST.get('id'), deleted=False) song = get_object_or_404(Song, id=request.POST.get('id'), deleted=False)
if queue.request(song, request.user): if queue.request(song, request.user):
request_counter.labels(queue=queue.name).inc()
return JsonResponse({ return JsonResponse({
'success': True '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 = Song(user=request.user, artist=artists[i], title=titles[i], hash=hash, duration=duration)
song.save() song.save()
upload_counter.inc()
return JsonResponse({'success': True}) return JsonResponse({'success': True})

View File

@ -15,6 +15,7 @@ Including another URLconf
""" """
from django.conf.urls import include, url from django.conf.urls import include, url
from django.contrib import admin from django.contrib import admin
from metrics.views import metrics
from queues.views import index from queues.views import index
from django.contrib.auth.views import login, logout from django.contrib.auth.views import login, logout
from .views import register, activate, forgotpassword, resetpassword from .views import register, activate, forgotpassword, resetpassword
@ -34,4 +35,5 @@ urlpatterns = [
url(r'^api/', include('api.urls')), url(r'^api/', include('api.urls')),
url(r'^playerapi/', include('playerapi.urls')), url(r'^playerapi/', include('playerapi.urls')),
url(r'^stats/', include('stats.urls')), url(r'^stats/', include('stats.urls')),
url(r'^metrics', metrics, name='metrics'),
] ]

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
marietje/metrics/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class MetricsConfig(AppConfig):
name = 'metrics'

View File

View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

18
marietje/metrics/views.py Normal file
View File

@ -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")

View File

@ -1,3 +1,4 @@
django django
mutagen mutagen
argon2-cffi argon2-cffi
prometheus_client