In our previous post, we installed a Prometheus server on Ubuntu. Now let's talk about how Prometheus actually gathers data — and why we need Node Exporter to do it.
Prometheus uses a pull model. It does not wait for systems to send data. Instead, it reaches out to a configured list of targets at a fixed interval and scrapes an HTTP endpoint that exposes metrics. That endpoint must speak the Prometheus text-based exposition format. This is where Node Exporter comes in.
When Prometheus scrapes
In a Mule-based observability stack using Prometheus, a Node Exporter will be necessary for Standalone or Runtime Fabric deployments. The Node Exporter will be installed on the Standalone node or the K8s worker nodes that host Runtime Fabric. That allows us to monitor the health of the infrastructure supporting our Mule runtimes and answer questions like:
This user will own only the Node Exporter binary. It cannot log in. It cannot write files outside its scope.

Verify the download with the checksum published on the releases page:
Compare the output against the

This creates a directory named
Copy it to
Set the correct ownership:

The terminal will show output like this:


We will see a large block of text that looks like this:

Find the
Replace
Save and close the file.
If Prometheus is not running as a systemd service yet, use:
We will see two targets listed. The
Click Execute. Prometheus will return current CPU counters from the Node Exporter target. We now have a working scrape pipeline from Prometheus to a Linux host.

However, this setup has a critical limitation: if the terminal closes, Node Exporter stops. A production system cannot depend on a foreground process. In the next post, we set up Node Exporter the right way — as a managed
Prometheus uses a pull model. It does not wait for systems to send data. Instead, it reaches out to a configured list of targets at a fixed interval and scrapes an HTTP endpoint that exposes metrics. That endpoint must speak the Prometheus text-based exposition format. This is where Node Exporter comes in.
What Is Node Exporter?
Node Exporter is an official Prometheus exporter maintained by the Prometheus project. It runs as a process on the machine we want to monitor. It reads data from the Linux kernel — CPU usage, memory, disk I/O, network traffic, filesystem stats, and more — and exposes that data at a local HTTP endpoint on port9100.When Prometheus scrapes
http://<host>:9100/metrics, it gets a snapshot of the machine's health at that moment.Why Is Node Exporter Necessary? Is it required for Mule?
Prometheus has no built-in way to read host-level metrics from Linux. It monitors itself and knows how to scrape other Prometheus-compatible endpoints, but it cannot talk directly to the kernel. Node Exporter fills that gap.In a Mule-based observability stack using Prometheus, a Node Exporter will be necessary for Standalone or Runtime Fabric deployments. The Node Exporter will be installed on the Standalone node or the K8s worker nodes that host Runtime Fabric. That allows us to monitor the health of the infrastructure supporting our Mule runtimes and answer questions like:
- CPU — is the host saturated?
- Disk — are logs or persistence layers filling up?
- Network — is there packet loss or saturation on the host?
Node Exporter Installation on Ubuntu
Now that we know how Node Exporter can help us in our Observability stack, let’s see the installation steps for a Node Exporter on Ubuntu. This post is for getting Node Exporter running quickly on a single Ubuntu machine. We will install it, run it as a foreground process, confirm it exposes metrics, and add it as a scrape target in Prometheus.Note: This is a development or testing setup. Do not use it in production. In our next post we will cover the production-grade approach.
Prerequisites
- Ubuntu 20.04 or 22.04 server
- A running Prometheus server (see the post How to Install Prometheus on Ubuntu Server)
- A user with
sudoprivileges - Internet access on the target machine
Step 1 — Create a Dedicated System User
We never run exporters as root. Let's create a system user with no login shell and no home directory.sudo useradd --no-create-home --shell /bin/false node_exporterStep 2 — Download Node Exporter
Go to the official Prometheus downloads page and copy the link for the latest Linux AMD64 release. At the time of writing, the current stable version is 1.10.2Open a terminal to your Ubuntu server and run:
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gzsha256sum node_exporter-1.10.2.linux-amd64.tar.gzCompare the output against the
.sha256 file on GitHub. They must match before we proceed.Step 3 — Extract and Install the Binary
tar xvfz node_exporter-1.10.2.linux-amd64.tar.gznode_exporter-1.10.2.linux-amd64. Inside it, the only file we need is the node_exporter binary.Copy it to
/usr/local/bin:sudo cp node_exporter-1.10.2.linux-amd64/node_exporter /usr/local/bin/sudo chown node_exporter:node_exporter /usr/local/bin/node_exporterClean up the download files:
rm -rf /tmp/node_exporter-1.10.2.linux-amd64*Step 4 — Run Node Exporter
Switch to thenode_exporter user and start the process:sudo -u node_exporter /usr/local/bin/node_exporterNode Exporter is now running and listening on port
9100. Leave this terminal open.Step 5 — Test the Metrics Endpoint
Open a second terminal session on the same machine and run:curl http://localhost:9100/metricsEach line that does not start with
# is a metric. The # HELP lines describe the metric. The # TYPE lines declare its type (counter, gauge, histogram, summary). This is the Prometheus exposition format.Step 6 — Open Port 9100 in the Firewall
Our Prometheus server needs to reach port9100 on this machine. Before doing any test from the Prometheus server makes sure this port is open for the Prometheus server to access the Node Exporter endpoint.Step 7 — Add the Node Exporter as a Scrape Target in Prometheus
On the Prometheus server machine, open the Prometheus configuration file:sudo nano /etc/prometheus/prometheus.ymlscrape_configs section. Add a new job entry for Node Exporter:scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['<NODE_EXPORTER_HOST_IP>:9100']<NODE_EXPORTER_HOST_IP> with the actual IP address or DNS name of the machine running Node Exporter.Save and close the file.
Step 8 — Reload Prometheus
Prometheus supports a hot reload without a full restart. Send it aSIGHUP signal:sudo systemctl reload prometheuskill -HUP $(pgrep prometheus)Step 9 — Verify the Target in Prometheus UI
Open a browser and go to:http://<PROMETHEUS_SERVER_IP>:9090/targetsnode_exporter job should show state UP with a green badge. If it shows DOWN, double-check the IP address in prometheus.yml, confirm port 9100 is open, and make sure Node Exporter is still running.Step 10 — Run a Test Query
In the Prometheus UI, go to the Graph tab and enter this query in the expression bar:node_cpu_seconds_totalSummary
We installed Node Exporter, ran it as a foreground process, tested the metrics endpoint, and connected it to our Prometheus server. We can now query host-level metrics from any machine running Node Exporter.However, this setup has a critical limitation: if the terminal closes, Node Exporter stops. A production system cannot depend on a foreground process. In the next post, we set up Node Exporter the right way — as a managed
systemd service.