Skip to content

Commit 14a413e

Browse files
committed
[IMP] sentry: adds an option to use sentry's structured log feature
1 parent e1ffc79 commit 14a413e

File tree

4 files changed

+38
-0
lines changed

4 files changed

+38
-0
lines changed

sentry/hooks.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ def initialize_sentry(config):
128128
# Remove logging_level, since in sentry_sdk is include in 'integrations'
129129
del options["logging_level"]
130130

131+
if config.get("sentry_enable_logs", False):
132+
options["enable_logs"] = True
133+
131134
client = sentry_sdk.init(**options)
132135

133136
sentry_sdk.set_tag("include_context", config.get("sentry_include_context", True))

sentry/readme/CONFIGURE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ options:
1919
sentry_enabled = true
2020
sentry_logging_level = warn
2121
sentry_exclude_loggers = werkzeug
22+
sentry_enable_logs = true
2223
sentry_ignore_exceptions = odoo.exceptions.AccessDenied,
2324
odoo.exceptions.AccessError,odoo.exceptions.MissingError,
2425
odoo.exceptions.RedirectWarning,odoo.exceptions.UserError,

sentry/static/description/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ <h3><a class="toc-backref" href="#toc-entry-3">Example Odoo configuration</a></h
432432
sentry_enabled = true
433433
sentry_logging_level = warn
434434
sentry_exclude_loggers = werkzeug
435+
sentry_enable_logs = true
435436
sentry_ignore_exceptions = odoo.exceptions.AccessDenied,
436437
odoo.exceptions.AccessError,odoo.exceptions.MissingError,
437438
odoo.exceptions.RedirectWarning,odoo.exceptions.UserError,

sentry/tests/test_client.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ def has_event(self, event_level, event_msg):
5353
return event
5454
return False
5555

56+
def has_log_item(self, log_level: str, log_msg: str) -> bool:
57+
for envelope in self.envelopes:
58+
log_items = filter(lambda envelope_item: envelope_item.data_category == "log_item", envelope.items)
59+
payload_items = []
60+
for item in log_items:
61+
payload_items.extend(item.payload.json["items"])
62+
if any(
63+
(item["level"] == log_level and item["body"] == log_msg) for item in payload_items
64+
):
65+
return True
66+
67+
return False
68+
5669
def flush(self, *args, **kwargs):
5770
pass
5871

@@ -123,6 +136,13 @@ def assertEventNotCaptured(self, client, event_level, event_msg):
123136
msg=f"Event: {event_msg} was captured",
124137
)
125138

139+
def assertLogCaptured(self, client, log_level: str, log_msg: str):
140+
client.flush()
141+
self.assertTrue(
142+
client.transport.has_log_item(log_level, log_msg),
143+
msg=f"Log item: {log_msg} was not captured",
144+
)
145+
126146
def test_initialize_raven_sets_dsn(self):
127147
self.assertEqual(self.client.dsn, self.dsn)
128148

@@ -224,6 +244,19 @@ def test_exclude_logger(self):
224244
remove_handler_ignore(self.logger.name)
225245
self.assertEventNotCaptured(client, level, msg)
226246

247+
def test_enable_logs(self):
248+
self.patch_config(
249+
{
250+
"sentry_enable_logs": True,
251+
}
252+
)
253+
client = initialize_sentry(config)._client
254+
client.transport = InMemoryTransport({"dsn": self.dsn})
255+
level, msg = logging.WARNING, "Test log sending is enabled"
256+
self.log(level, msg)
257+
level = "warn"
258+
self.assertLogCaptured(client, level, msg)
259+
227260
def test_invalid_logging_level(self):
228261
self.patch_config(
229262
{

0 commit comments

Comments
 (0)