docs/netdata-ai/skills/query-netdata-cloud/query-functions.md
This guide is part of the query-netdata-cloud skill.
Read the SKILL.md prerequisites first.
This file documents the generic Function transport: the URL,
the standard response envelope, the info discovery query, the
four Function families and where each family's data lives in the
response.
For three of the four families there is a dedicated guide:
The table-snapshot family (full dataset in each response) is covered here.
For querying agents directly (without going through Cloud) -- which
includes the transparent Cloud-token to agent-bearer mint flow --
see the sibling skill
query-netdata-agents.
YOUR_API_TOKEN and
YOUR_NODE_UUID placeholders.{"info":true} when you don't already
know the parameter set of the target Function. The info
response is authoritative -- this skill's tables can be stale
relative to the running agent.systemd-journal,
topology:snmp, flows:netflow).The canonical Functions v3 protocol
(<repo>/src/plugins.d/FUNCTION_UI_REFERENCE.md) formally defines
two Function classes, distinguished by the has_history flag
in the info response:
| Class | has_history | Frontend behavior | Examples |
|---|---|---|---|
| Simple Table | false | Backend returns the whole current dataset; frontend filters/sorts/searches in-memory | processes, network-connections, network-interfaces, block-devices, mount-points, containers-vms, systemd-services, netdata-streaming, netdata-api-calls, netdata-metrics-cardinality, <db>:top-queries, <db>:running-queries, <db>:deadlock-info, <db>:error-info |
| Log Explorer | true | Backend filters / facets / histograms before sending; supports infinite scroll, anchor pagination, delta and PLAY modes | systemd-journal, windows-events, macos-logs, otel-logs |
Two additional type values are used by purpose-built Functions
that build on the same envelope but emit non-tabular data:
type | Response shape | Examples | Guide |
|---|---|---|---|
topology | data.actors/data.links graph plus compact-schema sections (data.evidence, data.tables, data.overlays) | topology:network-connections, topology:streaming, topology:snmp | query-topology.md |
flows | data.flows[] plus data.facets / data.columns / data.stats over a time window | flows:netflow (covers NetFlow / sFlow / IPFIX) | query-flows.md |
For full protocol semantics (facet pills, histograms, charts
configuration, anchor/delta/PLAY modes, error handling, edge
cases), the authoritative source is
<repo>/src/plugins.d/FUNCTION_UI_REFERENCE.md. This skill
summarizes the surface that matters for a Cloud-side curl client;
the reference covers everything else.
Every Function -- regardless of family -- wraps its output in this
envelope. Verified live against the agent's systemd-journal,
topology:snmp, and flows:netflow Functions, and against the
agent emit code at
src/web/api/functions/function-metrics-cardinality.c:26-39,92
plus per-collector wrappers.
| Key | Type | Required | Notes |
|---|---|---|---|
status | int | yes | HTTP-style status (200, 400, ...) |
v | int | yes | Function schema version (currently 3 or 4 depending on Function) |
type | string | yes | Family discriminator: table, logs, topology, flows (some Functions emit a custom string -- treat unknown values as table-like) |
help | string | typical | Human-readable description |
accepted_params | array<string> | typical | Parameter names accepted in the body |
required_params | array<object> | typical | Per-parameter widget descriptors -- see "info=true discovery" below |
has_history | bool | typical | Whether the Function honors after / before |
update_every | int | typical | Suggested refresh interval in seconds |
data | array OR object | conditional | Family-specific result. Absent on info=true calls and on errors. Array for logs and table families; object (with actors/links or flows/columns/stats) for topology and flows |
columns | object | logs / table | Column-metadata, keyed by column name. Each entry has index (position inside each row of data), name, type, visible, sort, summary, filter, ... |
facets | array | logs / flows | Per-field value distribution and option counts |
histogram | object | logs (when requested) | Bucketed counts over time |
pagination | object | logs | anchor, direction, last, etc. |
presentation | object | topology / flows | Visualization metadata for the Cloud UI |
expires / last_modified / partial / message | scalar | optional | Caching, freshness, partial-result diagnostics |
versions | object | optional | Source/version hashes for client cache invalidation |
status >= 400 responses follow the same envelope but include an
errorMessage / errorMsgKey instead of data.
info=true discoveryThe single most important call to make before constructing a real
query: pass {"info": true} and read accepted_params plus
required_params. The agent itself is the authoritative source --
if a parameter exists there, the Function accepts it; if it
doesn't, no other doc matters.
TOKEN="YOUR_API_TOKEN"
NODE="YOUR_NODE_UUID"
FN="systemd-journal"
read -r -d '' PAYLOAD <<'EOF'
{ "info": true }
EOF
curl -sS -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
"https://app.netdata.cloud/api/v2/nodes/$NODE/function?function=$FN" \
-d "$PAYLOAD"
required_params widget schemaEach entry of required_params is a UI-widget descriptor that
tells a client what to render and what values are valid. Verified
against the emit code in
src/collectors/network-viewer.plugin/network-viewer.c:1601-1731
and across the topology / logs / flows Functions.
| Field | Type | Required | Purpose |
|---|---|---|---|
id | string | yes | Parameter id (the body key) |
name | string | yes | Display label |
help | string | typical | Tooltip / help text |
type | string | yes | Widget kind -- see table below |
options[] | array | for select/multiselect/autocomplete | Each option: { "id": "<value>", "name": "<label>", "defaultSelected": <bool>? } |
unique_view | bool | optional | Single-select enforces single-value semantics |
multiselect | bool | optional | Multi-value semantics |
pattern | string | optional | Regex/glob input for text/pattern widgets |
default_value | scalar | optional | Pre-filled value |
Widget type values seen in source:
type | Meaning |
|---|---|
select | Single-choice dropdown |
multiselect | Multi-choice; each option may have defaultSelected:true |
autocomplete | Text input backed by an autocomplete query (the Function itself answers via mode:"autocomplete" or similar) |
text | Free-form text |
checkbox | Boolean toggle |
range | Numeric range / slider (newer Functions) |
pattern | Pattern / regex input (newer Functions) |
The widget array is the contract between the agent and any UI or
script. To programmatically construct a valid body for a Function,
walk required_params and emit the body shape it implies. There
is no central widget builder API in source -- each collector emits
the array directly via buffer_json_* calls -- so the agent's own
info=true response is the only authoritative place to read the
schema for a specific node version.
POST /api/v3/spaces/{spaceID}/rooms/{roomID}/functions
TOKEN="YOUR_API_TOKEN"
SPACE="YOUR_SPACE_ID"
ROOM="YOUR_ROOM_ID"
read -r -d '' PAYLOAD <<'EOF'
{
"scope": { "nodes": [] },
"selectors": { "nodes": ["*"] }
}
EOF
curl -sS -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
"https://app.netdata.cloud/api/v3/spaces/$SPACE/rooms/$ROOM/functions" \
-d "$PAYLOAD"
Response top-level: functions[] (each entry: name, version,
help, ni[], tags, access[], priority), nodes[] (each
{ ni, mg, nd, nm, st }), agents[], versions. Match
functions[].ni to nodes[].ni to find which nodes expose a
given Function.
POST /api/v2/nodes/{nodeId}/function?function={functionName}
TOKEN="YOUR_API_TOKEN"
NODE="YOUR_NODE_UUID"
FN="processes"
read -r -d '' PAYLOAD <<'EOF'
{
"last": 50,
"timeout": 30000
}
EOF
curl -sS -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
"https://app.netdata.cloud/api/v2/nodes/$NODE/function?function=$FN" \
-d "$PAYLOAD"
Optional headers:
| Header | Purpose |
|---|---|
X-Transaction-Id: <uuid> | Correlation id propagated to the agent. Optional. |
Function availability is per-node. The listing endpoint above is the only authoritative source. Below are common Functions on a stock Linux Netdata install (verified live):
| Function | Family | What it returns |
|---|---|---|
processes | table | Live process list with CPU / memory / I/O / page faults / PPID |
network-connections | table | Active sockets/connections (proto, state, addresses, ports, perf metrics) |
network-interfaces | table | Per-interface traffic, packet counts, drops, link status |
block-devices | table | Per-block-device read/write throughput, ops, latency, utilization |
mount-points | table | Filesystem mount points with space and inode usage |
containers-vms | table | Active containers and cgroups with resource usage |
systemd-services | table | systemd service cgroups with process counts and resource use |
netdata-streaming | table | Parent-child streaming/replication status, data-flow metrics, ML status |
netdata-api-calls | table | Active and recent Netdata API requests with timings |
netdata-metrics-cardinality | table | Cardinality stats (instances, time-series per context/node) |
systemd-journal | logs | systemd journal entries -- see query-logs.md |
windows-events | logs | Windows event log channels (Windows nodes only) |
macos-logs | logs | macOS unified log entries (macOS nodes only) |
otel-logs | logs | OpenTelemetry log entries (when the OTEL log receiver is enabled) |
topology:snmp | topology | LLDP/CDP/FDB/STP-derived L2 topology -- see query-topology.md |
flows:netflow | flows | NetFlow / sFlow / IPFIX records -- see query-flows.md |
Database collectors register a per-collector family of Functions
when active: <collector>:top-queries, <collector>:running-queries,
<collector>:deadlock-info, <collector>:error-info -- e.g.
postgres:top-queries, mysql:top-queries, mssql:deadlock-info.
The listing endpoint reports them when the collector is enabled.
For logs / topology / flows examples, see the per-family guides linked at the top.
TOKEN="YOUR_API_TOKEN"
NODE="YOUR_NODE_UUID"
read -r -d '' PAYLOAD <<'EOF'
{
"last": 50,
"timeout": 30000
}
EOF
curl -sS -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
"https://app.netdata.cloud/api/v2/nodes/$NODE/function?function=processes" \
-d "$PAYLOAD" \
| jq '.data | length, (.[0:3])'
read -r -d '' PAYLOAD <<'EOF'
{ "info": true }
EOF
curl -sS -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
"https://app.netdata.cloud/api/v2/nodes/$NODE/function?function=network-connections" \
-d "$PAYLOAD" \
| jq '.required_params | map({id, type, name, options: (.options | length // 0)})'
read -r -d '' PAYLOAD <<'EOF'
{
"scope": { "nodes": ["YOUR_NODE_UUID"] },
"selectors": { "nodes": ["*"] }
}
EOF
curl -sS -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
"https://app.netdata.cloud/api/v3/spaces/$SPACE/rooms/$ROOM/functions" \
-d "$PAYLOAD" \
| jq -r '.functions[] | "\(.name)\t\(.tags // "")\t\(.help)"'
"timeout": <ms> in the body for slower Functions but Cloud
may impose its own ceiling.last, anchor) rather than relying on
streaming.reachable. A stale node returns HTTP 400
with errorMsgKey: "ErrInstanceNotReachable". Verify with the
discovery endpoints in SKILL.md.PermissionFunctionExec on the target space. scope:all
works; scope:grafana-plugin does NOT.info=true does NOT bypass auth. ACL is enforced on every
call regardless of body.info=true response is authoritative for
parameters. Tables in this skill can drift relative to the
running version. When in doubt, ask the agent.