docs/npm/topology/dependency-mapping.md
The same topology view that draws your switches also draws your software. On a monitored host, Netdata reads the kernel's live socket table and turns it into a dependency map: which process talks to which, over which port — attributed, on Linux, to the container, image, systemd unit, or Kubernetes pod that owns it.
There is nothing to instrument. No language agents, no sidecars, no code changes, no service mesh. These are the sockets your kernel already has, enumerated fresh each time you open the map and drawn as a graph. It is a live picture of now, not a stored history — the map shows what is connected at the moment you ask.
For every TCP and UDP socket on the host, IPv4 and IPv6, Netdata identifies the local process behind it:
The other end depends on where it is. When both ends of a connection live on the same host, Netdata draws a direct process-to-process link. When the peer is elsewhere, it is drawn as an endpoint actor carrying its address, and the map records the matching keys needed to resolve it against the process serving it on another monitored host.
The result is a graph of your applications rather than a list of sockets: this pod talks to that database, this service depends on that queue, this host reaches out to that external address.
Identification is best-effort. A socket whose owning process Netdata can see but cannot name — one that exited between
reads, for example — is still drawn, with [unknown] where the name or user would be. Enumerating every process's
sockets needs privileged access, which standard installations grant; where it is missing the map is quietly
incomplete rather than wrong.
Running the Agent in a container needs more than the default: the host network namespace and the host /proc to see
anything beyond the container's own sockets, SYS_ADMIN to reach sibling containers' connections, and SYS_PTRACE to
attribute connections to processes — without SYS_PTRACE you get the connections but not the software behind them,
which is the point of this map. Netdata's own container images and Helm chart request these already. On macOS, a
non-privileged or TCC-restricted Agent omits protected processes altogether. The plugin logs a warning when it detects
that its view was truncated.
The map redraws around whichever level you want to reason about:
Grouping applies within the host: actors are identified per node, so identical processes on two different hosts stay two boxes.
Start grouped, then drill down. A dependency map that shows every process on a busy host is accurate and unreadable; the value is in choosing the altitude that answers your question.
| Platform | Dependency map | Process identity | Container / Kubernetes / systemd |
|---|---|---|---|
| Linux | yes | yes | yes |
| FreeBSD | yes | yes | no |
| macOS | yes | yes | no |
| Windows | no | — | — |
On Linux, container and Kubernetes attribution comes from the cgroup each socket's process belongs to. Netdata recognizes Docker, Kubernetes, Podman, LXC, systemd-nspawn, KVM guests, and plain systemd units, with no per-runtime configuration. On FreeBSD and macOS the map is drawn from processes and endpoints only — the cgroup enrichment that supplies container and workload identity is Linux-specific.
Windows does not have this map. Netdata monitors Windows connections through the Network Connections table, with
SMB statistics in the separate Network Protocols table, but the topology:network-connections graph is not
available there.
The map is served by the topology:network-connections function — open it from the topology view. It comes up on
its own: the plugin is enabled by default and needs no setup. Its one setting, apps lookup cache size, is the number
of per-PID entries the APPS_LOOKUP cache keeps — the cgroup identity already resolved for each process. It lives in
netdata.conf under [plugin:network-viewer] and rarely needs changing; raising it does not make more processes
resolvable, it only keeps more of the resolved ones cached.
The function is not anonymous. It exposes process names, command lines, users, and every address the host talks to, so it requires a signed-in Netdata identity, membership of the same Space as the node, and permission to view sensitive data. If the map is missing while the node is otherwise healthy, check your access before suspecting the collector.
Two levels of detail are available:
The related Network Connections function shows the same sockets as a searchable table, with states, ports, and per-connection metrics — useful when you already know what you're looking for and want the raw rows rather than the graph.