diff --git a/README.md b/README.md index fbd9033..90885ca 100644 --- a/README.md +++ b/README.md @@ -1,159 +1,219 @@ # MikroTik Monitoring with Grafana Dashboard -Grafana Dashboard in MikroTik Container to monitor a MikroTik device (using SNMP).\ -[See preview images](#dashboard-screen). -In this project we will use MikroTik Container to monitor the MikroTik itself (using SNMP).\ -Using it reduce the costs and complexity derived from using/deploying a dedicated machine for the same objective. +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. -DISCLAIMER: [MikroTik Container](https://help.mikrotik.com/docs/display/ROS/Container) is a MikroTik feature available from RouterOS v7, you can [update](https://help.mikrotik.com/docs/display/ROS/Upgrading+and+installation#:~:text=using%20this%20method.-,Manual%20upgrade%20process,-First%20step%20%2D%20visit) yours if lower. +> This solution leverages the [MikroTik Container](https://help.mikrotik.com/docs/display/ROS/Container) feature introduced in RouterOS v7 to avoid the need for external servers. -We can monitor MikroTik using 3 Containers (SNMP Exporter + Prometheus + Grafana).\ -[SNMP Exporter](https://hub.docker.com/r/prom/snmp-exporter), [Prometheus](https://hub.docker.com/r/prom/prometheus) and [Grafana](https://hub.docker.com/r/grafana/grafana) are a well known stack of tools that enable to monitor any type of device with appropriate configurations.\ -In this scenario the metrics are retrieved in real time with SNMP, Prometheus act as timeseries database with query and Grafana had that sweet dashboards. +--- -In my configuration I have a MikroTik RouterBoard L009UiGS (ARM) with ROS v7.12 but the steps are very general and almost equal for every version. -# Setup steps -First of all Enable SNMP on MikroTik in IP->SNMP, tick the box and leave others as default. -## 1. MikroTik activate Container feature -First of all we have to activate the *Container* package on MikroTik, to default it is disabled.\ -To check if it is also activated in WinBox, open *New Terminal* and run: -`system/device-mode/pr`\ -After the mode (e.g. `mode: enterprise`) should be compare the string `container: yes`\ -If you have already activated it, go next to the step 2.\ -Else if not you have to **download, install and activate the package**. +## Table of Contents -1. **Download** - - Go to https://mikrotik.com/download/archive - - Select your ROS version - - Download the *all_packages* zip of your architecture - - You can see your architecture in WinBox `System->Resources` +* [Overview](#overview) +* [Prerequisites](#prerequisites) +* [Step-by-Step Setup](#step-by-step-setup) + * [1. Enable SNMP on MikroTik](#1-enable-snmp-on-mikrotik) + * [2. Enable Container Support](#2-enable-container-support) + * [3. Configure VETH and Network](#3-configure-veth-and-network) + * [4. Prepare Configuration Files](#4-prepare-configuration-files) + * [5. Define Environment Variables and Mounts](#5-define-environment-variables-and-mounts) + * [6. Deploy and Start Containers](#6-deploy-and-start-containers) +* [Accessing the Services](#accessing-the-services) +* [Known Issues & Troubleshooting](#known-issues--troubleshooting) +* [References](#references) -2. **Install** - - From the downloaded zip extract file *"container-X.Y.npk"* and upload it inside *Files* in MikroTik (you can Drag and Drop the file inside WinBox) - - Now *System->Reboot* the MikroTik in order to install the package - - After that you can already see *Container* features on the left bar of WinBox but you still cannot use it until you activate it. +--- -3. **Activate** - - In WinBox, open *New Terminal* and run: - - `system/device-mode/update container=yes` - - After that you have to shutdown the MikroTik as explained in the CLI, turning power off or pressing button of MikroTik device, otherwise the activation is stopped. - - If the activation worked after the boot you can check running in New Terminal `system/device-mode/pr` again as above. +## Overview -## 2. MikroTik VETH interfaces configuration -Note: After each following step press before *Apply* and then *OK* buttons. -1. Go to *Bridge* and in *Bridge* tab create a *New Interface* - - Name: docker - - Leave the rest of fields as default -2. Go to *IP->Addresses* add a *New Address* - - Address: 192.168.50.1/24 - - Network: 192.168.50.0 - - Interface select "docker" -3. Go to *IP->Firewall* in *NAT* tab create a *New NAT Rule* - - Chain select "srcnat" - - Src. Address: 192.168.50.0/24 - - (This is the *Addresses* of the *Bridge* "docker") - - Go to *Action* tab and as *Action* select "masquerade" -4. Go to *Interfaces* and in *VETH* tab add 3 *Interfaces* (*Copy* the first to speed up the process) - 1. *New Interface* for **Grafana** - - Name: grafana - - Address: 192.168.50.100/24 - - Gateway: 192.168.50.1 - 2. *New Interface* for **SNMP Exporter** - - Name: snmp_exporter - - Address: 192.168.50.101/24 - - Gateway: 192.168.50.1 - 3. *New Interface* for **Prometehus** - - Name: prometheus - - Address: 192.168.50.102/24 - - Gateway: 192.168.50.1 -5. Go to *Bridge* and in *Ports* tab **create a *New Bridge Port* for each *VETH interface*** (grafana, snmp_exporter, prometheus) created above and select *"docker"* as Bridge. - - (In order to Bridge all the interfaces on the same subnet LAN) +This project demonstrates how to deploy a complete monitoring stack directly on a MikroTik router using containers. It consists of: -## 3. Configuration files -Prepare configuration files for containers. -1. Download the 3 folders (grafana, prometheus and snmp) from the repository. -2. Modify files as follow: - - grafana/provisioning/datasource.yml - - url: http://192.168.50.102:9090 - - (or your prometheus VETH IP) - - prometheus/prometheus.yml - - in *job_name MikroTik* change targets to your Mikrotik ip (MikroTik IP where SNMP is enabled) - - in *replacement* put the snmp_exporter VETH IP: 192.168.50.101:9116 -3. Finally load the 3 folders in MikroTik ***Files***. +* **SNMP Exporter** for retrieving SNMP metrics. +* **Prometheus** as the time-series database and metrics scraper. +* **Grafana** for dashboard visualization. -## 4. MikroTik Containers configuration -First of all we have to to set the Environment variables and Mount path to volume for our Containers. -1. Go to *Container* and in **Envs** tab.\ - The Envs interest only the grafana container, we define this 3 envs for it: - - Name: `grafana`, Key: `GF_SECURITY_ADMIN_USE`, Value: `admin` - - Name: `grafana`, Key: `GF_SECURITY_ADMIN_PASSWORD`, Value: `mikrotik` - - Name: `grafana`, Key: `GF_SECURITY_SIGN_UP`, Value: `false` +All components run within the MikroTik device itself, avoiding the cost and complexity of external infrastructure. -2. Go to *Container* and in **Mounts** tab.\ - Note: all *src path* is at your choice e.g. path to an external usb drive attached to MikroTik. - There are one Mount for each container: - - Name: `grafana`, Src: `/usb1/grafana/provisioning`, Dst: `/etc/grafana/provisioning/` - - Name: `prometheus`, Src: `/usb1/prometheus`, Dst: `/etc/prometheus` - - Name: `snmp`, Src: `/usb1/snmp`, Dst: `/etc/snmp_exporter` +![Grafana Dashboard Screenshot](https://github.com/IgorKha/Grafana-Mikrotik/blob/master/readme/screen.png) -3. Finally, go to *Container* and in **Container** tab press *Config* button - - Registry URL: https://registry-1.docker.io - - Tmp Dir: /pull - - (This path is at your choice e.g. path to an external usb drive attached to MikroTik) +--- -4. Now in tab Container we can create a container for each VETH created before.\ - Note: in each container the `Root Dir` path field is at your choice (e.g. path to an external usb drive attached to MikroTik e.g. `/usb1/grafana_dir`).\ - **After you fill out the fields of each container press *Apply* and wait for download/extracting of the container until in status appear *"stopped"* (if it appear is all OK) then go to create the next container, else if appear status: "*error*", *Copy* the container, delete the old, and re-try to *Apply*.** - - New Container for Grafana - - Remote Image: grafana/grafana:9.1.0 - - Interface select *"grafana"* - - Envslist: grafana - - Mounts select "*grafana*" - - Root Dir: /usb1/grafana_dir - - (Tick *Logging* and *Start On Boot* boxes if you want) - - New Container for Prometheus - - Remote Image: prom/prometheus:latest - - Interface select *"prometheus"* - - Cmd: --config.file=/etc/prometheus/prometheus.yml - - Root Dir: /usb1/prometheus_dir - - Mounts select *"prometheus"* - - (Tick *Logging* and *Start On Boot* boxes if you want) - - New Container for SNMP Exporter - - Remote Image: prom/snmp-exporter:latest - - Interface select *"snmp_exporter"* - - Cmd: --config.file=/etc/snmp_exporter/snmp.yml - - Root Dir: /usb1/snmp_dir - - Mounts select *"snmp"* - - (Tick *Logging* and *Start On Boot* boxes if you want) +## Prerequisites -## 5. Start Container -After all you can Start and Stop the container using the respective button.\ -Start all containers in order (SNMP Exporter, Prometheus and Grafana) and enjoy. +* 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. -![containers](container_image.png) -### Link -If you configured the VETH interfaces and other as above, then: -- Grafana: [192.168.50.100:3000](192.168.50.100:3000) - - admin:mikrotik -- Prometheus: [192.168.50.102:9090](192.168.50.102:9090) -- SNMP Exporter: [192.168.50.101:9116](192.168.50.101:9116) +--- -Obv, you should assure that they are reachable from your host. -# Possible issues -- In some version for ARM Grafana show "No data" to interface in and out: - - Rapid solution: edit the dashboard, edit the query, change $scrap_intervall to 30s or others. (after you modify the ether1 all other will change automatically) - - Solution: from grafana 9.1.0 the problem was resolved -- Container store is created only the first time that the Apply button is pressed - - Possible issue: mikrotik container create a directory instead of container store - - If you create or remove container with same Root Dir of another the conflicts is coming to you! - - Be careful before removing container, when you do it the relative Root Dir is eliminated (even container store) - - Be careful before press Apply button delete all the container that you want to eliminate -- When Start the container check in Files if the Root Dir is created as "container store" type, if not there was a problem (starting the container will fail with "execve: No such file or directory"), copy the container setup and change the Root Dir until the container is started correctly +## Step-by-Step Setup -Thanks [@IgorKha](https://github.com/IgorKha/) for [configuration files](https://github.com/IgorKha/Grafana-Mikrotik/) and [Dashboard](https://grafana.com/grafana/dashboards/14420-mikrotik-monitoring/). +### 1. Enable SNMP on MikroTik -Special thanks to my MikroTik teacher @rolando. +* Navigate to **IP > SNMP** +* Enable SNMP (tick the checkbox), leave defaults. -## Dashboard screen -Screen by [@IgorKha](https://github.com/IgorKha/) -![dashboard](https://github.com/IgorKha/Grafana-Mikrotik/blob/master/readme/screen.png) +--- + +### 2. Enable Container Support + +#### a. Check if Container is enabled: + +From a **New Terminal** in WinBox: + +```bash +/system/device-mode/print +``` + +Ensure the output includes `container: yes`. + +#### b. If not enabled: + +1. **Download**: + + * Visit [MikroTik Download Archive](https://mikrotik.com/download/archive) + * Select your RouterOS version and architecture (from WinBox in System > Resources) + * Download the `all_packages` ZIP + +2. **Install**: + + * Extract `container-*.npk` from the ZIP + * Upload it to **Files** via WinBox + * Reboot the device + +3. **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` + +--- + +### 3. Configure VETH and Network + +> After each step press Apply and then OK buttons. + +#### a. Create a Docker bridge: + +1. **Bridge > Bridge**: Add new interface named `docker`, leave defaults +2. **IP > Addresses**: Add Address `192.168.50.1/24`, Network `192.168.50.0`, Interface `docker` +3. **IP > Firewall > NAT**: + + * Chain: `srcnat` + * Src. Address: `192.168.50.0/24` + * Action: `masquerade` + +#### 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 + +1. Clone this repository and extract `grafana/`, `prometheus/`, `snmp/` folders. +2. Edit the following: + + * **Grafana Datasource** (`grafana/provisioning/datasources.yml`): + + ```yaml + 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 IP + * `relabel_configs.replacement`: `192.168.50.101:9116` (change it according with your snmp_exporter VETH IP) +3. 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 shows `error`, 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:latest` | `prometheus` | Cmd: `--config.file=/etc/prometheus/prometheus.yml`, Mounts `prometheus`, Root Dir `/usb1/prometheus_dir`| +| **SNMP Exporter** | `prom/snmp-exporter:latest` | `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](http://192.168.50.100:3000) | +| Prometheus | [http://192.168.50.102:9090](http://192.168.50.102:9090) | +| SNMP Exporter | [http://192.168.50.101:9116](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 + +* **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 as `directory`**) + +* **Startup Failures**: + + * If container fails with `execve: No such file or directory`, verify paths, mounts, and retry with a different root dir. + +--- + +## References + +* Configuration and dashboard by [@IgorKha](https://github.com/IgorKha/): [Dashboard #14420](https://grafana.com/grafana/dashboards/14420-mikrotik-monitoring/) +* Special thanks to @rolando for guidance on MikroTik world.