{"record":{"id":"b02c6e15b6dc800b","repo":"BerriAI/litellm","slug":"mavvrik-focus-destination-connector-is-disconnect","errorCode":null,"errorMessage":"Mavvrik FOCUS destination: connector is disconnected (410). Re-enable the connection in the Mavvrik dashboard.","messagePattern":"Mavvrik FOCUS destination: connector is disconnected \\(410\\)\\. Re-enable the connection in the Mavvrik dashboard\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"litellm/integrations/focus/destinations/mavvrik_destination.py","lineNumber":123,"sourceCode":"\n        Returns metricsMarker from the Mavvrik response — the last date index\n        Mavvrik has successfully processed. Used by the logger to catch up any\n        dates that were missed due to previous export failures.\n\n        Returns None if the connector was already registered (cached).\n        \"\"\"\n        if self._registered:\n            return None\n        resp: Final = await self._http.client.request(\n            method=\"POST\",\n            url=self._agent_url,\n            headers=self._auth_headers,\n            json={\"name\": self.connection_id},\n            timeout=30.0,\n        )\n        if resp.status_code == 410:\n            self._registered = False\n            raise RuntimeError(\n                \"Mavvrik FOCUS destination: connector is disconnected (410). \"\n                \"Re-enable the connection in the Mavvrik dashboard.\"\n            )\n        if resp.status_code >= 400:\n            raise RuntimeError(f\"Mavvrik FOCUS destination: register failed ({resp.status_code}): {resp.text[:200]}\")\n        self._registered = True\n        metrics_marker: Final = resp.json().get(\"metricsMarker\", 0)\n        verbose_logger.debug(\n            \"Mavvrik FOCUS destination: connector registered (metricsMarker=%s)\",\n            metrics_marker,\n        )\n        return metrics_marker\n\n    async def _get_signed_url(self, date_str: str) -> str:\n        \"\"\"GET upload-url endpoint → GCS signed URL for the given date.\"\"\"\n        params: Final = {\"name\": date_str, \"type\": \"metrics\", \"datetime\": date_str}\n        resp: Final = await self._http.client.request(\n            method=\"GET\",","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/integrations/focus/destinations/mavvrik_destination.py#L105-L141","documentation":"On first delivery, the destination POSTs to the Mavvrik agent endpoint to register the connector (body {\"name\": connection_id}). A 410 Gone response means Mavvrik knows this connector but it has been disabled/deleted on their side, so the destination refuses to proceed and tells the user to re-enable it. self._registered stays False so the next attempt retries registration.","triggerScenarios":"Calling deliver() (or the register step) when the Mavvrik connection identified by MAVVRIK_CONNECTION_ID was disconnected in the Mavvrik dashboard — expired trial, manually disabled integration, or deleted connector with a reused ID.","commonSituations":"The connector was disabled by an admin during cleanup; tenant subscription lapsed; connection deleted and recreated with the same name but stale server-side state; long-running LiteLLM deployment whose connector was retired months earlier.","solutions":["Open the Mavvrik dashboard, find the connection, and re-enable it (or create a new one).","If you created a new connector, update MAVVRIK_CONNECTION_ID to the new ID and restart/recreate the destination.","Verify the connector is enabled before redeploying: the register call should then return 2xx and a metricsMarker.","Alert on this error — it never self-heals without dashboard action."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    await mavvrik_dest.deliver(content=csv, time_window=tw, filename=\"f.csv\")\nexcept RuntimeError as e:\n    if \"disconnected (410)\" in str(e):\n        page_oncall(\"Mavvrik connector disabled — re-enable in Mavvrik dashboard\")\n        # do NOT retry-loop: requires human action in Mavvrik\n    raise","preventionTips":["Alert (don't retry) on 410: it requires dashboard action and never self-heals.","Periodically verify the connector is still enabled in Mavvrik during ops reviews.","Keep a runbook entry: re-enable connector or create a new one and update MAVVRIK_CONNECTION_ID."],"tags":["focus","mavvrik","connector","remote-state","http-410"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}