diff --git a/internal/workbenchruntime/otel.go b/internal/workbenchruntime/otel.go index f53bbe37..8c36ecb2 100644 --- a/internal/workbenchruntime/otel.go +++ b/internal/workbenchruntime/otel.go @@ -185,6 +185,9 @@ func (s *Server) withOtelInternalSpan(ctx context.Context, name string, attrs ma attributes[key] = value } } + if err != nil { + attributes["causeStage"] = name + } addOtelErrorCauseAttributes(attributes, err) s.emitOtelSpanAsync(name, trace, spanID, trace.ServerSpanID, otelSpanKindInternal, startedAt, attributes, 0, errorCode) return err @@ -216,8 +219,16 @@ func sqlCauseCode(err error) string { return "invalid_json_text" case strings.Contains(message, "cannot cast") && strings.Contains(message, "json"): return "invalid_json_cast" - case strings.Contains(message, "context deadline exceeded"): + case strings.Contains(message, "context deadline exceeded") || strings.Contains(message, "timeout"): return "query_timeout" + case strings.Contains(message, "context canceled") || strings.Contains(message, "canceling statement due to user request"): + return "query_context_canceled" + case strings.Contains(message, "too many clients") || strings.Contains(message, "remaining connection slots"): + return "postgres_connection_slots_exhausted" + case strings.Contains(message, "server closed") || strings.Contains(message, "connection reset") || strings.Contains(message, "broken pipe") || strings.Contains(message, "bad connection"): + return "postgres_connection_unavailable" + case strings.Contains(message, "scan") || strings.Contains(message, "converting driver.value"): + return "row_scan_failed" default: return "" } diff --git a/internal/workbenchruntime/service.go b/internal/workbenchruntime/service.go index 191bfae8..91c15f2d 100644 --- a/internal/workbenchruntime/service.go +++ b/internal/workbenchruntime/service.go @@ -278,10 +278,7 @@ func (s *Server) listSessions(ctx context.Context, query sessionListQuery) (map[ if offset < 0 { offset = 0 } - ownerUserID := "" - if strings.ToLower(strings.TrimSpace(query.Actor.Role)) != "admin" { - ownerUserID = strings.TrimSpace(query.Actor.ID) - } + ownerUserID := strings.TrimSpace(query.Actor.ID) pageFacts, err := s.queryFacts(ctx, factQuery{OwnerUserID: ownerUserID, Limit: limit + offset + 1, Families: []string{"sessions"}, SessionsOrder: "updated_desc", SessionProjection: "summary"}) if err != nil { return nil, err @@ -861,7 +858,7 @@ func visibleSessions(rows []any, actor sessionActor) []map[string]any { if strings.ToLower(text(item["status"])) == "archived" { continue } - if strings.ToLower(strings.TrimSpace(actor.Role)) != "admin" && text(item["ownerUserId"]) != strings.TrimSpace(actor.ID) { + if text(item["ownerUserId"]) != strings.TrimSpace(actor.ID) { continue } result = append(result, item)