-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_sentry_instrument.py
More file actions
116 lines (96 loc) · 3.75 KB
/
test_sentry_instrument.py
File metadata and controls
116 lines (96 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import copy
import logging
import typing
import pytest
import sentry_sdk
import structlog
from sentry_sdk.integrations.logging import LoggingIntegration
from lite_bootstrap.instruments.logging_instrument import LoggingConfig, LoggingInstrument
from tests.conftest import LoggingMock, SentryTestTransport
if typing.TYPE_CHECKING:
from sentry_sdk import _types as sentry_types
from lite_bootstrap.instruments.sentry_instrument import (
SentryConfig,
SentryInstrument,
enrich_sentry_event_from_structlog_log,
)
std_logger = logging.getLogger(__name__)
logger = structlog.getLogger(__name__)
@pytest.fixture
def minimal_sentry_config(sentry_mock: SentryTestTransport) -> SentryConfig:
return SentryConfig(
sentry_dsn="https://testdsn@localhost/1",
sentry_tags={"test": "test"},
sentry_additional_params={"transport": sentry_mock},
)
def test_sentry_instrument_with_raise(minimal_sentry_config: SentryConfig, sentry_mock: SentryTestTransport) -> None:
SentryInstrument(bootstrap_config=minimal_sentry_config).bootstrap()
try:
std_logger.error("some error")
assert len(sentry_mock.mock_envelopes) == 1
finally:
sentry_sdk.init()
def test_sentry_instrument_with_structlog_error(
minimal_sentry_config: SentryConfig, sentry_mock: SentryTestTransport, logging_mock: LoggingMock
) -> None:
SentryInstrument(bootstrap_config=minimal_sentry_config).bootstrap()
logging_instrument = LoggingInstrument(
bootstrap_config=LoggingConfig(
logging_unset_handlers=["uvicorn"],
logging_buffer_capacity=0,
service_debug=False,
logging_extra_processors=[logging_mock],
)
)
logging_instrument.bootstrap()
try:
logger.error("some error")
logger.error("some error, skipping sentry", skip_sentry=True)
assert len(sentry_mock.mock_envelopes) == 1
LoggingIntegration()
finally:
sentry_sdk.init()
logging_instrument.teardown()
def test_sentry_instrument_empty_dsn() -> None:
SentryInstrument(bootstrap_config=SentryConfig(sentry_dsn="")).bootstrap()
class TestSentryEnrichEventFromStructlog:
@pytest.mark.parametrize(
"event",
[
{},
{"logentry": None},
{"logentry": {}},
{"logentry": {"formatted": b""}},
{"logentry": {"formatted": ""}},
{"logentry": {"formatted": "hi"}},
{"logentry": {"formatted": "[]"}},
{"logentry": {"formatted": "[{}]"}},
{"logentry": {"formatted": "{"}, "contexts": {}},
{"logentry": {"formatted": "{}"}, "contexts": {}},
],
)
def test_skip(self, event: "sentry_types.Event") -> None:
assert enrich_sentry_event_from_structlog_log(copy.deepcopy(event), {}) == event
@pytest.mark.parametrize(
("event_before", "event_after"),
[
(
{"logentry": {"formatted": '{"event": "event name"}'}, "contexts": {}},
{"logentry": {"formatted": "event name"}, "contexts": {}},
),
(
{
"logentry": {
"formatted": '{"event": "event name", "timestamp": 1, "level": "error", "logger": "event.logger", "tracing": {}, "foo": "bar"}' # noqa: E501
},
"contexts": {},
},
{
"logentry": {"formatted": "event name"},
"contexts": {"structlog": {"foo": "bar"}},
},
),
],
)
def test_modify(self, event_before: "sentry_types.Event", event_after: "sentry_types.Event") -> None:
assert enrich_sentry_event_from_structlog_log(event_before, {}) == event_after