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!