diff --git a/ldvspec/docker/docker-compose-local.yml b/ldvspec/docker/docker-compose-local.yml
index 910a1dd5f9a399a7df145f356470463a5ced7722..4583f0bf882630a07397cfb276042cfcd1071d4e 100644
--- a/ldvspec/docker/docker-compose-local.yml
+++ b/ldvspec/docker/docker-compose-local.yml
@@ -21,16 +21,14 @@ services:
     restart: always
 
   ldv-spec-cache:
-    image: memcached:1.6.18
+    image: redis:latest
     container_name: ldv-spec-cache
-    entrypoint:
-      - memcached
-      - -m 16
+    command: ["redis-server", "--appendonly", "yes", "--maxmemory", "64mb"]
     ports:
-      - "11211:11211"
+      - "6379:6379"
     networks:
       - ldv_network
-    restart: always
+    restart: unless-stopped
 
   rabbitmq:
     image: rabbitmq:3-management
@@ -57,7 +55,7 @@ services:
       DJANGO_SETTINGS_MODULE: 'ldvspec.settings.local'
       DATABASE_HOST_SERVER: ldv-spec-db
       CACHE_HOST_SERVER: ldv-spec-cache
-      CACHE_HOST_PORT: 11211
+      CACHE_HOST_PORT: 6379
     env_file:
       - ../ldvspec.env
     volumes:
diff --git a/ldvspec/ldvspec.example.env b/ldvspec/ldvspec.example.env
index 5cbc386ac2952dd3d6a4f2589000be3a299a2888..96bdd0d27ac07982fe5a6ac454db1d843325e676 100755
--- a/ldvspec/ldvspec.example.env
+++ b/ldvspec/ldvspec.example.env
@@ -14,4 +14,5 @@ LOGIN_REDIRECT_URL=
 LOGOUT_REDIRECT_URL=
 KEYCLOAK_URL=
 CACHE_HOST_SERVER=
-CACHE_HOST_PORT=
\ No newline at end of file
+CACHE_HOST_PORT=
+PROMETHEUS_EXPORT_MIGRATIONS=
\ No newline at end of file
diff --git a/ldvspec/ldvspec/settings/base.py b/ldvspec/ldvspec/settings/base.py
index c494f923810e4dd04c810b33aa4575ca9194f8ca..81245d27f7d829ecd899c249adcb6ade6a2adca4 100644
--- a/ldvspec/ldvspec/settings/base.py
+++ b/ldvspec/ldvspec/settings/base.py
@@ -48,10 +48,11 @@ INSTALLED_APPS = [
     'uws',
     'crispy_forms',
     'widget_tweaks',
+    'django_prometheus',
 ]
 
-
 MIDDLEWARE = [
+    'django_prometheus.middleware.PrometheusBeforeMiddleware',
     'corsheaders.middleware.CorsMiddleware',
     'django.middleware.security.SecurityMiddleware',
     'whitenoise.middleware.WhiteNoiseMiddleware',
@@ -61,6 +62,7 @@ MIDDLEWARE = [
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
+    'django_prometheus.middleware.PrometheusAfterMiddleware',
 ]
 
 ROOT_URLCONF = 'ldvspec.urls'
@@ -189,3 +191,8 @@ ENABLE_PROFILING = False
 
 # Look and feel
 CRISPY_TEMPLATE_PACK = 'bootstrap4'
+
+# Running collectstatic with django_prometheus attempts to connect to the database
+# while settings are then not yet configured correctly.
+# A db connection is not needed when running collect static
+PROMETHEUS_EXPORT_MIGRATIONS = (os.environ.get("PROMETHEUS_EXPORT_MIGRATIONS", 'False') == 'True')
\ No newline at end of file
diff --git a/ldvspec/ldvspec/settings/ci.py b/ldvspec/ldvspec/settings/ci.py
index 2301e559dadfea21ad047e3a9b7f48aa99ef8200..eee4f3677e7a1597f2828d97be43dad128bb4114 100644
--- a/ldvspec/ldvspec/settings/ci.py
+++ b/ldvspec/ldvspec/settings/ci.py
@@ -9,7 +9,7 @@ CORS_ORIGIN_ALLOW_ALL = True
 
 DATABASES = {
     'default': {
-         'ENGINE': 'django.db.backends.postgresql_psycopg2',
+         'ENGINE': 'django_prometheus.db.backends.postgresql',
          'USER': 'postgres',
          'PASSWORD': 'atdb123',
          'NAME': 'ldv-spec-db',
@@ -20,8 +20,8 @@ DATABASES = {
 
 CACHES = {
     'default': {
-        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
-        'LOCATION': 'ldv-spec-cache:11211',
+        'BACKEND': 'django_prometheus.cache.backends.redis.RedisCache',
+        'LOCATION': 'ldv-spec-cache:6379',
     }
 }
 
diff --git a/ldvspec/ldvspec/settings/dev.py b/ldvspec/ldvspec/settings/dev.py
index f13182b4f6816dba408fd45b5816b08530b14bb9..b706c8b4ff28e3b795853b883a5fb06fcfbd6ca6 100644
--- a/ldvspec/ldvspec/settings/dev.py
+++ b/ldvspec/ldvspec/settings/dev.py
@@ -1,6 +1,7 @@
+import os
+
 from ldvspec.settings.base import *
 
-# SECURITY WARNING: don't run with debug turned on in production!
 DEV = True
 DEBUG = True
 
@@ -9,26 +10,20 @@ CORS_ORIGIN_ALLOW_ALL = True
 
 DATABASES = {
     'default': {
-         'ENGINE': 'django.db.backends.postgresql_psycopg2',
-         'USER': 'postgres',
-         'PASSWORD': 'secret',
-         'NAME': 'ldv-spec-db',
-         'HOST': 'localhost',
-         'PORT': '5433',
+        'ENGINE': 'django_prometheus.db.backends.postgresql',
+        'USER': os.environ.get("POSTGRES_USER", "postgres"),
+        'PASSWORD': os.environ.get("POSTGRES_PASSWORD", "secret"),
+        'NAME': os.environ.get("DATABASE_NAME", "ldv-spec-db"),
+        'HOST': os.environ.get("DATABASE_HOST_SERVER", "localhost"),
+        'PORT': os.environ.get("DATABASE_PORT", "5433")
     },
 }
 
-# Password validation
-# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
-
-AUTH_PASSWORD_VALIDATORS = []
-
-# bypass celery async workers
-#CELERY_TASK_ALWAYS_EAGER=True
-
 CACHES = {
     'default': {
-        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
-        'LOCATION': 'localhost:11211',
+        'BACKEND': 'django_prometheus.cache.backends.redis.RedisCache',
+        'LOCATION': f'{os.environ.get("CACHE_HOST_SERVER", "localhost")}:{os.environ.get("CACHE_HOST_PORT", "6379")}',
     }
-}
\ No newline at end of file
+}
+
+AUTH_PASSWORD_VALIDATORS = []
diff --git a/ldvspec/ldvspec/settings/docker_sdc.py b/ldvspec/ldvspec/settings/docker_sdc.py
index c79534250a77f9ff13c5e2d79ce4190e7b1abb6f..b879ed6ac10f10a1f2900c3beb52f99747679b6a 100644
--- a/ldvspec/ldvspec/settings/docker_sdc.py
+++ b/ldvspec/ldvspec/settings/docker_sdc.py
@@ -18,7 +18,7 @@ X_FRAME_OPTIONS = 'DENY'
 
 DATABASES = {
     'default': {
-        'ENGINE': 'django.db.backends.postgresql_psycopg2',
+        'ENGINE': 'django_prometheus.db.backends.postgresql',
         'NAME': os.environ['DATABASE_NAME'],
         'HOST': os.environ['DATABASE_HOST'],
         'PORT': os.environ['DATABASE_PORT'],
@@ -34,7 +34,7 @@ AUTH_PASSWORD_VALIDATORS = []
 
 CACHES = {
     'default': {
-        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
-        'LOCATION': f'{os.environ["CACHE_HOST_SERVER"]}:{os.environ["CACHE_HOST_PORT"]}',
+        'BACKEND': 'django_prometheus.cache.backends.redis.RedisCache',
+        'LOCATION': f'{os.environ.get("CACHE_HOST_SERVER")}:{os.environ.get("CACHE_HOST_PORT")}',
     }
 }
\ No newline at end of file
diff --git a/ldvspec/ldvspec/settings/local.py b/ldvspec/ldvspec/settings/local.py
index 5965838089bb0355c75087e12a2c283acab51fd6..e4f6269fe7b787a7c5b5c0e175e6c365906e469d 100644
--- a/ldvspec/ldvspec/settings/local.py
+++ b/ldvspec/ldvspec/settings/local.py
@@ -10,7 +10,7 @@ CORS_ORIGIN_ALLOW_ALL = True
 
 DATABASES = {
     'default': {
-        'ENGINE': 'django.db.backends.postgresql_psycopg2',
+        'ENGINE': 'django_prometheus.db.backends.postgresql',
         'USER': os.environ.get("POSTGRES_USER", "postgres"),
         'PASSWORD': os.environ.get("POSTGRES_PASSWORD", "secret"),
         'NAME': os.environ.get("DATABASE_NAME", "ldv-spec-db"),
@@ -21,8 +21,8 @@ DATABASES = {
 
 CACHES = {
     'default': {
-        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
-        'LOCATION': f'{os.environ.get("CACHE_HOST_SERVER", "localhost")}:{os.environ.get("CACHE_HOST_PORT", "11211")}',
+        'BACKEND': 'django_prometheus.cache.backends.redis.RedisCache',
+        'LOCATION': f'{os.environ.get("CACHE_HOST_SERVER", "localhost")}:{os.environ.get("CACHE_HOST_PORT", "6379")}',
     }
 }
 
diff --git a/ldvspec/lofardata/urls.py b/ldvspec/lofardata/urls.py
index 4c7c2258ace1f0f70bed5c482767a7286e6587c6..bda794cbe5353969e18eda413dd687bdb7af03b9 100644
--- a/ldvspec/lofardata/urls.py
+++ b/ldvspec/lofardata/urls.py
@@ -41,7 +41,10 @@ urlpatterns = [
     path('specification/dataset-size-info/<int:pk>/', WorkSpecificationDatasetSizeInfoView.as_view(), name='dataset-size-info'),
     path('specification/dataproducts/<int:pk>', DataProductViewPerSasID.as_view(), name='specification-dataproducts'),
     path('group/add/', GroupCreateUpdateView.as_view(), name='group-create'),
-    path('group/update/<int:pk>', GroupCreateUpdateView.as_view(), name='group-update')
+    path('group/update/<int:pk>', GroupCreateUpdateView.as_view(), name='group-update'),
+
+    # Prometheus
+    path('prometheus/', include("django_prometheus.urls")),
 ]
 
 if settings.ENABLE_PROFILING:
diff --git a/ldvspec/requirements/base.txt b/ldvspec/requirements/base.txt
index 2f2b13ae5b8d2ee5839bbe7567390c27b648cd90..e0ec4dc9398bc5338fbcb8539debabd05d85afa9 100644
--- a/ldvspec/requirements/base.txt
+++ b/ldvspec/requirements/base.txt
@@ -8,8 +8,10 @@ django-widget-tweaks
 django-silk
 uritemplate
 psycopg2-binary
+django-postgresql
 whitenoise
 pyyaml
 numpy
 astronauth
-pymemcache
\ No newline at end of file
+django-redis
+django_prometheus
\ No newline at end of file