|
6 | 6 | ensure_integration_enabled, |
7 | 7 | parse_version, |
8 | 8 | ) |
| 9 | +from sentry_sdk.traces import StreamedSpan, SpanStatus |
9 | 10 |
|
10 | 11 | try: |
11 | 12 | from sqlalchemy.engine import Engine # type: ignore |
|
20 | 21 | from typing import Any |
21 | 22 | from typing import ContextManager |
22 | 23 | from typing import Optional |
| 24 | + from typing import Union |
23 | 25 |
|
24 | 26 | from sentry_sdk.tracing import Span |
25 | 27 |
|
@@ -96,7 +98,10 @@ def _handle_error(context: "Any", *args: "Any") -> None: |
96 | 98 | span: "Optional[Span]" = getattr(execution_context, "_sentry_sql_span", None) |
97 | 99 |
|
98 | 100 | if span is not None: |
99 | | - span.set_status(SPANSTATUS.INTERNAL_ERROR) |
| 101 | + if isinstance(span, StreamedSpan): |
| 102 | + span.status = SpanStatus.ERROR |
| 103 | + else: |
| 104 | + span.set_status(SPANSTATUS.INTERNAL_ERROR) |
100 | 105 |
|
101 | 106 | # _after_cursor_execute does not get called for crashing SQL stmts. Judging |
102 | 107 | # from SQLAlchemy codebase it does seem like any error coming into this |
@@ -132,29 +137,53 @@ def _get_db_system(name: str) -> "Optional[str]": |
132 | 137 | return None |
133 | 138 |
|
134 | 139 |
|
135 | | -def _set_db_data(span: "Span", conn: "Any") -> None: |
| 140 | +def _set_db_data(span: "Union[Span, StreamedSpan]", conn: "Any") -> None: |
136 | 141 | db_system = _get_db_system(conn.engine.name) |
137 | | - if db_system is not None: |
138 | | - span.set_data(SPANDATA.DB_SYSTEM, db_system) |
139 | | - |
140 | | - try: |
141 | | - driver = conn.dialect.driver |
142 | | - if driver: |
143 | | - span.set_data(SPANDATA.DB_DRIVER_NAME, driver) |
144 | | - except Exception: |
145 | | - pass |
| 142 | + if isinstance(span, StreamedSpan): |
| 143 | + if db_system is not None: |
| 144 | + span.set_attribute(SPANDATA.DB_SYSTEM, db_system) |
| 145 | + |
| 146 | + try: |
| 147 | + driver = conn.dialect.driver |
| 148 | + if driver: |
| 149 | + span.set_attribute(SPANDATA.DB_DRIVER_NAME, driver) |
| 150 | + except Exception: |
| 151 | + pass |
| 152 | + else: |
| 153 | + if db_system is not None: |
| 154 | + span.set_data(SPANDATA.DB_SYSTEM, db_system) |
| 155 | + |
| 156 | + try: |
| 157 | + driver = conn.dialect.driver |
| 158 | + if driver: |
| 159 | + span.set_data(SPANDATA.DB_DRIVER_NAME, driver) |
| 160 | + except Exception: |
| 161 | + pass |
146 | 162 |
|
147 | 163 | if conn.engine.url is None: |
148 | 164 | return |
149 | 165 |
|
150 | | - db_name = conn.engine.url.database |
151 | | - if db_name is not None: |
152 | | - span.set_data(SPANDATA.DB_NAME, db_name) |
153 | | - |
154 | | - server_address = conn.engine.url.host |
155 | | - if server_address is not None: |
156 | | - span.set_data(SPANDATA.SERVER_ADDRESS, server_address) |
157 | | - |
158 | | - server_port = conn.engine.url.port |
159 | | - if server_port is not None: |
160 | | - span.set_data(SPANDATA.SERVER_PORT, server_port) |
| 166 | + if isinstance(span, StreamedSpan): |
| 167 | + db_name = conn.engine.url.database |
| 168 | + if db_name is not None: |
| 169 | + span.set_attribute(SPANDATA.DB_NAME, db_name) |
| 170 | + |
| 171 | + server_address = conn.engine.url.host |
| 172 | + if server_address is not None: |
| 173 | + span.set_attribute(SPANDATA.SERVER_ADDRESS, server_address) |
| 174 | + |
| 175 | + server_port = conn.engine.url.port |
| 176 | + if server_port is not None: |
| 177 | + span.set_attribute(SPANDATA.SERVER_PORT, server_port) |
| 178 | + else: |
| 179 | + db_name = conn.engine.url.database |
| 180 | + if db_name is not None: |
| 181 | + span.set_data(SPANDATA.DB_NAME, db_name) |
| 182 | + |
| 183 | + server_address = conn.engine.url.host |
| 184 | + if server_address is not None: |
| 185 | + span.set_data(SPANDATA.SERVER_ADDRESS, server_address) |
| 186 | + |
| 187 | + server_port = conn.engine.url.port |
| 188 | + if server_port is not None: |
| 189 | + span.set_data(SPANDATA.SERVER_PORT, server_port) |
0 commit comments