Skip to content

IndexError when printing dashboard response containing empty group_by list #3656

Description

@nainakira

Describe the bug
Calling print(response) on a dashboard response raises IndexError: list index out of range when the dashboard contains a query_value widget with a logs query that has "group_by": [] (empty list).

Labels: kind/bug, severity/major

To Reproduce

  1. Create a dashboard with a query_value widget using a logs query with group_by set to an empty list.
  2. Call get_dashboard() using the Python API client.
  3. Call print(response) on the returned object.
  4. See IndexError: list index out of range.

Minimal reproduction:

from datadog_api_client import Configuration, ApiClient
from datadog_api_client.v1.api.dashboards_api import DashboardsApi

configuration = Configuration()
with ApiClient(configuration) as api_client:
    api = DashboardsApi(api_client)
    response = api.get_dashboard(dashboard_id="<dashboard-id>")
    print(response)  # raises IndexError

Expected behavior
The response should be printed (or serialized via to_dict()) without raising any exception.

Screenshots

Image
Traceback (most recent call last):
  File "main.py", line 8, in <module>
    print(response)
  File ".venv/lib/python3.14/site-packages/datadog_api_client/model_utils.py", line 194, in __repr__
    return self.to_str()
  File ".venv/lib/python3.14/site-packages/datadog_api_client/model_utils.py", line 422, in to_str
    return pprint.pformat(self.to_dict())
  File ".venv/lib/python3.14/site-packages/datadog_api_client/model_utils.py", line 418, in to_dict
    return model_to_dict(self, serialize=False)
  File ".venv/lib/python3.14/site-packages/datadog_api_client/model_utils.py", line 1502, in model_to_dict
    model = model.get_oneof_instance()
  File ".venv/lib/python3.14/site-packages/datadog_api_client/model_utils.py", line 581, in get_oneof_instance
    return self._composed_instances[0]
IndexError: list index out of range

Root cause
group_by is typed as FormulaAndFunctionEventQueryGroupByConfig, a ModelComposed class with a oneOf of two variants: a list of group-by objects and a fields object. When the API returns "group_by": [], the oneOf matcher cannot determine which variant the empty list belongs to, so _composed_instances is left empty.

model_to_dict() in model_utils.py enters its traversal loop based on _composed_schemas being non-empty, without checking whether _composed_instances is populated, and then crashes at get_oneof_instance() which unconditionally accesses self._composed_instances[0].

Workaround
Set configuration.preload_content = False to skip deserialization and parse the raw JSON manually:

import json
from datadog_api_client import Configuration, ApiClient
from datadog_api_client.v1.api.dashboards_api import DashboardsApi

configuration = Configuration()
configuration.preload_content = False
with ApiClient(configuration) as api_client:
    api = DashboardsApi(api_client)
    response = api.get_dashboard(dashboard_id="<dashboard-id>")
    data = json.loads(response.data)
    print(json.dumps(data, indent=2))

Environment and Versions (please complete the following information):

  • datadog-api-client version: 2.55.0 (latest)
  • Python version: 3.14
  • OS: macOS

Additional context
The fix requires two changes in .generator/src/generator/templates/model_utils.j2 (the template that generates src/datadog_api_client/model_utils.py):

  1. Guard the loop in model_to_dict() to only enter when _composed_instances is also non-empty:

    while model._composed_schemas and model._composed_instances:
  2. Make get_oneof_instance() fall back to self instead of crashing when _composed_instances is empty:

    def get_oneof_instance(self):
        if not self._composed_instances:
            return self
        return self._composed_instances[0]

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions