Fetching config_context via GraphQL API fails or is considerable slower than REST API #335

Closed
opened 2026-04-05 16:26:25 +02:00 by MrUnknownDE · 0 comments
Owner

Originally created by @grische on 2/17/2026

NetBox Version

v4.5.2

Python Version

3.12

Area(s) of Concern

  • User Interface
  • REST API
  • GraphQL API
  • Python ORM
  • Other

Details

When trying to fetch the config_context with a very simple query, I noticed that it is considerably slower using GraphQL on demo.netbox.dev and it never never completes on our production cluster (probably due to the much larger number of devices within Netbox).
With the same query, I was able to completely stall my local Netbox-Docker dev setup that it did not respond anymore until restart.

The GraphQL query used:

{
  device_list {
    id
    config_context
  }
}

Performance comparison

I created a very simple config_context within demo.netbox.dev

Image

Then called it using REST and GraphQL:

  1. Calling the REST API with its full datastructure returns 7MB of data, while being 6x faster on demo.netbox.dev

    time {
    curl -sS -X GET \
    -H "Authorization: Token oBQRtM5x5oLyy42EZvdURVkzeEywxq4dlCXIvBN2" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json; indent=4" \
    "https://demo.netbox.dev/api/dcim/devices/?limit=1000";
    curl -sS -X GET \
    -H "Authorization: Token oBQRtM5x5oLyy42EZvdURVkzeEywxq4dlCXIvBN2" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json; indent=4" \
    "https://demo.netbox.dev/api/dcim/devices/?limit=1000&offset=1000"
    } |
    wc -c | awk '{print $1/1000"K"}'
    
    7062.49K
    
    real    0m10.622s
    user    0m0.069s
    sys     0m0.073s
    
  2. While GraphQL only returns 115KB of data, it is 6x slower:

    time \
    curl -sS -X POST \
    -H "Authorization: Token oBQRtM5x5oLyy42EZvdURVkzeEywxq4dlCXIvBN2" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json; indent=4" \
    --data-raw '{"query":"{\n  device_list {\n    id\n    config_context\n  }\n}"}' \
    'https://demo.netbox.dev/graphql/' |
    wc -c | awk '{print $1/1000"K"}'
    
    115.471K
    
    real    0m57.994s
    user    0m0.017s
    sys     0m0.022s
    

Note: There are 1643 devices within demo.netbox.dev as of the time of the tests (2026-02-17).

*Originally created by @grische on 2/17/2026* ### NetBox Version v4.5.2 ### Python Version 3.12 ### Area(s) of Concern - [ ] User Interface - [ ] REST API - [x] GraphQL API - [ ] Python ORM - [ ] Other ### Details When trying to fetch the `config_context` with a very simple query, I noticed that it is considerably slower using GraphQL on demo.netbox.dev and it never never completes on our production cluster (probably due to the much larger number of devices within Netbox). With the same query, I was able to completely stall my local Netbox-Docker dev setup that it did not respond anymore until restart. The GraphQL query used: ```graphql { device_list { id config_context } } ``` ## Performance comparison I created a very simple config_context within demo.netbox.dev <img width="981" height="1010" alt="Image" src="https://github.com/user-attachments/assets/a9aa6b87-a5ba-4e6e-a64c-1f457768612d" /> Then called it using REST and GraphQL: 1. Calling the REST API with its full datastructure returns 7MB of data, while being 6x faster on demo.netbox.dev ```sh time { curl -sS -X GET \ -H "Authorization: Token oBQRtM5x5oLyy42EZvdURVkzeEywxq4dlCXIvBN2" \ -H "Content-Type: application/json" \ -H "Accept: application/json; indent=4" \ "https://demo.netbox.dev/api/dcim/devices/?limit=1000"; curl -sS -X GET \ -H "Authorization: Token oBQRtM5x5oLyy42EZvdURVkzeEywxq4dlCXIvBN2" \ -H "Content-Type: application/json" \ -H "Accept: application/json; indent=4" \ "https://demo.netbox.dev/api/dcim/devices/?limit=1000&offset=1000" } | wc -c | awk '{print $1/1000"K"}' 7062.49K real 0m10.622s user 0m0.069s sys 0m0.073s ``` 2. While GraphQL only returns 115KB of data, it is 6x slower: ```sh time \ curl -sS -X POST \ -H "Authorization: Token oBQRtM5x5oLyy42EZvdURVkzeEywxq4dlCXIvBN2" \ -H "Content-Type: application/json" \ -H "Accept: application/json; indent=4" \ --data-raw '{"query":"{\n device_list {\n id\n config_context\n }\n}"}' \ 'https://demo.netbox.dev/graphql/' | wc -c | awk '{print $1/1000"K"}' 115.471K real 0m57.994s user 0m0.017s sys 0m0.022s ``` Note: There are 1643 devices within demo.netbox.dev as of the time of the tests (2026-02-17).
MrUnknownDE added the complexity: mediumtype: performancetype: performancetype: performancestatus: acceptednetboxtype: performancetype: performancetype: performancecomplexity: mediumcomplexity: mediumcomplexity: mediumcomplexity: mediumcomplexity: mediumcomplexity: mediumcomplexity: mediumcomplexity: mediumcomplexity: mediumcomplexity: mediumstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptednetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetbox labels 2026-04-05 16:26:29 +02:00
Sign in to join this conversation.
No Label complexity: medium complexity: medium complexity: medium complexity: medium complexity: medium complexity: medium complexity: medium complexity: medium complexity: medium complexity: medium complexity: medium netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted type: performance type: performance type: performance type: performance type: performance type: performance
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/netbox#335