aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2021-09-04 10:04:15 +0100
committerGravatar GitHub <[email protected]>2021-09-04 10:04:15 +0100
commit2ce7bdd88bb943b7a10eb409bfb1802076762541 (patch)
tree49895c3c85a2c8cec2d033b51bd0028c548a4e22
parentMerge pull request #579 from python-discord/jb3/update-k8s-path (diff)
parentMerge branch 'main' into jb3/django-prometheus (diff)
Merge pull request #575 from python-discord/jb3/django-prometheus
Add Django Prometheus
-rw-r--r--.flake82
-rw-r--r--Dockerfile5
-rw-r--r--gunicorn.conf.py10
-rwxr-xr-xmanage.py1
-rw-r--r--poetry.lock32
-rw-r--r--pydis_site/apps/home/urls.py1
-rw-r--r--pydis_site/settings.py12
-rw-r--r--pyproject.toml1
8 files changed, 60 insertions, 4 deletions
diff --git a/.flake8 b/.flake8
index 6690af3e..e665771f 100644
--- a/.flake8
+++ b/.flake8
@@ -3,7 +3,7 @@ max-line-length=100
docstring-convention=all
import-order-style=pycharm
application_import_names=pydis_site
-exclude=__pycache__, venv, .venv, **/migrations/**, .cache/
+exclude=__pycache__, venv, .venv, **/migrations/**, .cache/, gunicorn.conf.py
ignore=
B311,W503,E226,S311,T000
# Missing Docstrings
diff --git a/Dockerfile b/Dockerfile
index c07fc2e2..7d1dab74 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -26,6 +26,11 @@ COPY . .
# Set dummy variables so collectstatic can load settings.py
RUN \
+ # Set BUILDING_DOCKER to anything but undefined so settings.py
+ # does not insert django_prometheus into the list of installed apps.
+ # This prevents django_prometheus from attempting to connect to the database
+ # when the collectstatic task is ran.
+ BUILDING_DOCKER=yes \
SECRET_KEY=dummy_value \
DATABASE_URL=postgres://localhost \
METRICITY_DB_URL=postgres://localhost \
diff --git a/gunicorn.conf.py b/gunicorn.conf.py
new file mode 100644
index 00000000..4930ae5b
--- /dev/null
+++ b/gunicorn.conf.py
@@ -0,0 +1,10 @@
+"""
+Configuration file for gunicorn.
+
+Code taken from https://github.com/prometheus/client_python#multiprocess-mode-eg-gunicorn
+"""
+from prometheus_client import multiprocess
+
+
+def child_exit(server, worker) -> None:
+ multiprocess.mark_process_dead(worker.pid)
diff --git a/manage.py b/manage.py
index a7413ed9..66ad26f4 100755
--- a/manage.py
+++ b/manage.py
@@ -179,6 +179,7 @@ class SiteManager:
"-w", "2",
"--statsd-host", "graphite.default.svc.cluster.local:8125",
"--statsd-prefix", "site",
+ "--config", "file:gunicorn.conf.py"
]
# Run gunicorn for the production server.
diff --git a/poetry.lock b/poetry.lock
index 76c8890b..8e66cb57 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -158,6 +158,17 @@ optional = false
python-versions = ">=3.5"
[[package]]
+name = "django-prometheus"
+version = "2.1.0"
+description = "Django middlewares to monitor your application with Prometheus.io."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+prometheus-client = ">=0.7"
+
+[[package]]
name = "django-simple-bulma"
version = "2.2.0"
description = "Django application to add the Bulma CSS framework and its extensions"
@@ -456,6 +467,17 @@ toml = "*"
virtualenv = ">=20.0.8"
[[package]]
+name = "prometheus-client"
+version = "0.11.0"
+description = "Python client for the Prometheus monitoring system."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.extras]
+twisted = ["twisted"]
+
+[[package]]
name = "psutil"
version = "5.8.0"
description = "Cross-platform lib for process and system monitoring in Python."
@@ -706,7 +728,7 @@ brotli = ["brotli"]
[metadata]
lock-version = "1.1"
python-versions = "3.9.*"
-content-hash = "741444c18250124e2d998506b0643fb26240d7481389a13648b02fa1794435e3"
+content-hash = "cb345745569d389fcb35f72e34d65c1f9e860f110e521d2f634286bc9127ea2f"
[metadata.files]
appdirs = [
@@ -819,6 +841,10 @@ django-hosts = [
{file = "django-hosts-4.0.tar.gz", hash = "sha256:59a870d453f113c889a7888bae5408888870350e83e362740f382dad569c2281"},
{file = "django_hosts-4.0-py2.py3-none-any.whl", hash = "sha256:136ac225f34e7f2c007294441a38663ec2bba9637d870ad001def81bca87e390"},
]
+django-prometheus = [
+ {file = "django-prometheus-2.1.0.tar.gz", hash = "sha256:dd3f8da1399140fbef5c00d1526a23d1ade286b144281c325f8e409a781643f2"},
+ {file = "django_prometheus-2.1.0-py2.py3-none-any.whl", hash = "sha256:c338d6efde1ca336e90c540b5e87afe9287d7bcc82d651a778f302b0be17a933"},
+]
django-simple-bulma = [
{file = "django-simple-bulma-2.2.0.tar.gz", hash = "sha256:dfc34839e050d5e4749498806ed7ee8c77794021efa54ab224a2de925c644fea"},
{file = "django_simple_bulma-2.2.0-py3-none-any.whl", hash = "sha256:38530d787b2b6a091b480f7cbb8841a3b3709733ebfa5e543ae339c3d8fece03"},
@@ -935,6 +961,10 @@ pre-commit = [
{file = "pre_commit-2.12.1-py2.py3-none-any.whl", hash = "sha256:70c5ec1f30406250b706eda35e868b87e3e4ba099af8787e3e8b4b01e84f4712"},
{file = "pre_commit-2.12.1.tar.gz", hash = "sha256:900d3c7e1bf4cf0374bb2893c24c23304952181405b4d88c9c40b72bda1bb8a9"},
]
+prometheus-client = [
+ {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"},
+ {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"},
+]
psutil = [
{file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"},
{file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"},
diff --git a/pydis_site/apps/home/urls.py b/pydis_site/apps/home/urls.py
index 1e2af8f3..bb77220b 100644
--- a/pydis_site/apps/home/urls.py
+++ b/pydis_site/apps/home/urls.py
@@ -7,6 +7,7 @@ app_name = 'home'
urlpatterns = [
path('', HomeView.as_view(), name='home'),
path('', include('pydis_site.apps.redirect.urls')),
+ path('', include('django_prometheus.urls')),
path('admin/', admin.site.urls),
path('resources/', include('pydis_site.apps.resources.urls')),
path('pages/', include('pydis_site.apps.content.urls')),
diff --git a/pydis_site/settings.py b/pydis_site/settings.py
index 7df7ad85..6f49763b 100644
--- a/pydis_site/settings.py
+++ b/pydis_site/settings.py
@@ -23,7 +23,8 @@ from pydis_site.constants import GIT_SHA
env = environ.Env(
DEBUG=(bool, False),
- SITE_DSN=(str, "")
+ SITE_DSN=(str, ""),
+ BUILDING_DOCKER=(bool, False)
)
sentry_sdk.init(
@@ -84,10 +85,15 @@ INSTALLED_APPS = [
'django_filters',
'django_simple_bulma',
'rest_framework',
- 'rest_framework.authtoken'
+ 'rest_framework.authtoken',
]
+if not env("BUILDING_DOCKER"):
+ INSTALLED_APPS.append("django_prometheus")
+
+# Ensure that Prometheus middlewares are first and last here.
MIDDLEWARE = [
+ 'django_prometheus.middleware.PrometheusBeforeMiddleware',
'django_hosts.middleware.HostsRequestMiddleware',
'django.middleware.security.SecurityMiddleware',
@@ -100,7 +106,9 @@ MIDDLEWARE = [
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django_hosts.middleware.HostsResponseMiddleware',
+ 'django_prometheus.middleware.PrometheusAfterMiddleware'
]
+
ROOT_URLCONF = 'pydis_site.urls'
TEMPLATES = [
diff --git a/pyproject.toml b/pyproject.toml
index 5bbf86ee..c99f1e0b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -21,6 +21,7 @@ gunicorn = "~=20.0.4"
sentry-sdk = "~=0.19"
markdown = "~=3.3.4"
python-frontmatter = "~=1.0"
+django-prometheus = "~=2.1"
[tool.poetry.dev-dependencies]
coverage = "~=5.0"