.. highlight:: ini

.. _`maintainance`:

Backups and Monitoring
======================

If you host your own pretix instance, you also need to care about the availability
of your service and the safety of your data yourself. This page gives you some
information that you might need to do so properly.

.. _`backups`:

Backups
-------

There are essentially two things which you should create backups of:

Database
    Your SQL database. This is critical and you should **absolutely always create automatic
    backups of your database**. There are tons of tutorials on the internet on how to do this,
    and the exact process depends on the choice of your database. For PostgreSQL, see the
    ``pg_dump`` tool. You probably want to create a cronjob that does the backups for you on a
    regular schedule.

Data directory
    The data directory of your pretix configuration might contain some things that you should
    back up. If you did not specify a secret in your config file, back up the ``.secret`` text
    file in the data directory. If you lose your secret, all currently active user sessions,
    password reset links and similar things will be rendered invalid. Also, you probably want
    to backup the ``media`` subdirectory of the data directory which contains all user-uploaded
    and generated files. This includes files you could in theory regenerate (ticket downloads)
    but also files that you might be legally required to keep (invoice PDFs) or files that you
    would need to re-upload (event logos, product pictures, etc.). It is up to you if you
    create regular backups of this data, but we strongly advise you to do so. You can create
    backups e.g. using ``rsync``. There is a lot of information on the internet on how to create
    backups of folders on a Linux machine.

There is no need to create backups of the redis database, if you use it. We only use it for
non-critical, temporary or cached data.

Uptime monitoring
-----------------

To monitor whether your pretix instance is running, you can issue a GET request to
``https://pretix.mydomain.com/healthcheck/``. This endpoint tests if the connection to the
database, to the configured cache and to redis (if used) is working correctly. If everything
appears to work fine, an empty response with status code ``200`` is returned.
If there is a problem, a status code in the ``5xx`` range will be returned.

.. _`perf-monitoring`:

Performance monitoring
----------------------

If you want to generate detailed performance statistics of your pretix installation, there is an
endpoint at ``https://pretix.mydomain.com/metrics`` (no slash at the end) which returns a
number of values in the text format understood by monitoring tools like Prometheus_. This data
is only collected and exposed if you enable it in the :ref:`metrics-settings` section of your
pretix configuration. You can also configure basic auth credentials there to protect your
statistics against unauthorized access. The data is temporarily collected in redis, so the
performance impact of this feature depends on the connection to your redis database.

Currently, mostly response times of HTTP requests and background tasks are exposed.

If you want to go even further, you can set the ``profile`` option in the :ref:`django-settings`
section to a value between 0 and 1. If you set it for example to 0.1, then 10% of your requests
(randomly selected) will be run with cProfile_ activated. The profiling results will be saved
to your data directory. As this might impact performance significantly and writes a lot of data
to disk, we recommend to only enable it for a small number of requests -- and only if you are
really interested in the results.

Available metrics
^^^^^^^^^^^^^^^^^

The metrics available in pretix follow the standard `metric types`_ from the Prometheus world.
Currently, the following metrics are exported:

pretix_view_requests_total
    Counter. Counts requests to Django views, labeled with the resolved ``url_name``, the used
    HTTP ``method`` and the ``status_code`` returned.

pretix_view_durations_seconds
    Histogram. Measures duration of requests to Django views, labeled with the resolved
    ``url_name``, the used HTTP ``method`` and the ``status_code`` returned.

pretix_task_runs_total
    Counter. Counts executions of background tasks, labeled with the ``task_name`` and the
    ``status``. The latter can be ``success``, ``error`` or ``expected-error``.

pretix_task_duration_seconds
    Histogram. Measures duration of successful background task executions, labeled with the
    ``task_name``.

pretix_model_instances
    Gauge. Measures number of instances of a certain model within the database, labeled with
    the ``model`` name. Starting with pretix 3.11, these numbers might only be approximate for
    most tables when running on PostgreSQL to mitigate performance impact.

pretix_celery_tasks_queued_count
    The number of background tasks in the worker queue, labeled with ``queue``.

pretix_celery_tasks_queued_age_seconds
    The age of the longest-waiting in the worker queue in seconds, labeled with ``queue``.

.. _metric types: https://prometheus.io/docs/concepts/metric_types/
.. _Prometheus: https://prometheus.io/
.. _cProfile: https://docs.python.org/3/library/profile.html
