# izzudin96/nadi-agent architecture

> Architecture diagram of the GitHub repository izzudin96/nadi-agent, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/izzudin96/nadi-agent
- Repository: https://github.com/izzudin96/nadi-agent

## Overview

nadi-agent is a device-monitoring agent: it loads device and server settings, periodically gathers enabled system metrics, packages them as heartbeats, and sends them to nadi-server. Failed sends are persisted and retried with backoff. The graph includes the major collector capability families indicated by the source tree; wiring within unsampled collector implementations is not expanded beyond the registry’s documented role.

Main entry points: [`internal/collector/registry.go`](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/registry.go) (Collector registry), [`cmd/nadi-agent/main.go`](https://github.com/izzudin96/nadi-agent/blob/main/cmd/nadi-agent/main.go) (Agent entrypoint), [`internal/agent/agent.go`](https://github.com/izzudin96/nadi-agent/blob/main/internal/agent/agent.go) (Collection loop), [`internal/sender/sender.go`](https://github.com/izzudin96/nadi-agent/blob/main/internal/sender/sender.go) (HTTP sender)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_startup["Startup and configuration"]
  node_configfile["Agent config"]
  node_entry["Agent entrypoint<br/>[main.go]"]
  node_config["Config loader<br/>[config.go]"]
end

subgraph group_collection["Metric collection"]
  node_registry["Collector registry<br/>[registry.go]"]
  node_system["System metrics<br/>[cpu.go]"]
  node_memory["Memory metrics<br/>[memory.go]"]
  node_disk["Disk metrics<br/>[disk.go]"]
  node_smart["Disk SMART<br/>[disk_smart.go]"]
  node_network["Network metrics<br/>[network.go]"]
  node_platform["Platform sensors<br/>[energy.go]"]
  node_gpu["GPU metrics<br/>[gpu.go]"]
  node_temperature["Temperature metrics<br/>[temperature.go]"]
  node_turn["TURN metrics<br/>[turn.go]"]
  node_selfmetrics["Agent metrics<br/>[self.go]"]
end

subgraph group_delivery["Heartbeat delivery"]
  node_agent["Collection loop<br/>[agent.go]"]
  node_payload["Heartbeat schema<br/>[payload.go]"]
  node_sender["HTTP sender<br/>[sender.go]"]
end

subgraph group_resilience["Durable retry"]
  node_buffer["Disk-backed queue<br/>[buffer.go]"]
  node_backoff["Retry backoff<br/>[backoff.go]"]
end

node_operator(("Agent operator"))
node_server(("Nadi server"))

node_operator -->|"provides settings"| node_configfile
node_entry -->|"loads config"| node_config
node_configfile -->|"read settings"| node_config
node_entry -->|"creates registry"| node_registry
node_entry -->|"creates sender"| node_sender
node_entry -->|"opens queue"| node_buffer
node_entry -->|"starts loop"| node_agent
node_agent -->|"collects metrics"| node_registry
node_registry -->|"runs enabled"| node_system
node_registry -->|"runs enabled"| node_memory
node_registry -->|"runs enabled"| node_disk
node_registry -->|"runs enabled"| node_smart
node_registry -->|"runs enabled"| node_network
node_registry -->|"runs enabled"| node_platform
node_registry -->|"runs enabled"| node_gpu
node_registry -->|"runs enabled"| node_temperature
node_registry -->|"runs enabled"| node_turn
node_registry -->|"runs enabled"| node_selfmetrics
node_agent -->|"builds and sends"| node_sender
node_sender -->|"serializes heartbeat"| node_payload
node_sender -->|"posts heartbeat"| node_server
node_agent -->|"queues and flushes"| node_buffer
node_buffer -->|"persists entries"| node_buffer
node_agent -->|"schedules retries"| node_backoff

click node_entry "https://github.com/izzudin96/nadi-agent/blob/main/cmd/nadi-agent/main.go"
click node_config "https://github.com/izzudin96/nadi-agent/blob/main/internal/config/config.go"
click node_registry "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/registry.go"
click node_system "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/cpu.go"
click node_memory "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/memory.go"
click node_disk "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/disk.go"
click node_smart "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/disk_smart.go"
click node_network "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/network.go"
click node_platform "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/energy.go"
click node_gpu "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/gpu.go"
click node_temperature "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/temperature.go"
click node_turn "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/turn.go"
click node_selfmetrics "https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/self.go"
click node_agent "https://github.com/izzudin96/nadi-agent/blob/main/internal/agent/agent.go"
click node_payload "https://github.com/izzudin96/nadi-agent/blob/main/internal/payload/payload.go"
click node_sender "https://github.com/izzudin96/nadi-agent/blob/main/internal/sender/sender.go"
click node_buffer "https://github.com/izzudin96/nadi-agent/blob/main/internal/buffer/buffer.go"
click node_backoff "https://github.com/izzudin96/nadi-agent/blob/main/internal/backoff/backoff.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_configfile,node_entry,node_config toneBlue
class node_registry,node_system,node_memory,node_disk,node_smart,node_network,node_platform,node_gpu,node_temperature,node_turn,node_selfmetrics toneAmber
class node_agent,node_payload,node_sender,node_server toneMint
class node_buffer,node_backoff toneRose
class node_operator toneIndigo
```

## Components

### Startup and configuration

- **Agent config**
- [Agent entrypoint](https://github.com/izzudin96/nadi-agent/blob/main/cmd/nadi-agent/main.go): `cmd/nadi-agent/main.go`
- [Config loader](https://github.com/izzudin96/nadi-agent/blob/main/internal/config/config.go): `internal/config/config.go`

### Metric collection

- [Collector registry](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/registry.go): `internal/collector/registry.go`
- [System metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/cpu.go): `internal/collector/cpu.go`
- [Memory metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/memory.go): `internal/collector/memory.go`
- [Disk metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/disk.go): `internal/collector/disk.go`
- [Disk SMART](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/disk_smart.go): `internal/collector/disk_smart.go`
- [Network metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/network.go): `internal/collector/network.go`
- [Platform sensors](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/energy.go): `internal/collector/energy.go`
- [GPU metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/gpu.go): `internal/collector/gpu.go`
- [Temperature metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/temperature.go): `internal/collector/temperature.go`
- [TURN metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/turn.go): `internal/collector/turn.go`
- [Agent metrics](https://github.com/izzudin96/nadi-agent/blob/main/internal/collector/self.go): `internal/collector/self.go`

### Heartbeat delivery

- [Collection loop](https://github.com/izzudin96/nadi-agent/blob/main/internal/agent/agent.go): `internal/agent/agent.go`
- [Heartbeat schema](https://github.com/izzudin96/nadi-agent/blob/main/internal/payload/payload.go): `internal/payload/payload.go`
- [HTTP sender](https://github.com/izzudin96/nadi-agent/blob/main/internal/sender/sender.go): `internal/sender/sender.go`

### Durable retry

- [Disk-backed queue](https://github.com/izzudin96/nadi-agent/blob/main/internal/buffer/buffer.go): `internal/buffer/buffer.go`
- [Retry backoff](https://github.com/izzudin96/nadi-agent/blob/main/internal/backoff/backoff.go): `internal/backoff/backoff.go`

### Other components

- **Agent operator**
- **Nadi server**

## Connections

- Agent operator → Agent config: provides settings
- Agent entrypoint → Config loader: loads config
- Agent config → Config loader: read settings
- Agent entrypoint → Collector registry: creates registry
- Agent entrypoint → HTTP sender: creates sender
- Agent entrypoint → Disk-backed queue: opens queue
- Agent entrypoint → Collection loop: starts loop
- Collection loop → Collector registry: collects metrics
- Collector registry → System metrics: runs enabled
- Collector registry → Memory metrics: runs enabled
- Collector registry → Disk metrics: runs enabled
- Collector registry → Disk SMART: runs enabled
- Collector registry → Network metrics: runs enabled
- Collector registry → Platform sensors: runs enabled
- Collector registry → GPU metrics: runs enabled
- Collector registry → Temperature metrics: runs enabled
- Collector registry → TURN metrics: runs enabled
- Collector registry → Agent metrics: runs enabled
- Collection loop → HTTP sender: builds and sends
- HTTP sender → Heartbeat schema: serializes heartbeat
- HTTP sender → Nadi server: posts heartbeat
- Collection loop → Disk-backed queue: queues and flushes
- Disk-backed queue → Disk-backed queue: persists entries
- Collection loop → Retry backoff: schedules retries
