search for standard sites pub-search.waow.tech
search zig blog atproto
11
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(backend): record turso errors on logfire spans

turso bad_gateway and http errors were only logged to stderr via
logfire.err(), not recorded on the otel spans. this made debugging
via logfire difficult since errors didn't show up as exceptions.

now calls span.recordError() + adds turso.status and turso.response
attributes so these errors are visible in logfire dashboard.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

zzstoatzz 0c4ad15c 8ab17899

+8
+8
backend/src/db/Client.zig
··· 151 151 .response_writer = &response_body.writer, 152 152 }) catch |err| { 153 153 logfire.err("db.query http failed: {s} | sql: {s}", .{ @errorName(err), truncateSql(sql) }); 154 + span.recordError(error.HttpError); 154 155 return error.HttpError; 155 156 }; 156 157 ··· 159 160 defer if (resp_text.len > 0) self.allocator.free(resp_text); 160 161 const resp_preview = if (resp_text.len > 200) resp_text[0..200] else resp_text; 161 162 logfire.err("db.query turso error: {} | sql: {s} | response: {s}", .{ res.status, truncateSql(sql), resp_preview }); 163 + span.recordError(error.TursoError); 164 + span.setAttribute("turso.status", @intFromEnum(res.status)); 165 + span.setAttribute("turso.response", resp_preview); 162 166 return error.TursoError; 163 167 } 164 168 ··· 201 205 .response_writer = &response_body.writer, 202 206 }) catch |err| { 203 207 logfire.err("db.batch http failed: {s} | first_sql: {s}", .{ @errorName(err), first_sql }); 208 + span.recordError(error.HttpError); 204 209 return error.HttpError; 205 210 }; 206 211 ··· 209 214 defer if (resp_text.len > 0) self.allocator.free(resp_text); 210 215 const resp_preview = if (resp_text.len > 200) resp_text[0..200] else resp_text; 211 216 logfire.err("db.batch turso error: {} | first_sql: {s} | response: {s}", .{ res.status, first_sql, resp_preview }); 217 + span.recordError(error.TursoError); 218 + span.setAttribute("turso.status", @intFromEnum(res.status)); 219 + span.setAttribute("turso.response", resp_preview); 212 220 return error.TursoError; 213 221 } 214 222