# Comparado con alternativas

Qué leen de un router MikroTik SNMP, The Dude, Graphing, el Profiler, mktxp y mikrotik-exporter, junto a mikroscope, y cuándo conviene usarlos en su lugar.

Source: https://jmrplens.github.io/mikroscope/es/start/compared/

mikroscope lee el kernel Linux de un router MikroTik desde dentro de un contenedor de RouterOS, a
entre 1 y 100 Hz. SNMP, The Dude, Graphing y el Profiler del propio RouterOS, mktxp y
mikrotik-exporter leen lo que informa el propio RouterOS. La tabla pone los siete uno junto a otro;
las secciones que la siguen dicen de dónde sale cada celda y cuándo uno de los otros seis es mejor
opción.

## Tabla comparativa

| Herramienta | Dónde corre | Qué lee | Vista de CPU más fina | softirq y softnet por núcleo | Log del kernel | Contadores de interfaz | Lo que necesita en el router |
| ----------- | ----------- | ------- | --------------------- | ---------------------------- | -------------- | ---------------------- | ---------------------------- |
| mikroscope | un agente en un contenedor de RouterOS; la CLI y el colector en tu máquina | el kernel del router: `/proc`, `/sys`, `/dev/kmsg`, `perf_event_open` | por núcleo, los ticks crudos de `/proc/stat` a 1–100 Hz; una muestra de 100 ms resuelve un núcleo en pasos de 10 % | sí, por CPU, en cada tick | sí, `/dev/kmsg`, con `privileged=yes` | de la API de RouterOS, fusionados: el espacio de nombres de red del contenedor oculta los del router | RouterOS 7.24 o posterior, el paquete `container`, `device-mode container=yes`; arm64, arm o x86_64 |
| [SNMP](https://help.mikrotik.com/docs/spaces/ROS/pages/8978519/SNMP) | un agente integrado en RouterOS; el sondeador en otra máquina | MIB: MIB-2, HOST-RESOURCES-MIB, IF-MIB, MIKROTIK-MIB y otras | `hrProcessorLoad` por procesador, definido como una media de un minuto ([RFC 2790](https://datatracker.ietf.org/doc/html/rfc2790)) | ningún objeto para ninguno de los dos en la [MIKROTIK-MIB](https://download.mikrotik.com/routeros/7.24.4/mikrotik.mib) | no; los traps avisan de cambios de interfaz, del arranque del servicio SNMP y de un umbral de temperatura (`temp-exception`) | sí, IF-MIB | `/snmp set enabled=yes` (desactivado por defecto) y una comunidad o un usuario SNMPv3 |
| [The Dude](https://help.mikrotik.com/docs/spaces/ROS/pages/377225250/Dude) | el paquete `dude` (arm, arm64, mmips, tile, x86, CHR); MikroTik lo da por descontinuado | no lo dicen las páginas actuales de MikroTik | no lo dicen las páginas actuales de MikroTik | no lo dicen las páginas actuales de MikroTik | no consta | no lo dicen las páginas actuales de MikroTik | el paquete `dude`; las páginas actuales de MikroTik no dicen nada más |
| [Graphing](https://help.mikrotik.com/docs/spaces/ROS/pages/22773810/Graphing) | dentro de RouterOS; las gráficas en WebFig y WinBox | las cifras de recursos y tráfico del propio RouterOS | no consta; `store-every`, 5 min por defecto, es cada cuánto escribe en disco | no: dibuja recursos, interfaces y colas simples | no | tráfico por interfaz | entradas en `/tool graphing`; desactivado por defecto |
| [Profiler](https://help.mikrotik.com/docs/spaces/ROS/pages/8323153/Profiler) | dentro de RouterOS, `/tool/profile`, a mano | la contabilidad de CPU por proceso de RouterOS | por núcleo y por clase de proceso; instantáneas de un segundo ([coste de la capa API](https://jmrplens.github.io/mikroscope/es/cost/#api-tier-cost)) | no: CPU por clase de proceso | no | no | nada: viene integrado |
| [mktxp](https://github.com/akpw/mktxp) | tu máquina: Python 3.9 o posterior en Linux, macOS o FreeBSD, o Docker | la API de RouterOS | `cpu-load` de `/system/resource`: una sola cifra para todo el router | ningún colector para ninguno de los dos (código en `1e4412a`) | no; el syslog de RouterOS va al [MKTXP Stack](https://github.com/akpw/mktxp-stack), un proyecto aparte | sí, por la API | un usuario de la API con `api,read` |
| [mikrotik-exporter](https://github.com/nshttpd/mikrotik-exporter) | tu máquina | la API de RouterOS | `cpu-load` de `/system/resource/print`: una sola cifra para todo el router | ningún colector para ninguno de los dos (código en `428dbfc`) | no | sí, `/interface/print` | un usuario de la API con `api,read,winbox` |

Las otras seis filas son lo que dice la documentación o el código de cada herramienta, con "no
consta" o "no lo dicen" donde no dicen nada. Ninguna de las seis se ejecutó para esta tabla, así que
ninguna celda de sus filas es una medición. Las fuentes son las páginas de MikroTik sobre
[paquetes](https://help.mikrotik.com/docs/spaces/ROS/pages/40992872/Packages) y
[`/system/resource`](https://help.mikrotik.com/docs/spaces/ROS/pages/40992875/Resource) además de
las cuatro enlazadas en la tabla; el [fichero MIKROTIK-MIB](https://download.mikrotik.com/routeros/7.24.4/mikrotik.mib),
ninguno de cuyos objetos se llama ni se describe como contador de softirq, de softnet, de
interrupciones o de log; la
[guía del exportador](https://github.com/akpw/mktxp/blob/1e4412a3349db95f59281c81d3b3bc65f2f7f963/docs/exporter.md) y el
[colector de recursos](https://github.com/akpw/mktxp/blob/1e4412a3349db95f59281c81d3b3bc65f2f7f963/mktxp/collector/resource_collector.py)
de mktxp en el commit `1e4412a`; y el
[colector de recursos](https://github.com/nshttpd/mikrotik-exporter/blob/428dbfcc37d05d52ee6a326fa45719a375a89d02/collector/resource_collector.go)
de mikrotik-exporter en el commit `428dbfc`. Las herramientas de terceros cambian: comprueba sus
páginas antes de fiarte de una celda.

La fila de mikroscope sale de este sitio: [Cómo funciona](https://jmrplens.github.io/mikroscope/es/how-it-works/),
[Límites de resolución](https://jmrplens.github.io/mikroscope/es/limits/), [Modo privilegiado](https://jmrplens.github.io/mikroscope/es/limits/privileged/),
[Visibilidad del contenedor](https://jmrplens.github.io/mikroscope/es/limits/namespaces/) y
[Requisitos](https://jmrplens.github.io/mikroscope/es/install/prerequisites/). La resolución de su celda de CPU es aritmética
a partir del tick del kernel, no una lectura.

## cpu-load en los exportadores

mktxp y mikrotik-exporter leen los dos `cpu-load`, que MikroTik define como el porcentaje de los
recursos de CPU usados con todas las CPU juntas. Es [una media móvil de alrededor de un
segundo](https://jmrplens.github.io/mikroscope/es/sinks/api-tier/#cuántos-segundos-promedia-el-cpu-load-de-routeros), así que
una ráfaga más corta que ese segundo queda promediada dentro. Hay cifras por núcleo en
`/system/resource/cpu` de RouterOS, que lee la capa de la API de mikroscope y que el código de
ninguno de los dos exportadores pide.

## Señales solo del kernel

Un bucle de capa 2 puede dejar el log y el monitor de puertos de RouterOS informando de un equipo
sano mientras el log del kernel recoge la propia dirección del router volviendo a entrar en el
bridge en cada hello de STP. mikroscope lee ese log a través de `/dev/kmsg`, y ninguno de los otros
seis documenta leerlo. [Bucle de capa 2](https://jmrplens.github.io/mikroscope/es/playbooks/loop/) es un caso real,
diagnosticado.

Tampoco sustituye a la API de RouterOS: los bytes y paquetes por interfaz vienen de esa API, y el
colector los fusiona con las muestras del kernel con el reloj del agente.

## Coste para el router

Con los 10 Hz por defecto de la instalación, el agente cuesta 2,69 % de un
núcleo y 13,2 MiB de RSS, de su propio cgroup
([Coste del agente](https://jmrplens.github.io/mikroscope/es/cost/)). Su capa de la API, que pregunta a RouterOS una ronda por
segundo, tiene un coste propio: [Coste de la capa API](https://jmrplens.github.io/mikroscope/es/cost/#api-tier-cost).
Esa cifra es el cliente del propio mikroscope preguntando sus propias órdenes, no un exportador.

Lo que cuesta a un router el sondeo SNMP, The Dude, Graphing, el Profiler, mktxp o
mikrotik-exporter, con qué frecuencia puede sondear cada uno con utilidad, y qué pone RouterOS en
`hrProcessorLoad` no se ha medido ([No probado](https://jmrplens.github.io/mikroscope/es/about/status/#not-tested)).

## Cuándo usar otra herramienta

- **Un router MIPS, TILE o PPC.** El agente no es nada sin un contenedor, y MikroTik publica el
  paquete `container` solo para arm, arm64, x86 y CHR. `/system/resource/print` da el
  `architecture-name` de tu router. SNMP, o un exportador de la API como mktxp, lee lo que informa
  RouterOS en cualquiera de ellos.
- **RouterOS anterior a 7.24.** El paso del contenedor escribe `privileged=`, un atributo que
  RouterOS añadió en la 7.24, así que `doctor` y el script de instalación se detienen en una versión
  anterior antes de escribir nada. Actualiza RouterOS, o usa SNMP o mktxp, que no necesitan
  contenedor.
- **Sin paquete `container`, o sin nadie que pulse el botón.** `device-mode container=yes` exige
  pulsar el botón reset o mode, o un reinicio en frío, en los cinco minutos siguientes a la orden.
  [La página de device-mode de MikroTik](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode)
  exige acceso físico a propósito, así que ninguna sesión remota puede concederlo. SNMP necesita
  activar un servicio, y un exportador, un usuario de la API.
- **Solo quieres el tráfico de las interfaces a un intervalo de scrape.** mikroscope toma los bytes
  y paquetes por interfaz de la misma API de RouterOS que lee un exportador, porque el contenedor no
  los ve. Un exportador los obtiene sin poner nada en el router.
- **Necesitas verlo probado antes en tu placa.** [Probado en](https://jmrplens.github.io/mikroscope/es/about/status/)
  enumera las placas y versiones de RouterOS en las que ha funcionado. Un
  [informe de placa](https://github.com/jmrplens/mikroscope/issues/new?template=2-board-report.yml)
  añade la tuya.

## Véase también

- [Cómo funciona](https://jmrplens.github.io/mikroscope/es/how-it-works/): el agente, el colector y los límites que no se
  pueden eliminar con ingeniería.
- [Preguntas frecuentes](https://jmrplens.github.io/mikroscope/es/start/questions/): MIPS, la 7.24, el coste, un router de
  producción, en un párrafo cada una.
- [Capa de la API de RouterOS](https://jmrplens.github.io/mikroscope/es/sinks/api-tier/): lo que el colector sigue
  preguntando a RouterOS.
- [Requisitos](https://jmrplens.github.io/mikroscope/es/install/prerequisites/): la arquitectura, el paquete y el paso de
  device-mode.
