# Documentación de mikroscope: lo esencial > mikroscope es código abierto con licencia MIT y está escrito en Go: un agente que corre en un contenedor en MikroTik RouterOS 7.24 o posterior (arm64, arm, x86_64) y una CLI que lo instala, graba, dibuja y reenvía a once destinos. Versión actual: 1.6.1, 2026-10-06. 11 páginas, en el orden de la barra lateral del sitio, separadas por `---`. Cada una empieza por su título, su descripción y la URL de la página que dobla. El índice de todos los ficheros: https://jmrplens.github.io/mikroscope/es/llms.txt --- # mikroscope Telemetría de kernel por debajo del segundo desde dentro de un router MikroTik, con el coste del observador medido y no prometido. Source: https://jmrplens.github.io/mikroscope/es/ La API de RouterOS informa de la carga de CPU una vez por segundo. mikroscope corre en el router, en un contenedor, y lee los contadores del propio kernel a entre 1 y 100 Hz: para quien tiene que contar qué hizo un equipo MikroTik dentro de ese segundo. Dos binarios con licencia MIT y lo que el observador le cuesta al router medido, no prometido, justo aquí abajo. ## Medido, no presupuestado - [**2,69 %** — de un núcleo a 10 Hz, la cadencia por defecto](https://jmrplens.github.io/mikroscope/es/about/status/#campaign-rates-2026-09-18) - [**13,2 MiB** — de memoria residente a 10 Hz](https://jmrplens.github.io/mikroscope/es/about/status/#campaign-rates-2026-09-18) - [**16,83 %** — de un núcleo a 100 Hz, el máximo de la CLI](https://jmrplens.github.io/mikroscope/es/about/status/#campaign-rates-2026-09-18) - [**0 / 0** — huecos y descartes, en seis ejecuciones](https://jmrplens.github.io/mikroscope/es/about/status/#campaign-rates-2026-09-18) Las tres primeras salen del propio cgroup del agente, en cada muestra; la cuarta, de InfluxDB 3, el único destino al que reenviaba el colector. Cada una de las tres primeras es una sola ventana de 300 s en régimen estacionario, sin repetir, así que ninguna tiene dispersión. A 10 Hz la memoria está dentro de los ≤ 16 MiB que pide el presupuesto y la CPU por encima del ≤ 2 %. El router, la versión de RouterOS y la fecha están en [Probado en](https://jmrplens.github.io/mikroscope/es/about/status/#campaign-rates-2026-09-18). ## Una media de un segundo es un informe sobre un segundo La API de RouterOS publica `cpu-load` una vez por segundo. Un núcleo saturado 100 ms y ocioso los otros 900 mueve la media de un segundo de cuatro núcleos en 2,5 %. Es aritmética, no una medida, y la cifra es cierta: solo que no puede decir cuándo. El agente lee `/proc/stat`, `/proc/interrupts`, `/proc/softirqs` y `/proc/net/softnet_stat` desde dentro del router, a 10 Hz por defecto, y envía los deltas crudos de ticks con el intervalo que cubre cada uno. Nunca calcula un porcentaje; la ventana la eliges tú. El suelo es del kernel, no de la herramienta. `/proc/stat` cuenta en ticks de 10 ms, así que una muestra de 100 ms resuelve un núcleo en escalones de 10 %. No hay nada más fino que leer donde el kernel no tiene PSI ni schedstat, y el router probado no tiene ninguno de los dos ([Probado en](https://jmrplens.github.io/mikroscope/es/about/status/#campaign-kernel-2026-09-11)). [Cuántos segundos promedia `cpu-load` →](https://jmrplens.github.io/mikroscope/es/sinks/api-tier/#cuántos-segundos-promedia-el-cpu-load-de-routeros) ## Lo que cuesta, a tres cadencias Condiciones: ventanas de 300 s en régimen estacionario (con el anillo ya lleno), conjunto completo de fuentes, la configuración que se envía —anillo de 60 s, límite de memoria derivado de él y el tope de contenedor de serie de 64M— con el colector reenviando a InfluxDB 3. Cada fila es una sola ventana, sin repetir, así que ninguna fila tiene dispersión; la memoria cambia por fila porque cambian el anillo y el límite de memoria. Las ejecuciones medidas: | cadencia | suelos | CPU de un núcleo | µs/muestra | RSS | ticks retrasados | huecos / descartes | | --- | --- | --- | --- | --- | --- | --- | | 10 Hz (por defecto) | por defecto | **2,69 %** | 2 685 | 13,2 MiB | **0** | 0 / 0 | | 50 Hz | por defecto | **9,63 %** | 1 926 | 23,3 MiB | **0** | 0 / 0 | | 100 Hz | por defecto | **16,83 %** | 1 684 | 45,7 MiB | 5 (0,02 %) | 0 / 0 | No se perdió nada a ninguna de estas cadencias: todos los destinos informaron de 0 huecos y 0 descartes, y la cadencia entregada coincidió con la configurada a tres cifras. Con los suelos por defecto y a 100 Hz, todas las fuentes de un tick se leyeron en menos de 2 ms en el 97,7 % de las muestras, dentro de un periodo de 10 ms. [Las seis ejecuciones, incluida la de todas las fuentes en cada tick →](https://jmrplens.github.io/mikroscope/es/cost/rate-ceiling/) ## La CPU del router desde el kernel, sus interfaces desde la API ### Capa del kernel · el agente · de 10 a 100 Hz Globales dentro del contenedor, así que son los del propio router: ticks de CPU por núcleo, interrupciones, softirqs, descartes y time squeezes de softnet, `/proc/meminfo`, `/proc/vmstat`, carga y E/S de disco. Un contenedor privilegiado añade el log del kernel como eventos con marca de tiempo y las cachés slab globales. ### Capa de la API · el colector · 1 Hz El contenedor tiene su propio espacio de nombres de red, así que `/proc/net/dev` describe al contenedor, no al router. Los bytes y paquetes por interfaz vienen de la API de RouterOS y los fusiona el colector, sin interpolar. `privileged=yes` no cambia eso. ## Cada escritura, listada antes de hacerla Versión actual: [1.6.1](https://github.com/jmrplens/mikroscope/releases/tag/v1.6.1), 2026-10-06 · [Registro de cambios](https://github.com/jmrplens/mikroscope/blob/main/CHANGELOG.md) Descarga el archivo para tu plataforma de la versión publicada, o compila la CLI desde una copia del repositorio con `make build`. El router necesita RouterOS 7.24 o posterior —el paso del contenedor escribe `privileged=`, un atributo que las versiones 7.x anteriores rechazan— con el paquete `container` y `device-mode container=yes`, que MikroTik condiciona a pulsar el botón de reset o a un corte de alimentación. arm64, arm y x86_64; ni MIPS ni TILE. 1. `mikroscope doctor` Comprobación de solo lectura que nombra el arreglo de lo que falte, y luego lo que muestra el anillo del agente en marcha: un bucle de capa 2, churn de STP, un link flap o descartes de softnet. 2. `mikroscope plan` Cada orden de RouterOS, sin escribir nada. 3. `mikroscope install` Doctor, confirmación, las escrituras y luego una sonda al agente. La imagen sale de tu propia toolchain de Go, del tar del agente publicado o del registro del que el router se la descarga. 4. `mikroscope status` Recuento de propiedad y salud del agente. 5. `mikroscope uninstall` Elimina y verifica. **Lo que `install` escribe en tu router** - el manifiesto de la instalación, un fichero `mikroscope/.manifest.txt` en el disco de la instalación que lista las opciones y cada objeto de abajo - una veth - una dirección - una pertenencia a lista de interfaces, salvo con `--iface-list none` - una entrada de address-list, salvo con `--addr-list none` - una envlist - el tar de la imagen, que se borra en cuanto el contenedor está extraído, salvo que `--remote-image` haga que el router se la baje - el contenedor, y su raíz `mikroscope/` en el mismo disco Cada objeto lleva el comentario `mikroscope: (managed by mikroscope)` `mikroscope plan` imprime cada orden antes de escribir nada. `uninstall` elimina por etiqueta exacta más identidad, nunca por patrón, y falla nombrando el paso si queda algo. [Instalación rápida, paso a paso →](https://jmrplens.github.io/mikroscope/es/start/) ## Probado en Las cifras de esta página salen de un solo router. [Probado en](https://jmrplens.github.io/mikroscope/es/about/status/) dice cuál, con las versiones de RouterOS, las fechas y las condiciones de cada ejecución. También dice lo que no se ha probado: otras placas, un tráfico mayor que la carga corriente de ese router, y los destinos y las compilaciones que no han corrido en hardware. No se afirma ninguna cadencia en otra placa. El coste depende de la velocidad del núcleo, del conjunto de fuentes y del tamaño del anillo. [Mídelo en tu propio router](https://jmrplens.github.io/mikroscope/es/cost/#medirlo-en-tu-propio-equipo) antes de presupuestarlo. ## Por dónde seguir - [Instalación rápida](https://jmrplens.github.io/mikroscope/es/start/): Instala la CLI, comprueba el router y pon en marcha el agente en un contenedor de RouterOS - [Cómo funciona](https://jmrplens.github.io/mikroscope/es/how-it-works/): El agente, el colector y el camino de los datos entre ellos, qué lee y qué añade cada uno, y lo que la herramienta no hace - [Comparado con alternativas](https://jmrplens.github.io/mikroscope/es/start/compared/): Las otras formas de vigilar un equipo RouterOS, qué lee cada una y cuándo usar otra herramienta - [Primera grabación](https://jmrplens.github.io/mikroscope/es/start/walkthrough/): Graba mientras cambias algo, márcalo y dibuja el gráfico - [Métodos de instalación](https://jmrplens.github.io/mikroscope/es/install/routes/): Todas las maneras de llevar el agente a un router, y lo que necesita cada una - [Ejecutar el colector](https://jmrplens.github.io/mikroscope/es/sinks/): Extraer, fusionar, derivar, repartir a once destinos, y por qué uno lento nunca para el bucle - [Diagnosticar fallos](https://jmrplens.github.io/mikroscope/es/playbooks/): Qué aspecto tiene cada fallo en los datos del kernel y de los puertos, y qué comprobar antes de fiarte de una lectura - [Límites de la evidencia](https://jmrplens.github.io/mikroscope/es/cost/limits/): Cada límite de las cifras de arriba --- # Instalación rápida Instala la CLI, comprueba el router y pon en marcha el agente en un contenedor de RouterOS, en cuatro órdenes. Source: https://jmrplens.github.io/mikroscope/es/start/ mikroscope ejecuta un agente en un contenedor de RouterOS que muestrea el kernel del router a 10 Hz y responde por HTTP en el lado del router de una /30. La CLI de tu ordenador lo instala, e `install` escribe estos objetos, que `uninstall` retira: **Lo que `install` escribe en tu router** - el manifiesto de la instalación, un fichero `mikroscope/.manifest.txt` en el disco de la instalación que lista las opciones y cada objeto de abajo - una veth - una dirección - una pertenencia a lista de interfaces, salvo con `--iface-list none` - una entrada de address-list, salvo con `--addr-list none` - una envlist - el tar de la imagen, que se borra en cuanto el contenedor está extraído, salvo que `--remote-image` haga que el router se la baje - el contenedor, y su raíz `mikroscope/` en el mismo disco Cada objeto lleva el comentario `mikroscope: (managed by mikroscope)` `mikroscope plan` imprime cada orden antes de escribir nada. `uninstall` elimina por etiqueta exacta más identidad, nunca por patrón, y falla nombrando el paso si queda algo. `install` no escribe nada fuera del router: el colector y los dashboards de Grafana son un paso aparte y opcional ([Verlo en Grafana](https://jmrplens.github.io/mikroscope/es/start/#verlo-en-grafana)). ## Requisitos | Requisito | Valor | | ------------------- | ------------------------------------------------------------------------ | | RouterOS | 7.24 o posterior | | Arquitectura | `arm64`, `arm` o `x86_64`; ni MIPS, ni TILE, ni PPC | | Paquete `container` | instalado y habilitado | | Device mode | `container=yes`, confirmado pulsando un botón o cortando la alimentación | También necesitas un ordenador con acceso ssh al router como usuario administrador, con una clave o un agente ssh: la CLI ejecuta ssh en modo batch y no puede responder a una petición de contraseña. [Requisitos](https://jmrplens.github.io/mikroscope/es/install/prerequisites/) tiene el detalle y lo que comprueba `doctor`. ## Instalar la CLI ```sh curl -fsSL https://raw.githubusercontent.com/jmrplens/mikroscope/main/install.sh | bash ``` En PowerShell, en Windows: ```powershell irm https://raw.githubusercontent.com/jmrplens/mikroscope/main/install.ps1 | iex ``` El script instala la versión más reciente y rechaza un archivo cuyo SHA-256 no sea el que publicó la versión. [Instalar la CLI](https://jmrplens.github.io/mikroscope/es/install/cli/) tiene los mismos pasos a mano. ## Comprobar el router ```sh mikroscope doctor --router admin@192.168.88.1 --remote-image jmrplens/mikroscope-agent:1.6.1 ``` `doctor` lee el router y no escribe nada. Imprime una línea por comprobación, marcada `ok`, `MISSING` o `WARN`, y termina con `doctor: every prerequisite is met`. Tras una línea `MISSING` viene su arreglo: ```text MISSING interface list LAN exists (found=0) fix: --iface-list none: no firewall rule here needs the veth in an interface list. Or create it: `/interface/list/add name=LAN` ``` Aplica el arreglo, o añade la opción que nombra a esta orden y a `install` más abajo, y vuelve a ejecutar `doctor` hasta que no quede nada `MISSING`. Una línea `WARN` no detiene la instalación. > **Device mode te necesita junto al router** > > Tras `/system/device-mode/update container=yes`, pulsa el botón reset o mode, o corta la > alimentación, en menos de 5 minutos. En CHR, apaga y enciende la máquina virtual. Ninguna sesión > ssh ni llamada a la API puede dar este paso. > **Un router que ssh no ha visto nunca** > > La CLI ejecuta ssh en modo batch, así que una clave de host que aún no está en `known_hosts` la > detiene. Añade `--ssh-option StrictHostKeyChecking=accept-new` a la primera orden, o conéctate > una vez con `ssh` tú mismo. ## Instalar el agente ```sh mikroscope install --router admin@192.168.88.1 --remote-image jmrplens/mikroscope-agent:1.6.1 ``` `install` hace las mismas comprobaciones, lee la arquitectura del router e imprime cada orden de RouterOS que va a ejecutar, terminando con `nothing above has been written yet`. Después pregunta `write the objects above to the router? [y/N]`. Tras las escrituras sondea el agente desde tu ordenador: ```text install done: 6 step(s) created probing http://172.30.10.2:9123/healthz from this host … direct transport ok: agent 1.6.1 () built