added prometheus metrics exporter
This commit is contained in:
parent
b173068a76
commit
5cb6f87445
6 changed files with 51 additions and 1 deletions
|
@ -67,6 +67,7 @@ RUN --mount=type=cache,target=/pip-cache \
|
||||||
-r requirements/memcached.txt \
|
-r requirements/memcached.txt \
|
||||||
-r requirements/rsvg.txt \
|
-r requirements/rsvg.txt \
|
||||||
-r requirements/sentry.txt \
|
-r requirements/sentry.txt \
|
||||||
|
-r requirements/metrics.txt \
|
||||||
-r requirements/server-asgi.txt && \
|
-r requirements/server-asgi.txt && \
|
||||||
pip install --cache-dir /pip-cache uwsgi
|
pip install --cache-dir /pip-cache uwsgi
|
||||||
|
|
||||||
|
|
|
@ -7,3 +7,4 @@ class MapdataConfig(AppConfig):
|
||||||
def ready(self):
|
def ready(self):
|
||||||
from c3nav.mapdata.utils.cache.changes import register_signals
|
from c3nav.mapdata.utils.cache.changes import register_signals
|
||||||
register_signals()
|
register_signals()
|
||||||
|
import c3nav.mapdata.metrics # noqa
|
||||||
|
|
30
src/c3nav/mapdata/metrics.py
Normal file
30
src/c3nav/mapdata/metrics.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
from django.conf import settings
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.core.cache import cache
|
||||||
|
|
||||||
|
from c3nav.mapdata.models.report import Report
|
||||||
|
|
||||||
|
if settings.METRCIS:
|
||||||
|
from prometheus_client import Gauge
|
||||||
|
from prometheus_client.core import REGISTRY, CounterMetricFamily
|
||||||
|
from prometheus_client.registry import Collector
|
||||||
|
|
||||||
|
users_total = Gauge('c3nav_users_total', 'Total number of users')
|
||||||
|
users_total.set_function(lambda: get_user_model().objects.count())
|
||||||
|
reports_total = Gauge('c3nav_reports_total', 'Total number of reports')
|
||||||
|
reports_total.set_function(lambda: Report.objects.count())
|
||||||
|
reports_open = Gauge('c3nav_reports_open', 'Number of open reports')
|
||||||
|
reports_open.set_function(lambda: Report.objects.filter(open=True).count()),
|
||||||
|
|
||||||
|
class APIStatsCollector(Collector):
|
||||||
|
def collect(self):
|
||||||
|
if settings.CACHES['default']['BACKEND'] == 'django.core.cache.backends.redis.RedisCache':
|
||||||
|
client = cache._cache.get_client()
|
||||||
|
for key in client.keys(f"*{settings.CACHES['default'].get('KEY_PREFIX', '')}apistats__*"):
|
||||||
|
key = key.decode('utf-8').split(':', 2)[2]
|
||||||
|
yield CounterMetricFamily(f'c3nav_{key}', key, value=cache.get(key))
|
||||||
|
|
||||||
|
def describe(self):
|
||||||
|
return list()
|
||||||
|
|
||||||
|
REGISTRY.register(APIStatsCollector())
|
|
@ -7,7 +7,6 @@ from contextlib import suppress
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
import sass
|
|
||||||
from django.contrib.messages import constants as messages
|
from django.contrib.messages import constants as messages
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string
|
||||||
|
@ -394,6 +393,19 @@ with suppress(ImportError):
|
||||||
import django_extensions # noqa
|
import django_extensions # noqa
|
||||||
INSTALLED_APPS.append('django_extensions')
|
INSTALLED_APPS.append('django_extensions')
|
||||||
|
|
||||||
|
METRCIS = config.getboolean('c3nav', 'metrics', fallback=False)
|
||||||
|
if METRCIS:
|
||||||
|
try:
|
||||||
|
import django_prometheus # noqa
|
||||||
|
INSTALLED_APPS.append('django_prometheus')
|
||||||
|
MIDDLEWARE = [
|
||||||
|
'django_prometheus.middleware.PrometheusBeforeMiddleware',
|
||||||
|
*MIDDLEWARE,
|
||||||
|
'django_prometheus.middleware.PrometheusAfterMiddleware',
|
||||||
|
]
|
||||||
|
except ImportError:
|
||||||
|
METRCIS = False
|
||||||
|
|
||||||
# Security settings
|
# Security settings
|
||||||
X_FRAME_OPTIONS = 'DENY'
|
X_FRAME_OPTIONS = 'DENY'
|
||||||
|
|
||||||
|
|
|
@ -47,3 +47,8 @@ if settings.SERVE_ANYTHING:
|
||||||
with suppress(ImportError):
|
with suppress(ImportError):
|
||||||
import debug_toolbar
|
import debug_toolbar
|
||||||
urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
|
urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
|
||||||
|
|
||||||
|
if settings.METRCIS:
|
||||||
|
with suppress(ImportError):
|
||||||
|
import django_prometheus # noqu
|
||||||
|
urlpatterns.insert(0, path('prometheus/', include('django_prometheus.urls')))
|
||||||
|
|
1
src/requirements/metrics.txt
Normal file
1
src/requirements/metrics.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
django_prometheus==2.3.1
|
Loading…
Add table
Add a link
Reference in a new issue