Ir al contenido

Familias de métricas de Prometheus

Esta página enumera todas las familias de métricas que mikroscope expone en el formato de texto de Prometheus: su nombre, su tipo, sus labels, qué cuenta y cuándo no está. Está leída de internal/agent/metrics.go, internal/agent/capture.go e internal/sinks/prometheus.go. Cada familia aparece bajo la fuente de la que sale, porque eso es lo que decide si una placa concreta la tiene.

El agente sirve /metrics en el router, y forward --prom :9124 sirve otro en el equipo del colector. Los dos los escribe el mismo código Totals: el colector le pasa las muestras de las que tiró, así que un despliegue al que solo se llega por el relay sigue teniendo familias independientes del scrape. No son idénticas.

Familias Agente :9123/metrics Colector --prom
todo lo que se recalcula a partir de las muestras: CPU, ventanas, rachas, ruta de recepción, memoria, PMU, sensores, flash, disco, log del kernel, contadores del observador
hechos del equipo (mikroscope_device_info, techos, cadencias) sí, en cuanto el colector ha leído /capabilities
los histogramas de tiempos del muestreador y mikroscope_slipped_total no
familias de disparos y capturas sí, mientras CAPTURE_MB sea mayor que 0 no
mikroscope_collector_*, mikroscope_derived_* no
mikroscope_api_* no sí, en cuanto la capa de la API ha entregado una muestra

El colector deja fuera mikroscope_slipped_total en vez de escribir 0, porque un 0 ahí sería una afirmación sobre un muestreador que nunca ejecutó. Para tener los dos conjuntos en un mismo Prometheus, haz scrape del colector para todo y del agente solo para lo que el colector no puede producir. Hacer scrape del agente sin la lista de conservación duplica cada contador que el colector también expone:

- job_name: "mikroscope"
scrape_interval: 5s
static_configs: [{ targets: ["<collector host>:9124"] }]
- job_name: "mikroscope-agent"
scrape_interval: 5s
static_configs: [{ targets: ["172.30.10.2:9123"] }]
metric_relabel_configs:
- source_labels: [__name__]
regex: "mikroscope_(tick_.*|trigger_.*|capture.*|captures_held|slipped_total)"
action: keep

El destino del colector está construido para 10 Hz nominales sea cual sea la cadencia del agente (promHistogramRateHz en cmd/mikroscope/sinkflags.go), para que la disposición de sus buckets no cambie cuando se reconecta a un agente configurado de otra forma. De esa constante se siguen cinco cosas, leídas del código:

  • mikroscope_info{rate_hz} en el colector marca 10, no la cadencia del agente. /healthz tiene la del agente.
  • mikroscope_cpu_busy_ticks tiene los buckets de le="0" a le="11", dimensionados para una muestra de 100 ms. Un agente por debajo de 10 Hz pone sus muestras más ocupadas en +Inf.
  • El anillo que hay detrás de las ventanas móviles guarda 60 s de muestras del agente conectado: el colector lee su cadencia de la comprobación de salud y dimensiona el anillo con ella, así que window="60s" son 60 s a cualquier cadencia.
  • La media móvil que hay detrás de mikroscope_softnet_burst_samples_total tiene un peso de 1/600, que son 60 s de memoria a 10 Hz y menos por encima.
  • Una línea de interrupción sale de mikroscope_irq_total tras 36 000 muestras fuera de todos los top-K, lo que solo es una hora a 10 Hz: 12 min a 50 Hz, 6 min a 100 Hz. La comprobación se hace cada 1 000 muestras, así que una línea puede quedarse hasta eso más.

Los contadores del colector cuentan desde que arrancó el colector, y mikroscope_uptime_seconds y mikroscope_info{version} describen el colector. mikroscope_self_* siguen describiendo el agente: salen de las muestras del agente.

  • Los contadores cuentan desde que arrancó el exportador y nunca se ponen a cero en un scrape. El anillo lleva deltas; /metrics los acumula. Así rate() sobre cualquier rango es correcto, y dos scrapers ven los mismos valores.
  • Los medidores son la muestra más reciente. Una fuente con suelo (thermal, cpufreq, slab, buddyinfo, MTD) falta a propósito en la mayoría de las muestras, así que su medidor mantiene la última lectura entre emisiones, y mikroscope_source_age_seconds dice lo vieja que es esa lectura.
  • Ausente no es cero, salvo cinco excepciones. La mayoría de las familias de una fuente que el kernel no tiene, o que el despliegue no puede leer, no se renderizan en absoluto. Las excepciones son mikroscope_meminfo_kbytes, mikroscope_load, mikroscope_threads, mikroscope_self_rss_bytes y mikroscope_irq_errors_total: se escriben desde la primera muestra y marcan 0 cuando su fichero no se puede leer o SOURCES lo deja fuera. mikroscope_irq_errors_total también marca 0 en un kernel cuyo /proc/interrupts no tiene fila Err.
  • Una dimensión, un nombre. Un procesador es la label cpu en todas partes. Qué núcleos, zonas, líneas de interrupción, cachés y contadores existen es una propiedad de la placa; lee la label, no supongas nunca un conjunto.
  • Ninguna proporción en las muestras. Los medidores de proporción de ocupación son estadísticas de ventana calculadas en el scrape, y los medidores mikroscope_derived_* del colector son divisiones que hizo junto a sus entradas. Cualquier otra proporción te toca dividirla a ti.
Familia Tipo Labels Significado
mikroscope_cpu_ticks_total counter cpu, mode: user, nice, system, idle, iowait, irq, softirq, steal ticks de USER_HZ por núcleo y modo
mikroscope_cpu_aggregate_ticks_total counter mode lo mismo, de la propia línea resumen cpu de /proc/stat; un nombre aparte para que sumar las series por núcleo no la cuente dos veces
mikroscope_cpu_busy_ticks histogram cpu, le ticks ocupados por muestra, un bucket por cada entero alcanzable, de 0 a uno más de lo que cabe en un período, más +Inf. _sum es el total exacto de ocupación. Recupera el tiempo por encima de un umbral con resolución de una muestra, no la continuidad
mikroscope_context_switches_total counter ninguna ctxt
mikroscope_interrupts_total counter ninguna intr, todas las fuentes
mikroscope_forks_total counter ninguna la línea processes: RouterOS lanzando scripts, fetches y contenedores, aunque el espacio de nombres de PID esconda los procesos
mikroscope_procs_blocked gauge ninguna tareas en espera no interrumpible; en un kernel sin PSI, la única señal directa de bloqueo

Un tick está ocupado cuando es user, nice, system, irq, softirq o steal. En el RB5009 con RouterOS 7.24.2 la columna irq es siempre 0 (medido el 2026-09-11), así que el tiempo de IRQ hardware está dentro de system: lee ahí el modo irq como ausente, no como un router sin carga de interrupciones.

Se calculan en el scrape a partir del anillo sobre ventanas fijas de reloj de pared, así que un scraper con cualquier intervalo de hasta 60 s ve el pico de un transitorio, sea quien sea el último que hizo scrape.

Familia Tipo Labels Significado
mikroscope_cpu_busy_ratio_window gauge cpu, window: 1s, 10s, 60s; stat: max, min, p95 estadísticas de la proporción de ocupación sobre la ventana móvil
mikroscope_sample_interval_seconds gauge window, stat el intervalo medido del muestreador sobre la ventana móvil; su max dice si se entregó la cadencia
mikroscope_cpu_busy_run_seconds histogram cpu, threshold: 0.5, 0.9; le: 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, +Inf duración de cada racha de muestras consecutivas en la proporción de ocupación o por encima, en segundos de los propios intervalos de las muestras, observada cuando la racha termina
mikroscope_cpu_busy_run_open_seconds gauge cpu, threshold cuánto dura ya la racha en curso; 0 por debajo del umbral

Una meseta de 2 s es una observación de 2 en mikroscope_cpu_busy_run_seconds y veinte picos sueltos de 100 ms son veinte de 0,1; el histograma de ticks ocupados no puede distinguirlos.

Solo el agente. Una muestra se lee a lo largo de un tramo de tiempo, no en un instante, y estas familias miden ese tramo.

Familia Tipo Labels Significado
mikroscope_tick_interval_seconds histogram le intervalo medido entre muestras; buckets a 0,5, 0,9, 0,95, 0,99, 1,01, 1,05, 1,1, 1,25, 1,5, 2 y 5 veces el período nominal
mikroscope_tick_wake_latency_seconds histogram le cuánto tarde se ejecutó el bucle después de que saltara su temporizador; buckets 0,1 ms, 0,25, 0,5, 1, 2, 5, 10, 20, 50, 100 ms
mikroscope_tick_read_seconds histogram le cuánto tardó la lectura de todas las fuentes que tocaban; los mismos buckets
mikroscope_slipped_total counter ninguna ticks cuya lectura terminó después de que tocara el siguiente tick

Un tick retrasado no es una muestra perdida: la muestra se produce igual, con su dt_ns real. Si mikroscope_slipped_total se mueve, desconfía de la contabilidad del propio muestreador antes que de la del router.

/proc/net/softnet_stat, /proc/softirqs y /proc/interrupts son globales dentro del contenedor, a diferencia de /proc/net/dev.

Familia Tipo Labels Significado
mikroscope_softnet_total counter cpu, kind: processed, dropped, time_squeeze contadores de softnet por CPU
mikroscope_softnet_squeezed_samples_total counter cpu muestras en las que esa CPU tuvo algún squeeze o descarte; su tasa es un ciclo de trabajo
mikroscope_softnet_burst_samples_total counter cpu las muestras con squeeze cuyo recuento de paquetes estuvo en la media móvil de esa CPU o por debajo (EWMA con memoria de un minuto); indicio de ráfagas más cortas que una muestra, no un recuento de ellas
mikroscope_softirq_total counter cpu, kind recuentos de softirq; qué tipos existen es la lista del kernel. NET_RX lleva la carga de reenvío de un router
mikroscope_irq_total counter irq, name, cpu líneas que aparecieron en el top-K de alguna muestra. Una línea que se queda fuera de todos los top-K durante una hora sale de la familia, y vuelve a empezar desde 0 si regresa; en el colector la hora solo se cumple a 10 Hz (arriba)
mikroscope_irq_delivered_total counter ninguna todas las líneas de interrupción sumadas, incluidas las de fuera del top-K: el denominador de mikroscope_irq_total
mikroscope_irq_errors_total counter ninguna la fila Err de /proc/interrupts, que el top-K nunca muestra mientras se queda en cero

Identifica una interrupción por su label name o por su tasa, nunca por un nombre fijado en el código: qué líneas levanta una NIC es una propiedad de la placa y de su driver.

Familia Tipo Labels Falta cuando Significado
mikroscope_load gauge period: 1m, 5m, 15m aún no hay muestra cargas medias
mikroscope_threads gauge state: running, total aún no hay muestra de /proc/loadavg
mikroscope_psi_stall_usec_total counter resource, kind: cpu/some, memory/some, memory/full, io/some, io/full el kernel no tiene /proc/pressure microsegundos de bloqueo de PSI
mikroscope_sched_run_seconds_total counter cpu el kernel no tiene /proc/schedstat tiempo que las tareas pasaron en cada CPU
mikroscope_sched_wait_seconds_total counter cpu lo mismo tiempo que las tareas ejecutables esperaron a cada CPU

Tanto las familias de PSI como las de schedstat faltan en el RB5009, cuyo kernel de RouterOS 7.24.2 no tiene ninguno de los dos ficheros:

Medido en RB5009UG+S+ · 4 × 1,4 GHz Cortex-A72 · RouterOS 7.24.2 · Linux 5.6.3 · · /proc/pressure y /proc/schedstat ausentes

Familia Tipo Labels Significado
mikroscope_meminfo_kbytes gauge field /proc/meminfo en kB: MemTotal, MemFree, MemAvailable, Buffers, Cached, Dirty, Writeback, Shmem, Slab, SReclaimable, SUnreclaim, AnonPages, Mapped, KernelStack, PageTables, Active, Inactive, Committed_AS, CommitLimit
mikroscope_vm_events_total counter event eventos de /proc/vmstat: pgfault, pgmajfault, pgscan_kswapd, pgscan_direct, pgsteal_kswapd, pgsteal_direct, pgalloc, pgfree, allocstall, compact_stall, oom_kill, pswpin, pswpout. pgalloc y allocstall se suman sobre las zonas
mikroscope_vm_pages gauge field niveles de /proc/vmstat en páginas: nr_free_pages, nr_dirty, nr_writeback, nr_slab_reclaimable, nr_slab_unreclaimable
mikroscope_buddy_free_blocks gauge node, zone, order bloques libres de 2^order páginas de /proc/buddyinfo: la fragmentación que MemFree no puede mostrar

Los eventos y los niveles son familias separadas a propósito: que nr_dirty baje son páginas que se escriben a disco, no un recuento negativo de eventos. MemFree en kB dividido entre nr_free_pages da el tamaño de página a partir de los datos y no de una suposición. Las familias de vmstat faltan hasta que una muestra muestra un fallo de página o un nivel de páginas libres, porque un /proc/vmstat ilegible y un tick tranquilo llegan los dos como ceros.

Familia Tipo Labels Falta cuando Significado
mikroscope_perf_events_total counter counter, cpu sin privileged, o sin PMU accesible eventos de contadores hardware de perf_event_open; un contador que la CPU no implementa falta
mikroscope_perf_time_enabled_seconds_total counter counter, cpu lo mismo segundos que cada contador estuvo activado
mikroscope_perf_time_running_seconds_total counter counter, cpu lo mismo segundos que estuvo contando de verdad; por debajo de enabled el PMU está multiplexado y los recuentos se escalan a la baja por running sobre enabled
mikroscope_cpu_clock_cycles_total counter cpu sin cpufreq la frecuencia del gobernador integrada sobre el intervalo de cada muestra: ciclos nominales ofrecidos, no ciclos ejecutados. Su rate() es la frecuencia media sobre cualquier ventana
mikroscope_cpu_frequency_hertz gauge cpu sin cpufreq la frecuencia del gobernador en la emisión más reciente

Las instrucciones por ciclo son rate(mikroscope_perf_events_total{counter="instructions"}) entre rate(…{counter="cycles"}); el agente envía los recuentos y nunca la proporción.

Familia Tipo Labels Falta cuando Significado
mikroscope_thermal_celsius gauge zone no hay zona térmica temperatura bajo el propio nombre de zona del kernel, por ejemplo cpu-thermal, soc-thermal en el RB5009
mikroscope_slab_active_objects gauge cache sin privileged objetos activos por caché slab; nf_conntrack es el recuento real de conexiones del router, aunque el espacio de nombres del contenedor informe de cero
mikroscope_slab_limit_objects gauge cache sin privileged, o sin techo publicado el techo de las cachés que lo tienen, hoy nf_conntrack a partir de nf_conntrack_max; se lee una vez al arrancar el agente

La ocupación de la tabla de conexiones es mikroscope_slab_active_objects{cache="nf_conntrack"} / ignoring(cache) mikroscope_slab_limit_objects{cache="nf_conntrack"}. Un cambio en nf_conntrack_max se ve después de reiniciar el agente.

Familia Tipo Labels Falta cuando Significado
mikroscope_flash_operations_total counter device, kind: page_writes, page_reads, erasures, gc_copies, gcs no hay /proc/yaffs operaciones NAND de YAFFS; erasures se traduce en vida de la flash, gc_copies sobre page_writes es la amplificación de escritura
mikroscope_flash_bad_blocks gauge device no hay /proc/yaffs, y en cualquier scrape cuya muestra más reciente no llevaba fila de flash (sin operaciones, chunks libres sin cambios); no se mantiene entre emisiones bloques que la NAND ha retirado; una subida es la flash desgastándose
mikroscope_flash_free_chunks gauge device lo mismo que mikroscope_flash_bad_blocks chunks aún libres
mikroscope_mtd_ecc_corrected_bits_total counter device, partition sin privileged bits que corrigió el ECC desde el arranque, el recuento propio del kernel; sube antes de que se retire un bloque
mikroscope_mtd_ecc_failures_total counter device, partition sin privileged lecturas que el ECC no pudo corregir desde el arranque: pérdida de datos
mikroscope_mtd_blocks gauge device, partition, kind: bad, bbt sin privileged bloques malos, y bloques que ocupa la tabla de bloques malos
mikroscope_mtd_bitflip_threshold gauge device, partition no se publica bits corregidos por paso de ECC a partir de los cuales el kernel mueve los datos de un bloque
mikroscope_mtd_ecc_strength gauge device, partition no se publica máximo de bits por paso de ECC que el código puede corregir
mikroscope_disk_operations_total counter device, op: read, write ningún dispositivo ha hecho E/S peticiones completadas
mikroscope_disk_sectors_total counter device, op lo mismo sectores transferidos; la conversión a bytes queda a cargo del lector
mikroscope_disk_io_seconds_total counter device lo mismo tiempo que el dispositivo tuvo E/S en curso
mikroscope_disk_inflight gauge device sin E/S en ese dispositivo en la muestra más reciente; no se mantiene entre emisiones peticiones en curso

Un dispositivo de bloques que no hizo nada no está en la muestra, y por tanto tampoco aquí; un comentario de internal/agent/metrics.go, sin fecha ni versión de RouterOS, dice que el RB5009 lista dieciséis dispositivos nbd inactivos. A diferencia de las fuentes con suelo de las convenciones de arriba, los niveles de flash y mikroscope_disk_inflight no se arrastran, así que faltan en la mayoría de los scrapes de una placa tranquila.

/dev/kmsg es solo para root, así que estas familias necesitan un contenedor privileged. El texto del registro nunca es una label.

Familia Tipo Labels Significado
mikroscope_kmsg_records_total counter level: emerg, alert, crit, err, warn, notice, info, debug registros por severidad de syslog
mikroscope_kmsg_dropped_total counter ninguna episodios de pérdida, no registros: uno por cada tick que llegó al tope de 64 registros, uno por cada desbordamiento del búfer circular del kernel (que puede suponer muchos registros); mientras se mueve, los recuentos por nivel de arriba son una cota inferior
mikroscope_kmsg_port_records_total counter port, kind, level registros cuyo texto nombraba un puerto: un subconjunto de la familia de arriba. kind es link-up, link-down, stp-<estado> (blocking, listening, learning, forwarding, disabled), own-address —el bridge recibió una trama con su propia MAC como dirección de origen, la firma de un bucle de capa 2— u other; solo se escriben las ternas distintas de cero

mikroscope_kmsg_records_total y mikroscope_kmsg_dropped_total se renderizan desde el principio, a 0, en las dos exposiciones cuando las capacidades listan kmsg como fuente, así que un router tranquilo se lee como silencioso y no como ilegible. Sin eso, aparecen con el primer registro. La familia por puerto aparece con el primer registro que nombra un puerto.

En el agente, port es el nombre por defecto de RouterOS en una placa de la tabla de puertos, y si no el nombre del kernel. En la copia del colector, el inventario de interfaces de la capa de la API pone ahí el nombre actual del puerto en RouterOS, así que un puerto renombrado de ether5 a WAN se cuenta bajo WAN; sin capa de la API, el registro conserva el nombre por defecto de la placa. El colector también clasifica todo registro que le llega sin kind propio, así que su exposición lleva la label aunque la del agente no la lleve —que es como está el RB5009 de referencia a 2026-09-16, con un agente cuyo /metrics no tiene kind—.

Un puerto que se levanta escribe cuatro registros en un bridge, no cuatro fallos: link-up y después stp-blocking, stp-learning y stp-forwarding en su puerto del bridge. own-address es el único tipo que ya es un fallo por sí solo.

Familia Tipo Labels Significado
mikroscope_self_cpu_usec_total counter ninguna microsegundos de CPU que usó el contenedor del agente: de cgroup2 cuando está montado, y si no ticks de /proc/self/stat
mikroscope_self_rss_bytes gauge ninguna el conjunto residente del agente
mikroscope_self_cgroup_memory_bytes gauge ninguna el memory.current del cgroup del contenedor, RSS más la caché de páginas que se le carga; falta sin cgroup2
mikroscope_self_throttled_periods_total counter ninguna períodos en los que la cuota cpu.max del contenedor lo detuvo; falta sin cgroup2
mikroscope_self_throttled_seconds_total counter ninguna segundos que pasó detenido; falta sin cgroup2
mikroscope_self_oom_kills_total counter ninguna procesos matados por OOM dentro del propio cgroup del agente; no los del router, que son mikroscope_vm_events_total{event="oom_kill"}
mikroscope_samples_total counter ninguna muestras incorporadas a estos contadores
mikroscope_sample_seq_total counter ninguna número de secuencia de la muestra más reciente; su increase() frente a increase(mikroscope_samples_total) es exactamente los ticks producidos y no incorporados
mikroscope_sampled_seconds_total counter ninguna los intervalos propios de las muestras sumados; su rate() es el tiempo de reloj de pared cubierto por segundo, 1 mientras no se retrase ningún tick. El denominador de las proporciones derivadas
mikroscope_counter_resets_total counter ninguna contadores monotónicos que retrocedieron sin un desbordamiento de 32 bits; una tasa a través de un tick así es una cota inferior
mikroscope_info gauge version, rate_hz siempre 1
mikroscope_uptime_seconds gauge ninguna segundos desde que arrancó este exportador

El coste del agente son dos lecturas de mikroscope_self_cpu_usec_total separadas 60 s en régimen estacionario, divididas entre 60 000 000. El coste del observador tiene el procedimiento y las cifras medidas.

Lo que el agente estableció sobre la placa al arrancar, sin la API de RouterOS. Cada familia falta cuando el equipo no publica ese dato.

Familia Tipo Labels Significado
mikroscope_device_info gauge board, kernel, cores, privileged, cgroup, ports_from, hash siempre 1; hash cambia cuando cambia el conjunto de fuentes
mikroscope_thermal_critical_celsius gauge zone el punto de disparo crítico más bajo que declara la zona; no se incluyen los disparos pasivos ni activos
mikroscope_thermal_polling_seconds gauge zone el polling_delay de la zona: las lecturas más rápidas que esto ven el mismo valor
mikroscope_cpu_frequency_limit_hertz gauge cpu, bound: min, max el rango del reloj hardware
mikroscope_cpu_frequency_step_hertz gauge cpu, step cada frecuencia que usa el driver; step cuenta desde la más lenta
mikroscope_cpu_frequency_governor_info gauge cpu, governor siempre 1; userspace es un reloj fijo, ondemand o schedutil uno que escala
mikroscope_cpu_frequency_cluster gauge cpu el núcleo de número más bajo que cambia de frecuencia con este; {0,1} y {2,3} en el RB5009
mikroscope_self_cgroup_memory_max_bytes gauge ninguna el propio memory.max del contenedor, tal como lo fijó el operador
mikroscope_source_cadence_hz gauge source, reason la cadencia a la que se lee y guarda cada fuente de nivel, y por qué: declared, policy, budget, change, override o rate
mikroscope_source_age_seconds gauge source segundos desde la última lectura real de cada fuente con suelo (thermal, cpufreq, slabinfo, buddyinfo, mtd)

Todas salvo la última se leen una vez al arrancar el agente; un techo que cambia mientras el agente funciona se ve después de reiniciarlo.

Solo el agente, y solo mientras CAPTURE_MB sea mayor que 0. Cada par de condición y motivo se escribe desde el principio a 0.

Familia Tipo Labels Significado
mikroscope_trigger_fired_total counter condition veces que cada condición configurada armó una captura; condition="manual" aparece tras el primer POST /capture
mikroscope_trigger_suppressed_total counter condition, reason: refractory, pending veces que una condición se cumplió y no se armó nada: cuánto de una ráfaga no se vio
mikroscope_capture_refused_total counter reason: budget, empty capturas recogidas y no guardadas: el presupuesto estaba lleno, o el anillo ya no guardaba la ventana
mikroscope_captures_held gauge ninguna capturas retenidas
mikroscope_capture_bytes gauge ninguna bytes del anillo que retienen las capturas guardadas
mikroscope_capture_budget_bytes gauge ninguna el presupuesto
mikroscope_capture_bytes_served_total counter ninguna bytes entregados por /captures/{id}, que se ejecuta en el núcleo del muestreador
Familia Tipo Labels Significado
mikroscope_collector_gaps_total counter ninguna huecos del anillo que vio el colector: muestras perdidas entre peticiones
mikroscope_collector_triggers_total counter cause disparos de captura que el colector vio lanzar al agente; falta hasta el primero. Las ventanas se quedan en el agente, bajo /captures
mikroscope_collector_detections_total counter rule eventos de detección por regla, todas las reglas a 0 desde el primer scrape: counter-reset, agent-restart, agent-oom, microburst, reboot, link-flap, conntrack-cliff, conntrack-high, thermal-high, thermal-rising, ipc-collapse
mikroscope_collector_bursts_total counter ninguna muestras marcadas como ráfaga más corta que una muestra
mikroscope_derived_memory_pressure gauge ninguna la escalera del asignador en la muestra más reciente: 0 nada, 1 kswapd escaneó, 2 reclamación directa, 3 una asignación se bloqueó o se sacó una página a swap, 4 actuó el OOM killer
mikroscope_derived_cycles_per_packet gauge ninguna ciclos del PMU por paquete, sumados sobre los núcleos; falta sin PMU, en una muestra sin paquetes y en una con un reinicio de contador
mikroscope_derived_instructions_per_packet gauge ninguna lo mismo, instrucciones
mikroscope_derived_cache_misses_per_packet gauge ninguna lo mismo, fallos de caché
mikroscope_derived_packets_per_interrupt gauge ninguna paquetes por interrupción del dispositivo, la profundidad de agrupación de NAPI; falta cuando la fila del temporizador no estaba en el top-K de la muestra
mikroscope_derived_fastpath_share gauge interface, direction: rx, tx la fracción de fast path del tráfico que la interfaz entrega a la CPU, entre las dos últimas consultas de contadores: fp-rx-byte sobre driver-rx-byte en un puerto del switch, y sobre rx-byte en una interfaz software. Falta para una dirección que no movió bytes

La fracción de fast path no es una fracción del cable: una trama que el chip del switch reenvía por hardware no está en ninguno de sus dos números. En un puerto del switch los dos van juntos —medido el 2026-09-16 en el RB5009 de referencia, fp-rx-byte coincide con driver-rx-byte con unos pocos kB de diferencia, así que todos los puertos leen en torno al 100 %—. Donde el número se mueve es en las interfaces software: el bridge pasó por fast path 211,9 GB de los 663,0 GB que llevó a la CPU desde el arranque (32 %), y PPPoE_DIGI un 99,97 %. fp-tx-byte está a 0 en todas las interfaces de ese router tras cientos de GB transmitidos, así que direction="tx" se retiene mientras el fp-tx-byte acumulado sea 0, en lugar de publicar un 0 % inventado.

Las reglas y lo que cada una no puede afirmar están en detecciones; los valores derivados, en lo que deriva el colector.

Solo el colector: la capa de la API de RouterOS

Sección titulada «Solo el colector: la capa de la API de RouterOS»

Faltan hasta que la capa de la API ha entregado una muestra, y faltan del todo con --api-mode off salvo que también se dé --api-every explícitamente.

Familia Tipo Labels Significado
mikroscope_api_up gauge ninguna 1 en cuanto la capa de la API ha entregado una muestra. No vuelve a 0 si la capa se detiene después, aunque su línea HELP diga “while”
mikroscope_api_cpu_load gauge ninguna cpu-load tal como lo informa /system/resource, una media de un segundo
mikroscope_api_memory_bytes gauge kind: free, total de /system/resource
mikroscope_api_uptime_seconds gauge ninguna el tiempo en marcha del router
mikroscope_api_core_percent gauge cpu, kind: load, irq, disk /system/resource/cpu
mikroscope_api_health gauge name lecturas de /system/health, con el nombre de RouterOS
mikroscope_api_interface gauge interface, kind: rx_bps, tx_bps, rx_pps, tx_pps, y rx_drops, tx_drops, tx_queue_drops, rx_errors, tx_errors solo cuando el router los devolvió tasas instantáneas de monitor-traffic
mikroscope_api_interface_info gauge interface, label, type, role, bridge, default_name siempre 1, una serie por interfaz: label es su comentario de RouterOS, type el tipo de interfaz de RouterOS, role sus listas de interfaces, bridge el bridge del que es puerto y default_name el nombre de fábrica de un puerto físico. Un valor vacío es como la exposición escribe «ninguno»
mikroscope_api_interface_counter_total counter interface, counter cada contador numérico por puerto que guarda RouterOS, con su propio nombre (rx-overflow, fp-rx-byte, link-downs …), para cada interfaz
mikroscope_api_conntrack_entries gauge ninguna recuento de /ip/firewall/connection, mantenido entre consultas; solo con --conntrack-every

Lo que es cada interfaz —comentario, tipo, listas de interfaces, bridge— es una familia info y no un juego de labels en cada tasa y cada contador, porque eso lo edita una persona y una label que cambia empieza una serie nueva. El colector lee la configuración una vez al arrancar y de nuevo cada --labels-every (5 minutos por defecto), y la familia tiene una serie por interfaz, tenga comentario o no. Únela en una consulta:

mikroscope_api_interface_counter_total * on(interface) group_left(label, type, role) mikroscope_api_interface_info

Merece la pena unirla porque RouterOS cuenta cosas distintas según el tipo, y type es quien dice cuál: un puerto ether dentro de un bridge cuenta su cable, incluidas las tramas que el chip del switch reenvió por hardware, mientras que el bridge cuenta su lado de CPU. Medido el 2026-09-16 en el RB5009 de referencia, ether1 había recibido 255,8 GB en el cable y 29,7 GB en el driver. Son dos planos distintos y ninguno es un subconjunto del otro: nunca sumes un puerto y su bridge.

Los tamaños y la configuración que resultan analizarse como enteros —mtu, actual-mtu, l2mtu, max-l2mtu y sfp-shutdown-temperature— no están en mikroscope_api_interface_counter_total, porque un rate() de una MTU no cuenta nada. La MTU viaja en el inventario de interfaces, que los sinks de filas escriben como campo.

En el RB5009 con RouterOS 7.24.2, monitor-traffic devolvió rx-drops, tx-drops y tx-queue-drops por segundo y ninguna clave de errores (2026-09-15), así que ahí faltan los tipos rx_errors y tx_errors; mikroscope_api_interface_counter_total lleva en su lugar los errores por tipo del puerto.