grafana/provisioning | ||
prometheus | ||
snmp | ||
container_image.png | ||
LICENSE | ||
README.md |
MikroTik Monitoring with Grafana Dashboard
A self-contained monitoring stack (Grafana + Prometheus + SNMP Exporter) deployed inside a MikroTik RouterOS v7+ container environment to collect and visualize device metrics using SNMP.
This solution leverages the MikroTik Container feature introduced in RouterOS v7 to avoid the need for external servers.
Table of Contents
Overview
This project demonstrates how to deploy a complete monitoring stack directly on a MikroTik router using containers. It consists of:
- SNMP Exporter for retrieving SNMP metrics.
- Prometheus as the time-series database and metrics scraper.
- Grafana for dashboard visualization.
All components run within the MikroTik device itself, avoiding the cost and complexity of external infrastructure.
Prerequisites
- MikroTik RouterOS v7+ with Container feature support.
- A device with sufficient resources (e.g., RouterBoard L009UiGS ARM).
- Basic familiarity with WinBox or CLI.
- External storage (e.g., USB drive) recommended for container volumes.
Setup
1. Enable SNMP on MikroTik
- Navigate to IP > SNMP
- Enable SNMP (tick the checkbox), leave defaults.
2. Enable Container Support
a. Check if Container is enabled:
From a New Terminal in WinBox:
/system/device-mode/print
Ensure the output includes container: yes
.
b. If not enabled:
-
Download:
- Visit MikroTik Download Archive
- Select your RouterOS version and architecture (from WinBox in System > Resources)
- Download the
all_packages
ZIP
-
Install:
- Extract
container-*.npk
from the ZIP - Upload it to Files via WinBox
- Reboot the device
- Extract
-
Activate:
- Run:
system/device-mode/update container=yes
- Perform a full shutdown (unplug power or press the power button of the physical device)
- Verify again with:
system/device-mode/print
- Run:
3. Configure VETH and Network
After each step press Apply and then OK buttons.
a. Create a Docker bridge:
-
Bridge > Bridge: Add new interface named
docker
, leave defaults -
IP > Addresses: Add Address
192.168.50.1/24
, Network192.168.50.0
, Interfacedocker
-
IP > Firewall > NAT:
- Chain:
srcnat
- Src. Address:
192.168.50.0/24
- Action:
masquerade
- Chain:
b. Add VETH interfaces:
-
Interface → VETH tab, add 3 interfaces (Name → Address, Gateway):
grafana
→192.168.50.100/24
,192.168.50.1
snmp_exporter
→192.168.50.101/24
,192.168.50.1
prometheus
→192.168.50.102/24
,192.168.50.1
c. Bridge the interfaces:
- Bridge > Ports: Create a New Bridge Port for each VETH interface and add it to the
docker
bridge.
4. Prepare Configuration Files
-
Clone this repository and extract
grafana/
,prometheus/
,snmp/
folders. -
Edit the following:
-
Grafana Datasource (
grafana/provisioning/datasources.yml
):url: http://192.168.50.102:9090 # change it according with your prometheus VETH IP
-
Prometheus Config (
prometheus/prometheus.yml
):static_configs.targets
: use your MikroTik LAN IPrelabel_configs.replacement
:192.168.50.101:9116
(change it according with your snmp_exporter VETH IP)
-
-
Upload
grafana/
,prometheus/
,snmp/
folders to MikroTik via Files.
5. Define Environment Variables and Mounts
a. Container > Envs (Grafana only):
Key | Value |
---|---|
GF_SECURITY_ADMIN_USER | admin |
GF_SECURITY_ADMIN_PASSWORD | mikrotik |
GF_SECURITY_SIGN_UP | false |
b. Container > Mounts:
Use your own
src path
(e.g. path to an external usb drive attached to MikroTik)
Container | Src Path | Dst Path |
---|---|---|
grafana | /usb1/grafana/provisioning |
/etc/grafana/provisioning/ |
prometheus | /usb1/prometheus |
/etc/prometheus |
snmp | /usb1/snmp |
/etc/snmp_exporter |
6. Deploy and Start Containers
a. Configure Container settings:
Container > Container > Config:
- Registry URL:
https://registry-1.docker.io
- Tmp Dir:
/pull
(customizable e.g. path to an external usb drive attached to MikroTik)
b. Create containers:
After you fill out the fields of each container press Apply and wait for download/extracting until in status appear
stopped
(if it appear is all OK) then go to create the next container. If it showserror
, Copy the container, delete the old, and re-try to Apply.
Container > New Container
Container | Remote Image | Interface | Others |
---|---|---|---|
Grafana | grafana/grafana:9.1.0 |
grafana |
Envslist grafana , Mounts grafana , Root Dir /usb1/grafana_dir |
Prometheus | prom/prometheus:v2.53.0 |
prometheus |
Cmd: --config.file=/etc/prometheus/prometheus.yml , Mounts prometheus , Root Dir /usb1/prometheus_dir |
SNMP Exporter | prom/snmp-exporter:v0.26.0 |
snmp_exporter |
Cmd: --config.file=/etc/snmp_exporter/snmp.yml , Mounts snmp , Root Dir /usb1/snmp_dir |
Root Dir
is customizable e.g. path to an external usb drive attached to MikroTik
Accessing the Services
Ensure to start containers in order (SNMP Exporter, Prometheus and Grafana) and enjoy.
Start and Stop the container using the respective button.
Ensure the router and host are on the same LAN or routing is configured properly.
Service | URL |
---|---|
Grafana | http://192.168.50.100:3000 |
Prometheus | http://192.168.50.102:9090 |
SNMP Exporter | http://192.168.50.101:9116 |
Grafana credentials: admin / mikrotik
Known Issues & Troubleshooting
-
Grafana “No Data” Bug on ARM:
- Try increasing
$scrape_interval
to 30s in the dashboard query. - Fixed in Grafana ≥ 9.1.0
- Try increasing
-
Container Store Errors:
- Ensure container root dirs are unique.
- Deleting a container deletes its root directory.
- Always verify the root dir is marked as
container store
in Files. (and not asdirectory
)
-
Startup Failures:
- If container fails with
execve: No such file or directory
, verify paths, mounts, and retry with a different root dir.
- If container fails with
References
- Configuration and dashboard by @IgorKha: Dashboard #14420
- Special thanks to @rolando for guidance on MikroTik world.