Skip to content

Failed UDF -> Druid query filter translation #158

@H-Shay

Description

@H-Shay

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:

  1. Go to the UI and pick a UDF which is listed in UI UDF documentation and has a druid translation (ie is present in /osprey_worker/src/osprey/engine/query_language/udfs) - (RegexMatch(item=UserName, regex='^jake') is the one I used to generate this error
  2. Attempt to run a query with it
  3. The UI will show a 500 Internal Server Error, and logs from the UI-API will show 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"}

Expected behavior
The query to be successfully run.

Screenshots/Recordings/Logs

{"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"}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    Status

    Todo

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions