Skip to content

What it sends ​

Every field the InfraNest agent sends, how often, and how long InfraNest keeps it. The tables below are built from the push endpoint's own validation, so they list exactly what InfraNest accepts. The agent's PAYLOAD.md has the full contract with every edge case.

See it yourself first ​

On the server, before or after installing:

sh
infranest-agent print

That takes one reading and prints the exact JSON the agent would send, and sends nothing. It needs no sudo: it reads the machine, not the token.

How often ​

  • Every interval (60 seconds by default; INFRANEST_INTERVAL from 10 seconds to 5 minutes) the agent takes a reading and sends it with any it could not send before, in one POST to https://ingest.infranest.io/api/metrics/push.
  • Once an hour at most, the push also says which directories fill the fullest disk.
  • The agent sends at most 60 readings in one push. InfraNest accepts up to 180, and up to 120 pushes a minute from one server's token.
  • If your plan stores readings less often than the agent takes them, InfraNest tells the agent and it slows down to match. It never speeds up because of an answer.

The token names one server. Nothing in the push says which machine it came from: InfraNest knows it from the token.

Never sent ​

The agent runs as its own unprivileged user and reads only what that user may read. On top of that:

  • No log output. When a service fails, the agent sends systemd's one-word reason (oom-kill, timeout, exit-code) and the exit status. Never a line the service printed, which can contain credentials.
  • No command lines. A process is sent by its executable's name. Its arguments are sent only if you set both INFRANEST_PROCESSES=1 and INFRANEST_PROCESS_ARGS=1; the processes list itself is off by default.
  • No hook commands. For certbot it sends which kinds of renewal hook exist (deploy, post), never what they run.
  • No private keys or certificate contents. For a certificate it sends the names, the expiry and the file it read them from.
  • No sizes it could not measure. A directory the agent may not enter is named, with its permissions, but never given a size.
  • Nothing from the Docker socket. Containers are read from systemd, so they are sent by ID, without names.
  • Nothing about your Ubuntu Pro account. Only whether Pro is attached, the state of Livepatch and ESM, and when the subscription ends. Not the account, the contract or the machine ID.

It reads some configuration files to answer the questions in the tables, such as certbot's renewal configs, APT and dnf-automatic settings, and the Ubuntu Pro cache. It sends the answers listed below, not the files.

Every field ​

A field is left out when the agent cannot tell, and that is different from zero: "no updates" is 0, "could not check" is absent. Lists are capped, and a string over its limit makes InfraNest refuse the whole push, not only that field.

Every reading ​

Sent with every reading, by default every 60 seconds.

FieldTypeLimitsWhat it is
collected_attime (RFC 3339)When the reading was taken. Defaults to when it arrived
cpu_percentnumber0 to 100CPU in use: user plus system time, not counting steal or iowait
memory_percentnumber0 to 100Memory in use
memory_used_bytesinteger0 or moreMemory in use: total minus what the kernel calls available
memory_total_bytesinteger0 or moreTotal memory
swap_used_bytesinteger0 or moreSwap in use
load_1number0 to 10,000Load average over 1 minute. Absent on Windows
load_5number0 to 10,000Load average over 5 minutes
load_15number0 to 10,000Load average over 15 minutes
uptime_secondsinteger0 or moreSeconds since boot
network_in_bpsinteger0 or moreBytes per second received since the previous reading, on interfaces backed by a device
network_out_bpsinteger0 or moreBytes per second sent since the previous reading
disk_read_bpsinteger0 or moreBytes per second read from whole disks since the previous reading
disk_write_bpsinteger0 or moreBytes per second written since the previous reading
pressure_cpunumber0 to 100Share of the last minute some work waited for CPU (Linux pressure stall information)
pressure_memorynumber0 to 100The same for memory
pressure_memory_fullnumber0 to 100Share of the last minute all work waited for memory
pressure_ionumber0 to 100Share of the last minute some work waited for disk
pressure_io_fullnumber0 to 100Share of the last minute all work waited for disk

Disk space, per mount ​

Sent with every reading. Only bytes and inodes: the server works out the percentage.

FieldTypeLimitsWhat it is
mountslistup to 64The mounted filesystems
mounts[].mount_pointstringup to 191 characters; requiredWhere it is mounted, such as /var
mounts[].devicestringup to 191 charactersThe device, such as /dev/sda1
mounts[].used_bytesinteger0 or more; requiredBytes used
mounts[].total_bytesintegerat least 1; requiredSize in bytes
mounts[].inodes_usedinteger0 or moreInodes used. Absent where the filesystem has no fixed inode table
mounts[].inodes_totalintegerat least 1Inodes in total

The machine itself ​

A snapshot of the machine, applied from the newest reading in each push.

FieldTypeLimitsWhat it is
systemobjectThe machine
system.kernelstringup to 128 charactersKernel version
system.osstringup to 128 charactersOperating system and version
system.pending_updatesinteger0 to 100,000Updates waiting to be installed
system.security_updatesinteger0 to 100,000Of those, security updates
system.reboot_requiredbooleanA reboot is needed to finish updates
system.reboot_reasonstringup to 16 charactersWhat said so: flag_file, newer_kernel, …
system.newest_kernelstringup to 128 charactersThe newer installed kernel
system.auto_updateobjectWhether the machine installs updates by itself
system.auto_update.sourcestringup to 32 charactersunattended-upgrades or dnf-automatic
system.auto_update.enabledbooleanIt installs updates on its own
system.auto_update.rebootbooleanIt reboots on its own when an update needs it
system.auto_update.reboot_timestringup to 32 charactersWhen it reboots, as configured
system.auto_update.reboot_with_usersbooleanIt reboots while someone is logged in
system.auto_update.utc_offset_minutesinteger-900 to 900The machine's offset from UTC
system.oom_killsinteger0 to 1,000,000,000Processes the kernel killed for lack of memory since boot
system.boot_idstringup to 64 charactersAn ID that changes on every boot
system.cpusinteger1 to 4,096CPUs the kernel can use
system.raidlistup to 32Software RAID arrays, from /proc/mdstat
system.raid[].namestringup to 32 characters; requiredThe array, such as md0
system.raid[].levelstringup to 16 charactersIts level, such as raid1
system.raid[].statestringup to 16 characters; requiredactive or inactive
system.raid[].devicesinteger0 to 1,024Members it is built for
system.raid[].activeinteger0 to 1,024Members working
system.raid[].failedinteger0 to 1,024Members marked failed
system.raid[].syncstringup to 16 charactersA resync, recovery or check in progress
system.raid[].sync_percentnumber0 to 100How far it is
system.time_syncedbooleanThe kernel considers its clock synchronised
system.time_error_msinteger0 to 2,147,483,647No longer sent by the agent; still accepted
system.proobjectUbuntu Pro, from its client's world-readable cache. Never the account or contract
system.pro.attachedbooleanAttached to a subscription
system.pro.livepatchstringup to 32 charactersLivepatch's state
system.pro.esm_infrastringup to 32 charactersESM Infra's state
system.pro.expirestime (RFC 3339)When the subscription ends

Services ​

systemd units that are enabled or have failed (Windows: automatic-start services). On by default; INFRANEST_SERVICES=0 turns it off.

FieldTypeLimitsWhat it is
serviceslistup to 200The watched units
services[].unitstringup to 255 characters; requiredThe unit's name, such as nginx.service
services[].descriptionstringup to 255 charactersIts description
services[].active_statestringup to 32 characters; requiredsystemd's state: active, failed, …
services[].sub_statestringup to 32 characterssystemd's sub-state: running, exited, …
services[].state_changed_attime (RFC 3339)When it entered that state
services[].resultstringup to 32 charactersWhy a failed unit failed, one word from systemd: exit-code, oom-kill, timeout, … Never log output
services[].exec_main_codeinteger-16 to 16How its main process ended: exited, killed or dumped
services[].exec_main_statusinteger-2,147,483,648 to 2,147,483,647The exit status, or the signal
services[].restartsinteger0 to 100,000,000How many times systemd restarted it
services[].memory_bytesinteger0 to 1,099,511,627,776Memory its cgroup uses

Containers ​

Running Docker and Podman containers, read from the units systemd keeps for them — never from the Docker socket.

FieldTypeLimitsWhat it is
containerslistup to 100The running containers
containers[].idstringup to 64 characters; requiredThe short container ID. No name: that is only readable as root
containers[].runtimestringup to 32 charactersdocker or podman
containers[].active_statestringup to 32 charactersThe state of its systemd scope
containers[].started_attime (RFC 3339)When it last started
containers[].restartsinteger0 to 100,000,000Restarts the agent has seen
containers[].memory_bytesinteger0 to 1,099,511,627,776Memory it uses

Certificate renewers ​

What renews certificates here: certbot, Caddy, Traefik. Only world-readable files are read. On by default; INFRANEST_RENEWERS=0 turns it off.

FieldTypeLimitsWhat it is
renewerslistup to 50What renews certificates
renewers[].toolstringone of certbot, caddy, traefik; requiredWhich tool
renewers[].namestringup to 255 characterscertbot's name for the certificate, or its main name
renewers[].domainslistup to 100The names it renews
renewers[].domains[]stringup to 253 charactersOne name
renewers[].domains_guessedbooleanThe names are guessed from the certificate's name rather than read
renewers[].not_aftertime (RFC 3339)When the certificate expires, only if its file is readable
renewers[].sourcestringup to 512 charactersThe file this was read from
renewers[].authenticatorstringup to 64 characterscertbot's authenticator: webroot, nginx, dns-…
renewers[].installerstringup to 64 characterscertbot's installer: nginx or apache
renewers[].hookslistup to 8Which kinds of hook run after a renewal: deploy, post. Never the commands
renewers[].hooks[]stringup to 32 charactersOne kind
renewers[].unitstringup to 255 charactersThe systemd timer that runs it
renewers[].last_run_attime (RFC 3339)When the timer last fired
renewers[].last_resultstringup to 32 charactersHow that run finished, systemd's word
renewers[].next_run_attime (RFC 3339)When it fires next
renewers[].unreadablebooleanThe store exists and the agent was not allowed to read it
renewers[].modestringup to 8 charactersIts permissions
renewers[].root_ownedbooleanOwned by root

Processes ​

Off by default. Sent only when INFRANEST_PROCESSES=1.

FieldTypeLimitsWhat it is
processeslistup to 32The largest processes by memory
processes[].commandstringup to 255 characters; requiredThe executable's name. The full command line only if you also set INFRANEST_PROCESS_ARGS=1
processes[].cpu_percentnumber0 to 100Share of one core since the previous reading
processes[].memory_bytesinteger0 or moreResident memory
processes[].pidinteger0 or moreProcess ID
processes[].started_attime (RFC 3339)When it started

Once per push ​

Beside the readings, once for the whole push.

FieldTypeLimitsWhat it is
failedobjectup to 32Collectors that could not read what they were asked for
failed.<collector>stringup to 255 charactersWhy, per collector name
agent_versionstringup to 32 charactersThe agent's version
collectorsobjectWhich optional collectors are switched on, sent even when they are off
collectors.processesbooleanProcesses are collected
collectors.process_argsbooleanFull command lines are collected
collectors.servicesbooleanServices are collected
collectors.renewersbooleanCertificate renewers are collected

What is filling a disk ​

At most once an hour, for the fullest mount only: the largest directories, and the ones the agent was not allowed to read.

FieldTypeLimitsWhat it is
disk_usageobjectOne mount's largest directories
disk_usage.mount_pointstringup to 191 characters; requiredWhich mount was looked at
disk_usage.scanned_attime (RFC 3339)When
disk_usage.partialbooleanThe look ran out of time; there may be more
disk_usage.dirslistup to 16The largest directories, four levels deep at most
disk_usage.dirs[].pathstringup to 512 characters; requiredThe directory
disk_usage.dirs[].bytesinteger0 or more; requiredThe size of the files in it
disk_usage.dirs[].kindstringup to 64 charactersA plain name where the agent recognises it, such as "docker images and containers"
disk_usage.accounted_bytesinteger0 or moreEverything the look counted, listed or not
disk_usage.unreadablelistup to 16Directories the agent was not allowed to read. Named, never sized
disk_usage.unreadable[].pathstringup to 512 characters; requiredThe directory
disk_usage.unreadable[].modestringup to 8 charactersIts permissions, as ls -l shows them
disk_usage.unreadable[].root_ownedbooleanOwned by root
disk_usage.more_unreadableinteger0 or moreHow many more refusals were not named

How long it is kept ​

InfraNest keeps every reading for 48 hours, for the detailed charts. Hourly averages are kept for as long as your plan keeps monitoring history:

PlanEvery readingHourly averages
Free48 hours30 days
Pro48 hours90 days
Business48 hours365 days
Enterprise48 hours3,650 days

An organization on a plan agreed separately may have other numbers; Settings → Subscription in the app shows yours. Turning off monitoring for a server makes InfraNest refuse its pushes and store nothing, and the agent then tries again only every 15 minutes.