docs/netdata-agent/configuration/organize-systems-metrics-and-alerts.md
When you monitor dozens or hundreds of systems, you need powerful ways to keep everything organized. Netdata helps you structure your infrastructure with Spaces, Rooms, virtual nodes, host labels, and metric labels.
Netdata provides multiple organization methods that work together:
:::info
Each node belongs to exactly one Space but can be assigned to multiple Rooms within that Space.
:::
:::tip
Most organizations need only one Space. Create multiple Rooms within that Space to organize your infrastructure effectively.
:::
Learn more in our Spaces and Rooms documentation.
Virtual nodes let you split multi-component systems into distinct, monitorable units. For example, you can monitor each Windows server in your infrastructure as its own node, even when collecting metrics through a single Netdata Agent.
See Virtual Nodes (vnodes) for the full reference: how to define a vnode via YAML or the dynamic configuration GUI, and how to attach it to a collector job.
Host labels help you:
Netdata automatically generates host labels when it starts, capturing:
| Label Category | Information Captured |
|---|---|
| System Info | Kernel version, OS name and version |
| Hardware | CPU architecture, cores, frequency, RAM, disk space, product ID, product name, product type |
| Environment | Container details, Kubernetes node status |
| Infrastructure | Virtualization layer, Parent-child streaming status |
View your automatic labels at http://HOST-IP:19999/api/v1/info:
Host-label values use Netdata's label sanitizer. For example, commas in hardware model identifiers are exposed as dots in host labels.
{
"host_labels": {
"_is_k8s_node": "false",
"_is_parent": "false"
}
}
Add your own labels to categorize systems by any criteria you need.
Edit your Netdata configuration:
cd /etc/netdata # Replace with your Netdata config directory
sudo ./edit-config netdata.conf
:::note
On Windows, follow [Edit Configuration Files](/docs/netdata-agent/configuration/README.md#edit-configuration-files) instead. The `[host labels]` example, naming rules, and environment variable expansion in steps 2 and 3 below work identically on Windows.
:::
Add a [host labels] section:
[host labels]
type = webserver
location = us-seattle
installed = 20200218
:::info Label naming rules
_! ' " *
:::You can use environment variables in label values:
[host labels]
region = ${REGION}
rack = ${RACK:-unknown}
env = ${DEPLOYMENT_ENV:-production}
location = ${DC}-${RACK:-default}
| Syntax | Behavior |
|---|---|
${VAR} | Replaced with the value of VAR. If unset or empty, the label value becomes [none] |
${VAR:-default} | Replaced with the value of VAR. If unset or empty, uses default |
Environment variables are resolved when labels are loaded or reloaded. You can mix them with literal text (e.g., ${DC}-${RACK}).
Enable your labels without restarting Netdata:
netdatacli reload-labels
On Windows, run this through netdatacli.exe — see Using netdatacli.
Verify your labels at http://HOST-IP:19999/api/v1/info
Use custom host labels such as environment with Node Rule-Based Room Assignment to route Kubernetes Nodes into separate Rooms.
Remove a custom label you no longer need.
Edit your Netdata configuration:
cd /etc/netdata # Replace with your Netdata config directory
sudo ./edit-config netdata.conf
On Windows, follow Edit Configuration Files instead.
In the [host labels] section, delete the line for the label you want to remove.
Save the file.
Apply the change without restarting Netdata:
netdatacli reload-labels
On Windows, run this through netdatacli.exe — see Using netdatacli.
Confirm the label is gone at http://HOST-IP:19999/api/v1/info
In Parent-Child setups, host labels automatically stream from children to the parent node. Access any child's labels through the parent at:
http://localhost:19999/host/CHILD_HOSTNAME/api/v1/info
:::warning
Child node labels contain sensitive system information. Secure your streaming connections with SSL and consider using access lists or restricting API access.
:::
Create targeted alerts based on host labels. For example, monitor disk space only on webservers:
template: disk_fill_rate
on: disk.space
lookup: max -1s at -30m unaligned of avail
calc: ($this - $avail) / (30 * 60)
every: 15s
host labels: type = webserver
Target systems by multiple criteria:
| Target | Host Label | Use Case |
|---|---|---|
| Specific OS | _os_name = Debian* | Apply alerts to Debian systems |
| Child nodes only | _is_child = true | Monitor streaming children |
| Docker containers | _container = docker | Container-specific alerts |
See the health documentation for more possibilities.
When using metrics exporters, include host labels with your exported data:
[exporting:global]
enabled = yes
send configured labels = yes
send automatic labels = no
Configure per-connection settings:
[opentsdb:my_instance3]
enabled = yes
destination = localhost:4242
data source = sum
update every = 10
send charts matching = system.cpu
send configured labels = no
send automatic labels = yes
Netdata's aggregate charts let you filter and group metrics using label name-value pairs. All go.d plugin collectors support labels at the collection job level.
Configure metric labels when collected from multiple sources. For example, label two Apache servers by service and location:
jobs:
- name: my_webserver1
url: http://host1/server-status?auto
labels:
service: "Payments"
location: "Atlanta"
- name: my_webserver2
url: http://host2/server-status?auto
labels:
service: "Payments"
location: "New York"
:::tip
Define as many label pairs as you need across all your data collection jobs to create meaningful groupings in your dashboards.
:::