So at home I have Asus RT-N14U router, which has 600 Mhz MIPS architecture CPU, 16mb of flash storage and 64mb of RAM. On the software side, I’m running Andy Padavan’s RT-N56U firmware (Thank you, Andy!), this firmware gives you all the router features, I think raw Linux, ssh and some basic tools.

So Node exporter is written in Go, why not just go build ? So what I did is just simply cross compile into MIPS little endian architecture:

git clone [email protected]:prometheus/node_exporter.git cd node_exporter GOARCH='mipsle' GOOS=linux go build

Success! We have a node_exporter executable. By the way, you can checkout specific version (eg git checkout release-0.16 ) if you like, I usually run master for the latest and greatest 😉

So now, let’s just copy the built executable into the router

scp node_exporter router:~/ node_exporter 89% 13MB 2.0MB/s 00:00 ETAscp: /home/admin//node_exporter: No space left on device node_exporter

Turns out that I only have 1MB of space in my home dir:

Filesystem Size Used Available Use% Mounted on rootfs 8.5M 8.5M 0 100% / /dev/root 8.5M 8.5M 0 100% / tmpfs 8.0K 0 8.0K 0% /dev tmpfs 2.0M 180.0K 1.8M 9% /etc tmpfs 1.0M 8.0K 1016.0K 1% /home tmpfs 8.0K 0 8.0K 0% /media tmpfs 8.0K 0 8.0K 0% /mnt tmpfs 24.0M 76.0K 23.9M 0% /tmp tmpfs 4.0M 192.0K 3.8M 5% /var

and Node exporter’s executable size is around ~15mb, So, I attached usb, copied file scp node_exporter router:/media/UBUNTU_17_0/ into mounted usb and tried to launch it:

time="2018-04-14T15:15:00Z" level=info msg="Starting node_exporter (version=, branch=, revision=)" source="node_exporter.go:82" time="2018-04-14T15:15:00Z" level=info msg="Build context (go=go1.10.1, user=, date=)" source="node_exporter.go:83" time="2018-04-14T15:15:00Z" level=info msg="Enabled collectors:" source="node_exporter.go:90" time="2018-04-14T15:15:00Z" level=info msg=" - arp" source="node_exporter.go:97" time="2018-04-14T15:15:00Z" level=info msg=" - bcache" source="node_exporter.go:97" time="2018-04-14T15:15:00Z" level=info msg=" - bonding" source="node_exporter.go:97" time="2018-04-14T15:15:00Z" level=info msg=" - conntrack" source="node_exporter.go:97" time="2018-04-14T15:15:00Z" level=info msg=" - cpu" source="node_exporter.go:97"

…

time=”2018-04-14T15:15:00Z” level=info msg=” – vmstat” source=”node_exporter.go:97″

time=”2018-04-14T15:15:00Z” level=info msg=” – wifi” source=”node_exporter.go:97″

time=”2018-04-14T15:15:00Z” level=info msg=” – xfs” source=”node_exporter.go:97″

time=”2018-04-14T15:15:00Z” level=info msg=” – zfs” source=”node_exporter.go:97″

time=”2018-04-14T15:15:00Z” level=info msg=”Listening on :9100″ source=”node_exporter.go:111″

Woohoo it’s working!

Let’s add a Grafana dashboard, to look at those exported metrics:

I’ve used Host Stats – Prometheus Node Exporter grafana dashboard, just had to change it, as all of the labels have changed in recent release of exporter. You can find this fixed dashboard in https://grafana.com/dashboards/5573.

Getting back to the Node exporter, so now that we have node exporter running, how do we start it on router boot?

This Linux is very limited and doesn’t support systemd. So, looking at what other options are available I found that there is crontab (you need to enable it via UI). So first thing I tried:

@reboot /media/UBUNTU_17_0/node_exporter >> /media/UBUNTU_17_0/node_exporter.log 2>&1

Restarted router and nope, @reboot doesn’t seem to work, no surprises here, as this router is very limited.

So this leads us doing things “the old way”: running a cron script every minute or so checking for process existence and starting if it’s not there.

Here is the script:

#!/bin/bash pidof node_exporter if [[ $? -ne 0 ]] ; then /media/UBUNTU_17_0/node_exporter >> /media/UBUNTU_17_0/node_exporter.log 2>&1 & fi

And the crontab:

* * * * * /media/UBUNTU_17_0/ne.sh

Thats all, thanks for reading!