Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Deployment/application.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{
"server": "gunicorn",
"metrics_token": "metrics"
}
6 changes: 5 additions & 1 deletion Deployment/dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# cspell:words a2enmod gunicorn libapache2 venv virtualenv wsgi
# cspell:words gunicorn venv

FROM debian:12

Expand All @@ -18,6 +18,10 @@ COPY pip.conf /srv/application/.venv/pip.conf
# Install the application and gunicorn
RUN /srv/application/.venv/bin/python -m pip install --upgrade /srv/application/website "gunicorn ~= 23.0.0"

# Configure directory for prometheus metrics
RUN mkdir --parents /srv/prometheus
ENV PROMETHEUS_MULTIPROC_DIR=/srv/prometheus



# Open network port
Expand Down
6 changes: 6 additions & 0 deletions Deployment/gunicorn_configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import multiprocessing

from prometheus_flask_exporter.multiprocess import GunicornInternalPrometheusMetrics

from benjaminhamon_standard_extensions.logging import logging_helpers


Expand Down Expand Up @@ -41,3 +43,7 @@
}
}
}


def child_exit(server, worker): # pylint: disable = unused-argument
GunicornInternalPrometheusMetrics.mark_process_dead_on_child_exit(worker.pid)
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import functools
import logging
from typing import Callable, List
from typing import Callable, List, Optional

import flask
import jinja2
import prometheus_flask_exporter
import werkzeug.exceptions
from prometheus_flask_exporter import PrometheusMetrics
from prometheus_flask_exporter.multiprocess import GunicornInternalPrometheusMetrics

import benjaminhamon_developer_website
from benjaminhamon_developer_website.application import Application
Expand All @@ -18,13 +19,13 @@
request_logger = logging.getLogger("Request")


def create_application(metrics_token: str) -> Application:
def create_application(metrics_token: str, server: Optional[str] = None) -> Application:
flask_application = flask.Flask("benjaminhamon_developer_website")
flask_application.config.update(
METRICS_TOKEN = metrics_token,
)

prometheus_metrics = prometheus_flask_exporter.PrometheusMetrics(None, metrics_decorator = metrics_authorization)
prometheus_metrics = create_metrics(server)
application = Application(flask_application)
main_controller = MainController()

Expand All @@ -36,6 +37,14 @@ def create_application(metrics_token: str) -> Application:
return application


def create_metrics(server: Optional[str] = None) -> PrometheusMetrics:
if server is None:
return PrometheusMetrics(None, metrics_decorator = metrics_authorization)
if server == "gunicorn":
return GunicornInternalPrometheusMetrics(None, metrics_decorator = metrics_authorization)
raise ValueError("Unsupported server: '%s'" % server)


def configure(application: flask.Flask) -> None:
application.config["METADATA"] = {
"product": benjaminhamon_developer_website.__product__,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@
configuration = json.load(configuration_file)

application = application_factory.create_application(
metrics_token = configuration["metrics_token"])
metrics_token = configuration["metrics_token"],
server = configuration["server"])
Loading