In this article I’m going to describe the process of monitoring your VMs (in my case hosted on ProxMox) with Prometheus.
Download Node Exporter
The first step is to set-up Node Exporter, which is a “Prometheus exporter for hardware and OS metrics exposed by *NIX kernels, written in Go with pluggable metric collectors”, on a VM we would like to monitor.
Get the latest version from the Prometheus downloads page, by copying the link address of the tarball you require
curl -LO <Link Address>
Then unpack the tarball
tar -xvf <file>
Move the binary to
sudo mv <unpacked directory>/node_exporter /usr/local/bin/
Create a Custom Node Exporter Service
node_exporter user to run the node exporter service
sudo useradd -rs /bin/false node_exporter
Create a node_exporter service file under systemd
sudo vi /etc/systemd/system/node_exporter.service
Add the following service file content to the service file and save it.
[Unit] Description=Node Exporter After=network.target [Service] User=node_exporter Group=node_exporter Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target
Reload the system daemon and star the node exporter service.
sudo systemctl daemon-reload sudo systemctl start node_exporter
Check the node exporter status to make sure it is running in the active state
sudo systemctl status node_exporter
Enable the node exporter service to the system startup
sudo systemctl enable node_exporter
Now, node exporter would be exporting metrics on port 9100. You can see all the server metrics by visiting your server URL on
On whichever host you want to host Prometheus, create a
docker-compose.yml file and add the following contents, substituting
<path to directory> to where you would like to keep your prometheus configuration file:
version: "3.3" services: prometheus: image: prom/prometheus:v2.34.0 container_name: prometheus networks: - reporting ports: - 9090:9090 volumes: - <path to directory>/prometheus.yml:/etc/prometheus/prometheus.yml networks: reporting:
Then create the
prometheus.yml in the location you have specified, and add the following:
global: scrape_interval: 10s scrape_configs: - job_name: node metrics_path: /metrics static_configs: - targets: [ '<vm-host>:9100' ]
Now start prometheus with
docker-compose up -d.
All being well, you should be able to navigate to
http://<host ip>:9090/targets and see a list of targets you have configured.
Setting up Grafana (Optional)
To use Grafana, add the following service to your
grafana: image: grafana/grafana:8.4.4-ubuntu container_name: grafana networks: - reporting ports: - 3000:3000
And start the container with
docker-compose up -d.
Configure Prometheus Data Source
Navigate to the Grafana UI at
http://<host ip>:3000 and log in with the default username/password
Then go to Configuration > Data sources > Add data source > Prometheus. Specify a name for the data source, the HTTP url of the Prometheus instance (
http://prometheus:9090 if you’ve added everything as is detailed in this article) and click on
Save & test.
If you receive a “Data source is working” message, everything is working as intended.
Add a dashboard
Navigate to Create (+) > Import, add
Import via grafana.com and click
Load. Select the Prometheus data source that you created before and click
All being well, you should now have a good starting place to monitor your VMs.