Fehler-Monitoring für Odoo.
Odoo schreibt jeden Serverfehler ins Log. Mit sentry-sdk und einem kleinen Modul landen diese Fehler mit Traceback in Fehlo, aus allen Datenbanken und auch aus geplanten Aktionen.
Stand: 24.10.2026, sentry-sdk 2.73.0, Odoo 16 bis 19. Das Python-SDK haben wir am 19.10.2026 mit Fehlo getestet. Den Weg durch Odoo haben wir aus dem Quelltext von Odoo abgeleitet, nicht in einer laufenden Instanz geprüft.
Wie Odoo Fehler meldet
Für Odoo gibt es keine eigene Integration im sentry-SDK, und sie ist auch nicht nötig. Odoo fängt Ausnahmen in Anfragen selbst ab (odoo/http.py) und schreibt sie als ERROR ins Log, mit der Meldung „Exception during request handling.“ und dem Traceback. Die Logging-Integration des SDK ist ab Werk aktiv und macht aus jedem ERROR-Eintrag ein Ereignis. Gescheiterte geplante Aktionen (Cron) landen auf demselben Weg in Fehlo. UserError und AccessError loggt Odoo nur als Warnung; sie erscheinen als Breadcrumbs, nicht als eigene Fehler. Das ist gewollt: „Bitte Pflichtfeld ausfüllen“ ist kein Bug.
Es reicht also, das SDK früh zu starten. Am einfachsten geht das mit einem kleinen eigenen Modul.
1. Paket installieren
# Python 3.12 or newer
pip install sentry-sdk
# Python 3.10 or 3.11: Odoo pins urllib3 1.26.5, sentry-sdk 2.x needs 1.26.11 or newer
pip install sentry-sdk "urllib3>=1.26.11,<1.27"Odoo pinnt in seiner requirements.txt für Python 3.10 und 3.11 eine alte urllib3-Version, die sentry-sdk 2.x nicht reicht. Die zweite Zeile hebt sie innerhalb der 1.26-Reihe an, mit der Odoos requests zurechtkommt.
2. Modul anlegen
Leg in deinem Addons-Pfad einen Ordner fehlo_sentry mit zwei Dateien an. Den Versionsstring passt du an deine Odoo-Version an.
{
"name": "Fehlo Error Reporting",
"version": "18.0.1.0.0",
"summary": "Send server errors to Fehlo",
"license": "LGPL-3",
"depends": ["base"],
"external_dependencies": {"python": ["sentry_sdk"]},
"post_load": "post_load",
"installable": True,
}import logging
import os
_logger = logging.getLogger(__name__)
DSN = "https://<key>@app.fehlo.de/<project-id>"
def post_load():
try:
import sentry_sdk
except ImportError:
_logger.warning("sentry-sdk is not installed, error reporting is off")
return
sentry_sdk.init(
dsn=os.environ.get("SENTRY_DSN", DSN),
environment=os.environ.get("SENTRY_ENVIRONMENT", "production"),
release=os.environ.get("SENTRY_RELEASE"),
)Der post_load-Hook läuft, sobald Odoo das Modul lädt, vor jeder Anfrage. Den DSN kannst du statt im Code als Umgebungsvariable SENTRY_DSN setzen, Release und Umgebung als SENTRY_RELEASE und SENTRY_ENVIRONMENT.
3. Modul laden
Am besten als serverweites Modul in der odoo.conf. Dann startet das SDK mit dem Server und erfasst Fehler aller Datenbanken, auch mit --workers:
[options]
server_wide_modules = base,web,fehlo_sentryAlternativ installierst du das Modul in einer Datenbank über Apps. Dann startet das SDK, sobald Odoo die Registry dieser Datenbank lädt.
Odoo.sh: Pakete aus einer requirements.txt im Wurzelverzeichnis deines Repositories installiert Odoo.sh selbst. Trag dort sentry-sdk ein. Einen dokumentierten Weg, auf Odoo.sh server_wide_modules oder Umgebungsvariablen zu setzen, haben wir nicht gefunden. Installier das Modul dort deshalb in der Datenbank und trag den DSN im Modul ein.
4. Testen
Schalte den Entwicklermodus ein und leg unter Einstellungen, Technisch, Aktionen eine Serveraktion an:
# Settings > Technical > Actions > Server Actions (developer mode)
# Type "Execute Code", code:
1 / 0Führ sie aus. Odoo zeigt dir eine Fehlermeldung, und in Fehlo erscheint ein Fehler „Exception during request handling.“ mit dem Traceback.
Alternative: das OCA-Modul „sentry“
Die Odoo Community Association pflegt im Repository OCA/server-tools ein Modul sentry für die Versionen 16.0 bis 19.0. Es wird serverweit geladen und über Schlüssel in der odoo.conf eingestellt:
[options]
server_wide_modules = base,web,sentry
sentry_dsn = https://<key>@app.fehlo.de/<project-id>
sentry_enabled = true
sentry_environment = production
sentry_logging_level = error
sentry_include_context = falseWas du dabei wissen solltest:
- Die Zweige 16.0 und 17.0 verlangen
sentry-sdkbis Version 1.9.0. Mit einem aktuellen SDK 2.x laufen sie nicht. 18.0 und 19.0 verlangen 2.0 bis 2.22. - Ab 19.0 stehen die Schlüssel in einem eigenen Abschnitt
[sentry]statt unter[options]. sentry_include_contextist standardmäßig an und schickt den Login des Nutzers (als E-Mail-Feld), seine ID, alle Request-Header und die IP-Adresse mit. Setz es auffalse, wenn du das nicht brauchst.- Beim Start sendet das Modul ein Ereignis „Starting Odoo Server“. Das ist zugleich dein Test.
Wenn du ohnehin OCA-Module einsetzt und eine Version mit passendem SDK hast, ist das ein guter Weg. Sonst ist das eigene Modul oben kürzer und funktioniert mit dem aktuellen SDK auf allen Versionen.
Datenschutz
Ohne weitere Optionen sendet das Python-SDK keine IP-Adressen, keine Cookies und keine Nutzerdaten. Setz data_collection nicht: Sobald es gesetzt ist, gelten dessen freizügigere Standards, und das SDK sendet IP-Adressen, Cookies und Bodies mit. Fehlo entfernt die IP-Adresse des Absenders zusätzlich auf dem Server und filtert E-Mail-Adressen, Passwörter und Tokens aus den Ereignissen. Lokale Variablen aus dem Traceback kommen mit; sie enthalten bei Odoo oft Datensätze. Mehr dazu unter Error Tracking und DSGVO.
Häufige Fragen
Erfasst das auch Fehler aus geplanten Aktionen?
Ja. Odoo loggt gescheiterte Cron-Jobs mit Traceback als ERROR, und die Logging-Integration des SDK macht daraus ein Ereignis.
Warum sehe ich UserError-Meldungen nicht als Fehler?
Odoo loggt UserError und AccessError nur als Warnung. Das SDK meldet ab ERROR. Die Warnungen erscheinen als Breadcrumbs vor dem nächsten echten Fehler.
Funktioniert das mit mehreren Datenbanken auf einem Server?
Ja, wenn du das Modul serverweit lädst. Alle Datenbanken melden dann an dasselbe Fehlo-Projekt. Das SDK läuft einmal pro Odoo-Prozess, getrennte Projekte pro Datenbank brauchen getrennte Odoo-Instanzen.
Es kommt nichts an. Was prüfe ich?
Erstens den DSN: Er muss auf app.fehlo.de zeigen. Zweitens, ob dein Server oder Browser https://app.fehlo.de erreicht (Firewall, Proxy, Werbeblocker). Drittens, ob dein Kontingent für den Monat aufgebraucht ist; dann bekommst du eine Mail. Viertens, ob sampleRate oder beforeSend Ereignisse verwirft. Fehlen nur Performance-Daten, sind vielleicht die Transaktionen des Monats aufgebraucht.