diff --git a/Dockerfile b/Dockerfile index fc85f98..df92201 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ ENV FLASK_APP formity ENV FLASK_ENV production COPY . . - +ENV prometheus_multiproc_dir /tmp STOPSIGNAL SIGINT USER uwsgi CMD flask db upgrade && exec uwsgi --http-socket 0.0.0.0:5000 \ diff --git a/formity/__init__.py b/formity/__init__.py index 0e617b6..0d99ba5 100644 --- a/formity/__init__.py +++ b/formity/__init__.py @@ -1,6 +1,6 @@ import flask from formity.admin import IndexView -from formity.extensions import db, migrate, admin, auth, babel +from formity.extensions import db, migrate, admin, auth, babel, metrics def create_app(): app = flask.Flask( @@ -16,6 +16,7 @@ def create_app(): migrate.init_app(app, db) babel.init_app(app) auth.init_app(app) + metrics.init_app(app) import formity.views import formity.models diff --git a/formity/extensions.py b/formity/extensions.py index 35d2382..a6fb8df 100644 --- a/formity/extensions.py +++ b/formity/extensions.py @@ -3,6 +3,7 @@ import flask_sqlalchemy import flask_migrate import flask_admin import flask_babel +import prometheus_flask_exporter import spaceauth from flask_admin.contrib.sqla import ModelView as BaseModelView @@ -27,3 +28,4 @@ migrate = flask_migrate.Migrate() admin = flask_admin.Admin(template_mode='bootstrap3') babel = flask_babel.Babel() auth = spaceauth.SpaceAuth() +metrics = prometheus_flask_exporter.PrometheusMetrics(None, group_by='url_rule') diff --git a/formity/forms.py b/formity/forms.py index 6d63629..ca7ca02 100644 --- a/formity/forms.py +++ b/formity/forms.py @@ -1,6 +1,7 @@ from flask_wtf import FlaskForm from wtforms import StringField, BooleanField, TextAreaField, IntegerField, validators, ValidationError from wtforms.widgets import html5 +from jinja2 import Markup class FaceshieldRequestForm(FlaskForm): @@ -15,7 +16,7 @@ class FaceshieldRequestForm(FlaskForm): faceshield_full_required = IntegerField('Pilnie potrzebna minimalna ilość pełnych przyłbic', default=0, validators=[validators.InputRequired()], widget=html5.NumberInput()) - rules_approval = BooleanField('Jestem z placówki medycznej i zobowiązuję się do nieodsprzedawania otrzymanego sprzętu ochronnego. Jestem świadom, że nie jest to certyfikowany produkt medyczny i nie jest dezynfekowany/sterylny.', validators=[validators.DataRequired()]) + rules_approval = BooleanField(Markup('Jestem pracownikiem powyższej placówki medycznej i zobowiązuję się do nieodsprzedawania otrzymanego sprzętu ochronnego. Jestem świadom, że nie jest to certyfikowany produkt medyczny i nie jest dezynfekowany/sterylny.'), validators=[validators.DataRequired()]) def validate_faceshield_model(self, field): model = field.data.strip() diff --git a/requirements.txt b/requirements.txt index 04f7a49..7bd6dce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,6 +21,8 @@ Mako==1.1.2 MarkupSafe==1.1.1 marshmallow==3.5.1 oauthlib==2.1.0 +prometheus-client==0.7.1 +prometheus-flask-exporter==0.13.0 python-dateutil==2.8.1 python-dotenv==0.12.0 python-editor==1.0.4