{"asctime": "2026-03-04T21:44:34,004", "message": "Error handling request /queries/validate", "name": "gunicorn.error", "created": 1772660674.8522117, "filename": "glogging.py", "module": "glogging", "funcName": "exception", "lineno": 270, "msecs": 852.0, "pathname": "/osprey/.venv/lib/python3.11/site-packages/gunicorn/glogging.py", "process": 26, "processName": "MainProcess", "relativeCreated": 291131556.97083473, "thread": 139836338766528, "threadName": "Dummy-58645", "levelname": "ERROR", "exc_info": "Traceback (most recent call last):\n File \"/osprey/.venv/lib/python3.11/site-packages/gunicorn/workers/base_async.py\", line 55, in handle\n self.handle_request(listener_name, req, client, addr)\n File \"/osprey/.venv/lib/python3.11/site-packages/gunicorn/workers/ggevent.py\", line 127, in handle_request\n super().handle_request(listener_name, req, sock, addr)\n File \"/osprey/.venv/lib/python3.11/site-packages/gunicorn/workers/base_async.py\", line 108, in handle_request\n respiter = self.wsgi(environ, resp.start_response)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 2464, in __call__\n return self.wsgi_app(environ, start_response)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/ddtrace/contrib/internal/flask/wrappers.py\", line 98, in wrapper\n return wrapped(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 2450, in wsgi_app\n response = self.handle_exception(e)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask_cors/extension.py\", line 176, in wrapped_function\n return cors_after_request(app.make_response(f(*args, **kwargs)))\n ^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/ddtrace/contrib/internal/flask/wrappers.py\", line 98, in wrapper\n return wrapped(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 1867, in handle_exception\n reraise(exc_type, exc_value, tb)\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/_compat.py\", line 39, in reraise\n raise value\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 2447, in wsgi_app\n response = self.full_dispatch_request()\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 1952, in full_dispatch_request\n rv = self.handle_user_exception(e)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask_cors/extension.py\", line 176, in wrapped_function\n return cors_after_request(app.make_response(f(*args, **kwargs)))\n ^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/ddtrace/contrib/internal/flask/wrappers.py\", line 98, in wrapper\n return wrapped(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 1821, in handle_user_exception\n reraise(exc_type, exc_value, tb)\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/_compat.py\", line 39, in reraise\n raise value\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 1950, in full_dispatch_request\n rv = self.dispatch_request()\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/ddtrace/contrib/internal/flask/wrappers.py\", line 98, in wrapper\n return wrapped(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/flask/app.py\", line 1936, in dispatch_request\n return self.view_functions[rule.endpoint](**req.view_args)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/.venv/lib/python3.11/site-packages/ddtrace/contrib/internal/flask/wrappers.py\", line 72, in patch_func\n return wrapped(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/osprey_worker/src/osprey/worker/ui_api/osprey/views/queries.py\", line 47, in validate_query\n parse_query_filter(query_filter)\n File \"/osprey/osprey_worker/src/osprey/worker/ui_api/osprey/lib/druid.py\", line 463, in parse_query_filter\n return DruidQueryTransformer(validated_sources=validated_sources).transform()\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/osprey_worker/src/osprey/engine/query_language/ast_druid_translator.py\", line 32, in transform\n return {'filter': self._transform(self._root)}\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/osprey/osprey_worker/src/osprey/engine/query_language/ast_druid_translator.py\", line 41, in _transform\n ret = transformer(node)\n ^^^^^^^^^^^^^^^^^\n File \"/osprey/osprey_worker/src/osprey/engine/query_language/ast_druid_translator.py\", line 102, in transform_Call\n udf, _ = self._udf_node_mapping[id(node)]\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\nKeyError: 139836295180512"}
Problem Description
Attempting to use UDFs which should be available from the UI (ie they have druid query translations) results in error:
File \"/osprey/osprey_worker/src/osprey/engine/query_language/ast_druid_translator.py\", line 102, in transform_Call\n udf, _ = self._udf_node_mapping[id(node)]\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\nKeyError: 139836295173120"}To Reproduce
Steps to reproduce the behavior:
/osprey_worker/src/osprey/engine/query_language/udfs) - (RegexMatch(item=UserName, regex='^jake')is the one I used to generate this errorFile \"/osprey/osprey_worker/src/osprey/engine/query_language/ast_druid_translator.py\", line 102, in transform_Call\n udf, _ = self._udf_node_mapping[id(node)]\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\nKeyError: 139836295173120"}Expected behavior
The query to be successfully run.
Screenshots/Recordings/Logs