For all-purpose-compute Thrift connections on SPOG (custom-URL) hosts the
http_path is /sql/protocolv1/o/<workspace-id>/<cluster-id> and the
workspace ID is encoded in the path itself. PoPP routes the Thrift
request correctly off the /o/<wsid>/ segment, so the connection succeeds
without an explicit ?o= query parameter.
Other requests on the same connection (telemetry uploads to
/telemetry-ext, feature-flag fetches, SEA REST calls) hit different
paths that don't carry the workspace ID. Previously _extract_spog_headers
only looked at ?o= in the http_path, so the x-databricks-org-id header
was never set for cluster URLs without ?o=. On SPOG hosts PoPP then had
no workspace context for these requests and redirected them to /login,
silently dropping telemetry.
Extend _extract_spog_headers to also extract the workspace ID from the
cluster path segment as a fallback when ?o= is absent. Priority order:
explicit caller header > ?o= query param > /o/<wsid>/ path segment.
Adds five unit tests covering the new cluster-path extraction, leading
slash, query-param-wins priority, explicit-header-wins priority, and a
warehouse-path regression guard.
Signed-off-by: Madhavendra Rathore <madhavendra.rathore@databricks.com>
Summary
Why
On a SPOG host the workspace identity has to be in either the URL or the x-databricks-org-id header so PoPP can route a request to the right workspace. For all-purpose cluster Thrift this is free — the workspace ID is in the /o/<wsid>/ segment of the http_path, so PoPP routes Thrift via routing_reason=workspace-id and the session opens fine without ?o=.
Connection-scoped HTTP clients used for telemetry, feature flags, and the SEA backend talk to different paths (/telemetry-ext, /api/...) that do not carry the workspace ID. The previous extraction only looked at ?o= in the query string, so on a cluster http_path without ?o= no x-databricks-org-id header was ever attached. PoPP fell back to default (account) routing on those endpoints and responded with a 303 redirect to /login — silently dropping every telemetry batch.
What changes
src/databricks/sql/session.py
tests/unit/test_session.py
Test plan
Out of scope
This pull request and its description were written with assistance from Claude Code.