nfdump Profiles
nfsen-ng supports multiple nfdump profiles (e.g. live, test, backup). Each
profile is an independent tree of nfcapd capture files under
nfdump.profiles-data, with its own separate RRD (or VictoriaMetrics) dataset.
The conceptual model is covered in
Data Sources: Profiles; this page is
the operational side.
Directory layout
<profiles-data>/
├── live/
│ └── <source>/
│ └── YYYY/MM/DD/nfcapd.YYYYMMDDHHMM
└── test/
└── <source>/
└── YYYY/MM/DD/nfcapd.YYYYMMDDHHMM
Profiles are detected automatically: Config::detectProfiles() scans
<profiles-data> and treats each top-level directory that contains a
source → YYYY/ tree as a profile. A directory that instead holds sub-groups
of such trees becomes a nested group/child profile. The nfdump.profile
setting (NFSEN_NFDUMP_PROFILE, default live) only picks the default profile
shown on load. If the data root is missing or empty, nfsen-ng falls back to a
single profile named after nfdump.profile.
Configuration
No extra configuration is required: detection is automatic on startup. To run a
second collector writing into another profile, just point its -w at a different
top-level directory:
# Live collector: port 9995 → profiles-data/live/all/
nfcapd -w /var/nfdump/profiles-data/live/all -z=lz4 -S 1 -p 9995 -D
# Test/secondary collector: port 9996 → profiles-data/test/all/
nfcapd -w /var/nfdump/profiles-data/test/all -z=lz4 -S 1 -p 9996 -D
Docker Compose example
nfcapd-test:
image: ghcr.io/mbolli/nfsen-ng:latest
entrypoint: ["/usr/local/nfdump/bin/nfcapd"]
command: ["-w", "/data/nfsen-ng/test/all", "-z=lz4", "-S", "1", "-p", "9996"]
volumes:
- /var/nfdump/profiles-data:/data/nfsen-ng
ports:
- "9996:9996/udp"
Profile selector
When more than one profile is detected, a profile selector appears at the start
of the controls bar; profiles named group/child are grouped. Switching profiles
re-scopes the whole UI to that profile’s data range and slides the visible window
to the end of its available data; the choice is persisted to preferences.json
so it survives a reload.
Import daemon
The embedded import daemon watches each detected profile independently. The Import card on the Health page shows a row per profile, and the footer daemon indicator’s tooltip says how many profiles and directories are being watched. Each profile:
- watches its own
<profiles-data>/<profile>/subtree via inotify; - writes into profile-namespaced storage (
data/<profile>/<source>.rrd, or aprofile=label for VictoriaMetrics); - decides on startup whether to gap-fill based on its own last-update timestamp. A profile with no data yet is skipped: trigger its first import manually with the per-row Trigger button.
Storage layout
RRD files are stored per profile:
backend/datasources/data/<profile>/<source>.rrd
backend/datasources/data/<profile>/<source>_<port>.rrd
backend/datasources/data/<profile>/<port>.rrd # port-only aggregate
A .rrd.first sidecar (e.g. all.rrd.first) records the Unix timestamp of the
first real data point, so the range controls start at the true beginning of
available data rather than the RRD creation time.
Rescan is per profile. The Rescan action reads the targeted profile
(admin_target_profile) and resets only that profile’s datasource, leaving the
others untouched.
For VictoriaMetrics the profile is a Prometheus label (profile="live").
Historical data written before profiles existed has no label and is still matched
via a regex selector (profile=~"live|") for backward compatibility.
Health checks
The Health page reports per-profile status: nfcapd path existence and capture
freshness, daemon status and last auto-import, datasource freshness, and one row
per profile and source in the Capture sources card. With a single profile the
check ids and labels stay flat (rrd_data_<source>); with more than one they’re
profile-suffixed (rrd_data_<profile>_<source>) so the two don’t collide. See
Health.
The Overview top-N lists and alert rules are per profile as well: the collector stores each profile’s intervals under its own name, and a rule watches the profile it names.