-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by moylop260
- Loading branch information
Showing
28 changed files
with
1,862 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,3 +3,4 @@ astor | |
dataclasses | ||
odoorpc | ||
openupgradelib | ||
sentry_sdk>=2.0.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,194 @@ | ||
====== | ||
Sentry | ||
====== | ||
|
||
.. | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
!! This file is generated by oca-gen-addon-readme !! | ||
!! changes will be overwritten. !! | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
!! source digest: sha256:fb1e0787f353def76b80f3aae5948d0b7a9b01d35f2f738a5b96fa28588bab0e | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png | ||
:target: https://odoo-community.org/page/development-status | ||
:alt: Beta | ||
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png | ||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html | ||
:alt: License: AGPL-3 | ||
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github | ||
:target: https://github.com/OCA/server-tools/tree/18.0/sentry | ||
:alt: OCA/server-tools | ||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png | ||
:target: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-0-sentry | ||
:alt: Translate me on Weblate | ||
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png | ||
:target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=18.0 | ||
:alt: Try me on Runboat | ||
|
||
|badge1| |badge2| |badge3| |badge4| |badge5| | ||
|
||
This module allows painless `Sentry <https://sentry.io/>`__ integration | ||
with Odoo. | ||
|
||
**Table of contents** | ||
|
||
.. contents:: | ||
:local: | ||
|
||
Installation | ||
============ | ||
|
||
The module can be installed just like any other Odoo module, by adding | ||
the module's directory to Odoo *addons_path*. In order for the module to | ||
correctly wrap the Odoo WSGI application, it also needs to be loaded as | ||
a server-wide module. This can be done with the ``server_wide_modules`` | ||
parameter in your Odoo config file or with the ``--load`` command-line | ||
parameter. | ||
|
||
This module additionally requires the sentry-sdk Python package to be | ||
available on the system. It can be installed using pip: | ||
|
||
:: | ||
|
||
pip install sentry-sdk | ||
|
||
Configuration | ||
============= | ||
|
||
The following additional configuration options can be added to your Odoo | ||
configuration file: | ||
|
||
[TABLE] | ||
|
||
Other `client | ||
arguments <https://docs.sentry.io/platforms/python/configuration/>`__ | ||
can be configured by prepending the argument name with *sentry\_* in | ||
your Odoo config file. Currently supported additional client arguments | ||
are: | ||
``with_locals, max_breadcrumbs, release, environment, server_name, shutdown_timeout, in_app_include, in_app_exclude, default_integrations, dist, sample_rate, send_default_pii, http_proxy, https_proxy, request_bodies, debug, attach_stacktrace, ca_certs, propagate_traces, traces_sample_rate, auto_enabling_integrations``. | ||
|
||
Example Odoo configuration | ||
-------------------------- | ||
|
||
Below is an example of Odoo configuration file with *Odoo Sentry* | ||
options: | ||
|
||
:: | ||
|
||
[options] | ||
sentry_dsn = https://<public_key>:<secret_key>@sentry.example.com/<project id> | ||
sentry_enabled = true | ||
sentry_logging_level = warn | ||
sentry_exclude_loggers = werkzeug | ||
sentry_ignore_exceptions = odoo.exceptions.AccessDenied, | ||
odoo.exceptions.AccessError,odoo.exceptions.MissingError, | ||
odoo.exceptions.RedirectWarning,odoo.exceptions.UserError, | ||
odoo.exceptions.ValidationError,odoo.exceptions.Warning, | ||
odoo.exceptions.except_orm | ||
sentry_include_context = true | ||
sentry_environment = production | ||
sentry_release = 1.3.2 | ||
sentry_odoo_dir = /home/odoo/odoo/ | ||
|
||
Usage | ||
===== | ||
|
||
Once configured and installed, the module will report any logging event | ||
at and above the configured Sentry logging level, no additional actions | ||
are necessary. | ||
|
||
|Try me on Runbot| | ||
|
||
.. |Try me on Runbot| image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas | ||
:target: https://runbot.odoo-community.org/runbot/149/14.0 | ||
|
||
Known issues / Roadmap | ||
====================== | ||
|
||
- **No database separation** -- This module functions by intercepting | ||
all Odoo logging records in a running Odoo process. This means that | ||
once installed in one database, it will intercept and report errors | ||
for all Odoo databases, which are used on that Odoo server. | ||
- **Frontend integration** -- In the future, it would be nice to add | ||
Odoo client-side error reporting to this module as well, by | ||
integrating `raven-js <https://github.com/getsentry/raven-js>`__. | ||
Additionally, `Sentry user feedback | ||
form <https://docs.sentry.io/learn/user-feedback/>`__ could be | ||
integrated into the Odoo client error dialog window to allow users | ||
shortly describe what they were doing when things went wrong. | ||
|
||
Bug Tracker | ||
=========== | ||
|
||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/issues>`_. | ||
In case of trouble, please check there if your issue has already been reported. | ||
If you spotted it first, help us to smash it by providing a detailed and welcomed | ||
`feedback <https://github.com/OCA/server-tools/issues/new?body=module:%20sentry%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. | ||
|
||
Do not contact contributors directly about support or help with technical issues. | ||
|
||
Credits | ||
======= | ||
|
||
Authors | ||
------- | ||
|
||
* Mohammed Barsi | ||
* Versada | ||
* Nicolas JEUDY | ||
* Vauxoo | ||
|
||
Contributors | ||
------------ | ||
|
||
- Mohammed Barsi <[email protected]> | ||
- Andrius Preimantas <[email protected]> | ||
- Naglis Jonaitis <[email protected]> | ||
- Atte Isopuro <[email protected]> | ||
- Florian Mounier <[email protected]> | ||
- Jon Ashton <[email protected]> | ||
- Mark Schuit <[email protected]> | ||
- Atchuthan <[email protected]> | ||
|
||
Other credits | ||
------------- | ||
|
||
- Vauxoo | ||
|
||
Maintainers | ||
----------- | ||
|
||
This module is maintained by the OCA. | ||
|
||
.. image:: https://odoo-community.org/logo.png | ||
:alt: Odoo Community Association | ||
:target: https://odoo-community.org | ||
|
||
OCA, or the Odoo Community Association, is a nonprofit organization whose | ||
mission is to support the collaborative development of Odoo features and | ||
promote its widespread use. | ||
|
||
.. |maintainer-barsi| image:: https://github.com/barsi.png?size=40px | ||
:target: https://github.com/barsi | ||
:alt: barsi | ||
.. |maintainer-naglis| image:: https://github.com/naglis.png?size=40px | ||
:target: https://github.com/naglis | ||
:alt: naglis | ||
.. |maintainer-versada| image:: https://github.com/versada.png?size=40px | ||
:target: https://github.com/versada | ||
:alt: versada | ||
.. |maintainer-moylop260| image:: https://github.com/moylop260.png?size=40px | ||
:target: https://github.com/moylop260 | ||
:alt: moylop260 | ||
.. |maintainer-fernandahf| image:: https://github.com/fernandahf.png?size=40px | ||
:target: https://github.com/fernandahf | ||
:alt: fernandahf | ||
|
||
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__: | ||
|
||
|maintainer-barsi| |maintainer-naglis| |maintainer-versada| |maintainer-moylop260| |maintainer-fernandahf| | ||
|
||
This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/18.0/sentry>`_ project on GitHub. | ||
|
||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from .hooks import post_load |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# Copyright 2016-2017 Versada <https://versada.eu/> | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||
{ | ||
"name": "Sentry", | ||
"summary": "Report Odoo errors to Sentry", | ||
"version": "18.0.1.0.0", | ||
"category": "Extra Tools", | ||
"website": "https://github.com/OCA/server-tools", | ||
"author": "Mohammed Barsi," | ||
"Versada," | ||
"Nicolas JEUDY," | ||
"Odoo Community Association (OCA)," | ||
"Vauxoo", | ||
"maintainers": ["barsi", "naglis", "versada", "moylop260", "fernandahf"], | ||
"license": "AGPL-3", | ||
"application": False, | ||
"installable": True, | ||
"external_dependencies": { | ||
"python": [ | ||
"sentry_sdk>=2.0.0", | ||
] | ||
}, | ||
"depends": [ | ||
"base", | ||
], | ||
"post_load": "post_load", | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
# Copyright 2016-2017 Versada <https://versada.eu/> | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||
import collections | ||
import logging | ||
|
||
from sentry_sdk import HttpTransport | ||
from sentry_sdk.consts import DEFAULT_OPTIONS | ||
from sentry_sdk.integrations.logging import LoggingIntegration | ||
|
||
import odoo.loglevels | ||
|
||
|
||
def split_multiple(string, delimiter=",", strip_chars=None): | ||
"""Splits :param:`string` and strips :param:`strip_chars` from values.""" | ||
if not string: | ||
return [] | ||
return [v.strip(strip_chars) for v in string.split(delimiter)] | ||
|
||
|
||
def to_int_if_defined(value): | ||
if value == "" or value is None: | ||
return | ||
return int(value) | ||
|
||
|
||
def to_float_if_defined(value): | ||
if value == "" or value is None: | ||
return | ||
return float(value) | ||
|
||
|
||
SentryOption = collections.namedtuple("SentryOption", ["key", "default", "converter"]) | ||
|
||
# Mapping of Odoo logging level -> Python stdlib logging library log level. | ||
LOG_LEVEL_MAP = { | ||
getattr(odoo.loglevels, f"LOG_{x}"): getattr(logging, x) | ||
for x in ("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG", "NOTSET") | ||
} | ||
DEFAULT_LOG_LEVEL = "warn" | ||
|
||
ODOO_USER_EXCEPTIONS = [ | ||
"odoo.exceptions.AccessDenied", | ||
"odoo.exceptions.AccessError", | ||
"odoo.exceptions.DeferredException", | ||
"odoo.exceptions.MissingError", | ||
"odoo.exceptions.RedirectWarning", | ||
"odoo.exceptions.UserError", | ||
"odoo.exceptions.ValidationError", | ||
"odoo.exceptions.Warning", | ||
"odoo.exceptions.except_orm", | ||
] | ||
DEFAULT_IGNORED_EXCEPTIONS = ",".join(ODOO_USER_EXCEPTIONS) | ||
|
||
EXCLUDE_LOGGERS = ("werkzeug",) | ||
DEFAULT_EXCLUDE_LOGGERS = ",".join(EXCLUDE_LOGGERS) | ||
|
||
DEFAULT_ENVIRONMENT = "develop" | ||
|
||
DEFAULT_TRANSPORT = "threaded" | ||
|
||
|
||
def select_transport(name=DEFAULT_TRANSPORT): | ||
return { | ||
"threaded": HttpTransport, | ||
}.get(name, HttpTransport) | ||
|
||
|
||
def get_sentry_logging(level=DEFAULT_LOG_LEVEL): | ||
if level not in LOG_LEVEL_MAP: | ||
level = DEFAULT_LOG_LEVEL | ||
|
||
return LoggingIntegration( | ||
# Gather warnings into breadcrumbs regardless of actual logging level | ||
level=logging.WARNING, | ||
event_level=LOG_LEVEL_MAP[level], | ||
) | ||
|
||
|
||
def get_sentry_options(): | ||
return [ | ||
SentryOption("dsn", "", str.strip), | ||
SentryOption("transport", DEFAULT_OPTIONS["transport"], select_transport), | ||
SentryOption("logging_level", DEFAULT_LOG_LEVEL, get_sentry_logging), | ||
SentryOption( | ||
"include_local_variables", DEFAULT_OPTIONS["include_local_variables"], None | ||
), | ||
SentryOption( | ||
"max_breadcrumbs", DEFAULT_OPTIONS["max_breadcrumbs"], to_int_if_defined | ||
), | ||
SentryOption("release", DEFAULT_OPTIONS["release"], None), | ||
SentryOption("environment", DEFAULT_OPTIONS["environment"], None), | ||
SentryOption("server_name", DEFAULT_OPTIONS["server_name"], None), | ||
SentryOption("shutdown_timeout", DEFAULT_OPTIONS["shutdown_timeout"], None), | ||
SentryOption("integrations", DEFAULT_OPTIONS["integrations"], None), | ||
SentryOption( | ||
"in_app_include", DEFAULT_OPTIONS["in_app_include"], split_multiple | ||
), | ||
SentryOption( | ||
"in_app_exclude", DEFAULT_OPTIONS["in_app_exclude"], split_multiple | ||
), | ||
SentryOption( | ||
"default_integrations", DEFAULT_OPTIONS["default_integrations"], None | ||
), | ||
SentryOption("dist", DEFAULT_OPTIONS["dist"], None), | ||
SentryOption( | ||
"sample_rate", DEFAULT_OPTIONS["sample_rate"], to_float_if_defined | ||
), | ||
SentryOption("send_default_pii", DEFAULT_OPTIONS["send_default_pii"], None), | ||
SentryOption("http_proxy", DEFAULT_OPTIONS["http_proxy"], None), | ||
SentryOption("https_proxy", DEFAULT_OPTIONS["https_proxy"], None), | ||
SentryOption("ignore_exceptions", DEFAULT_IGNORED_EXCEPTIONS, split_multiple), | ||
SentryOption( | ||
"max_request_body_size", DEFAULT_OPTIONS["max_request_body_size"], None | ||
), | ||
SentryOption("attach_stacktrace", DEFAULT_OPTIONS["attach_stacktrace"], None), | ||
SentryOption("ca_certs", DEFAULT_OPTIONS["ca_certs"], None), | ||
SentryOption("propagate_traces", DEFAULT_OPTIONS["propagate_traces"], None), | ||
SentryOption( | ||
"traces_sample_rate", | ||
DEFAULT_OPTIONS["traces_sample_rate"], | ||
to_float_if_defined, | ||
), | ||
SentryOption( | ||
"auto_enabling_integrations", | ||
DEFAULT_OPTIONS["auto_enabling_integrations"], | ||
None, | ||
), | ||
] |
Oops, something went wrong.