|
1 | 1 | import enum |
2 | 2 |
|
| 3 | +import sentry_sdk |
3 | 4 | from sentry_sdk.integrations import Integration, DidNotEnable |
4 | 5 | from sentry_sdk.integrations.logging import ( |
5 | 6 | BreadcrumbHandler, |
6 | 7 | EventHandler, |
7 | 8 | SentryLogsHandler, |
8 | 9 | _BaseHandler, |
| 10 | + _python_level_to_otel, |
9 | 11 | ) |
10 | 12 |
|
11 | 13 | from typing import TYPE_CHECKING |
@@ -124,8 +126,54 @@ class LoguruBreadcrumbHandler(_LoguruBaseHandler, BreadcrumbHandler): |
124 | 126 | pass |
125 | 127 |
|
126 | 128 |
|
127 | | -class LoguruSentryLogsHandler(_LoguruBaseHandler, SentryLogsHandler): |
| 129 | +def _loguru_level_to_otel(record_level): |
| 130 | + # type: (int) -> Tuple[int, str] |
| 131 | + for py_level, otel_severity_number, otel_severity_text in [ |
| 132 | + (50, 21, "fatal"), |
| 133 | + (40, 17, "error"), |
| 134 | + (30, 13, "warn"), |
| 135 | + (25, 11, "info"), # Loguru's success |
| 136 | + (20, 9, "info"), |
| 137 | + (10, 5, "debug"), |
| 138 | + (5, 1, "trace"), |
| 139 | + ]: |
| 140 | + if record_level >= py_level: |
| 141 | + return otel_severity_number, otel_severity_text |
| 142 | + return 0, "default" |
| 143 | + |
| 144 | + |
| 145 | +class LoguruSentryLogsHandler(_LoguruBaseHandler): |
128 | 146 | """Modified version of :class:`sentry_sdk.integrations.logging.SentryLogsHandler` to use loguru's level names.""" |
| 147 | + def emit(self, record): |
| 148 | + client = sentry_sdk.get_client() |
| 149 | + |
| 150 | + if not client.is_active(): |
| 151 | + return |
| 152 | + |
| 153 | + if not client.options["_experiments"].get("enable_logs", False): |
| 154 | + return |
| 155 | + |
| 156 | + print('rec', record) |
| 157 | + print('strofrec', str(record)) |
| 158 | + |
| 159 | + self._capture_log_from_record(client, record) |
| 160 | + |
129 | 161 | def _capture_log_from_record(self, client, record): |
130 | 162 | # type: (BaseClient, LogRecord) |
131 | | - return super()._capture_log_from_record(client, record) |
| 163 | + scope = sentry_sdk.get_current_scope() |
| 164 | + |
| 165 | + otel_severity_number, otel_severity_text = _python_level_to_otel(record.levelno) |
| 166 | + |
| 167 | + attrs = {} |
| 168 | + |
| 169 | + client._capture_experimental_log( |
| 170 | + scope, |
| 171 | + { |
| 172 | + "severity_text": otel_severity_text, |
| 173 | + "severity_number": otel_severity_number, |
| 174 | + "body": record.msg, |
| 175 | + "attributes": attrs, |
| 176 | + "time_unix_nano": int(record.created * 1e9), |
| 177 | + "trace_id": None, |
| 178 | + }, |
| 179 | + ) |
0 commit comments