diff --git a/Makefile b/Makefile index 755d2f4..a9a992d 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ $(ENV)/COMPLETE: requirements.txt .PHONY: serve serve: | $(ENV)/COMPLETE - $(ENV)/bin/gunicorn --paste ./syncserver.ini + $(ENV)/bin/gunicorn --paste ./syncserver.ini --workers 1 .PHONY: clean clean: diff --git a/syncserver/management.html b/syncserver/management.html index 5700ef6..5b450fc 100644 --- a/syncserver/management.html +++ b/syncserver/management.html @@ -15,5 +15,9 @@ +

+ Most recent server requests:
+ {recent_requests} +

- \ No newline at end of file + diff --git a/syncserver/tweens.py b/syncserver/tweens.py index 47e0c47..a09de41 100644 --- a/syncserver/tweens.py +++ b/syncserver/tweens.py @@ -2,11 +2,16 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. +import collections + from pyramid import httpexceptions import syncserver.migration +RECENT_REQUESTS = collections.deque(maxlen=30) + + def interpose_migration_state_errors(handler, registry): """Tween to send errors from storage endpoint based on migration state. @@ -37,6 +42,25 @@ def interpose_migration_state_errors(handler, registry): return interpose_migration_state_errors_tween +def log_recent_requests_in_memory(handler, registry): + """Keep a log of recent requests in memory, for easy visibility. + + This is a little debugging aid for folks using the server to test + client behaviour, they can see the recent requests without having + to trawl through the server logs. + + This only really works if you have a single worker, but that's + fine for our purposes here. + """ + + def log_recent_requests_in_memory_tween(request): + RECENT_REQUESTS.appendleft("{} {}".format(request.method, request.path)) + return handler(request) + + return log_recent_requests_in_memory_tween + + def includeme(config): """Include all the SyncServer tweens into the given config.""" config.add_tween("syncserver.tweens.interpose_migration_state_errors") + config.add_tween("syncserver.tweens.log_recent_requests_in_memory") diff --git a/syncserver/views.py b/syncserver/views.py index 5334315..e6ac59a 100644 --- a/syncserver/views.py +++ b/syncserver/views.py @@ -33,6 +33,7 @@ from pyramid.response import Response from pyramid.interfaces import IAuthenticationPolicy import syncserver.migration +import syncserver.tweens # A GET on / returns a simple management interface, # while POST requests control the state of the server. @@ -46,7 +47,8 @@ def _management(request): with open(src) as f: content = f.read() content = content.format( - migration_state=request.registry["MigrationStateManager"].current_state_name() + migration_state=request.registry["MigrationStateManager"].current_state_name(), + recent_requests="
".join(syncserver.tweens.RECENT_REQUESTS), ) return Response(content, content_type="text/html")