Ir al contenido

Métricas

DumbMonit guarda cada medición en VictoriaMetrics y la vuelve a leer con MetricsQL, a través del proxy de métricas del servidor. Esta página describe el nombrado, las etiquetas y la retención. Las listas de métricas por tipo están en las páginas de monitor.

Cada métrica tiene el prefijo dumbmonit_, así que DumbMonit puede compartir una instancia de VictoriaMetrics con otras herramientas sin colisiones. Los nombres siguen dumbmonit_<qué>_<unidad>:

PatrónEjemplos
…_bytes, …_bytes_total, …_bytes_useddumbmonit_memory_bytes_total, dumbmonit_filesystem_used_bytes
…_percentdumbmonit_cpu_usage_percent, dumbmonit_pbs_datastore_used_percent
…_seconds, …_age_secondsdumbmonit_probe_duration_seconds, dumbmonit_proxmox_backup_last_age_seconds
…_celsius, …_volts, …_hertz, …_wattslecturas de SAI y Synology
…_infoSeries de presencia (valor 1) cuya información está en etiquetas: dumbmonit_system_info, dumbmonit_pbs_version_info
…_status, …_up, …_runningEnumeraciones o booleanos: dumbmonit_if_oper_status, dumbmonit_proxmox_guest_running

Las familias específicas de fuente llevan su fuente como un segundo prefijo: dumbmonit_proxmox_*, dumbmonit_pbs_*, dumbmonit_synology_*, dumbmonit_probe_* (servicios). Los perfiles SNMP y el agente usan nombres planos (dumbmonit_if_octets_in, dumbmonit_cpu_usage_percent).

Los contadores (octetos y paquetes de interfaz, bytes de disco, páginas impresas) se guardan en bruto, tal como los reporta el monitor: aplica rate() en tus propias consultas para obtener un caudal. La página del monitor grafica cada serie dumbmonit_* del monitor tal como se guarda, así que un contador aparece como una línea ascendente. Un reinicio se muestra como un reseteo del contador, nunca como un pico falso.

Tras cada sonda exitosa, el servidor escribe dumbmonit_up = 1 para el monitor. No se escribe nada cuando una sonda falla: la serie simplemente se detiene, y la regla «Monitor unreachable» mide la antigüedad de la última muestra (time() - tlast_over_time(dumbmonit_up[7d])), conservando solo la serie más reciente de cada monitor (bottomk by (target) (1, …)): una serie que ya no se escribe tras un cambio de etiqueta o de tag permanece en la ventana de 7 días y no debe contar.

Para los servicios (http, tcp, dns, ping, tls), dumbmonit_up = 1 significa «el monitor se ejecutó», y dumbmonit_probe_success indica si el servicio está bien. Las dos señales se mantienen separadas a propósito: un probe_success de 0 indica que el servicio está caído, una interrupción de up indica que la monitorización está caída.

Cada 15 minutos el servidor calcula la puntuación de seguridad de cada monitor cuyo tipo tiene comprobaciones de seguridad, y escribe dumbmonit_security_score (0–100, ausente mientras nada se pueda puntuar) y dumbmonit_security_checks_failed, ambas etiquetadas target.

EtiquetaDefinida porSignificado
targetservidorEl id del monitor, como en /api/targets/{id}. Cada regla y cada gráfica selecciona sobre ella.
hostservidorEl nombre del monitor.
tag_<key>servidorLas etiquetas libres del monitor. Las opciones de tipo (insecure_tls, port…), las etiquetas cuya clave parece un secreto (comparada por palabra: key, pass, cert, private, pem…) y los valores de más de 256 caracteres no se copian. Nunca pongas un secreto en una etiqueta.
probeservicioshttp, tcp, dns, ping o tls.
etiquetas por serierecolectorifname, mountpoint, device, fstype, core, service, container, node, vmid, name, storage, datastore, group, volume, disk, pool, repo, changes, reason, version, issuer… como se lista en cada página de monitor.

Las etiquetas de identidad siempre ganan sobre las etiquetas de recolector, y para los agentes se definen al recibirse: una máquina no puede escribir en la serie de otra máquina.

La VictoriaMetrics integrada conserva 12 meses de datos (DUMBMONIT_VM_RETENTION) bajo /data/vm, en el volumen dumbmonit-data. El servidor agrupa sus escrituras y las vuelca cada 5 segundos (DUMBMONIT_FLUSH_INTERVAL_SECS). Eliminar un monitor no elimina sus series; caducan por su cuenta.

El historial de alertas se conserva 90 días y las referencias de series que desaparecieron 60 días, ambos en SQLite (consulta la referencia de configuración).

  • A través del servidor: GET /api/metrics/query y GET /api/metrics/query_range, con la cookie de sesión. Los resultados de rango están limitados a 2000 puntos por serie.
  • Desde un Prometheus o Grafana existente: GET /federate, GET /metrics y la fuente de datos /prometheus, con un token de API — abajo.
  • Directamente, en desarrollo: la capa docker-compose.dev.yml publica la VictoriaMetrics integrada en https://localhost:8428, con su propia UI en https://localhost:8428/vmui/. En producción escucha solo en el loopback del contenedor; define DUMBMONIT_VM_LISTEN=0.0.0.0:8428 y publica el puerto tú mismo si quieres Grafana u otra herramienta sobre los mismos datos.
# Caudal de interfaz en bits por segundo
rate(dumbmonit_if_octets_in{target="4"}[5m]) * 8
# Disponibilidad de cada servicio en 30 días
avg by (host) (avg_over_time(dumbmonit_probe_success[30d]))
# Cada monitor que no ha reportado en 5 minutos
bottomk by (target) (1, time() - tlast_over_time(dumbmonit_up[7d])) > 300

Si ya ejecutas un Prometheus o un Grafana, no necesitas un segundo stack. Tres rutas están fuera de /api, donde un scraper las busca:

RutaQué devuelve
GET /metricsLa salud de la propia instancia DumbMonit: scheduler, sondas, escrituras, alertas, notificaciones, agentes, base de datos. Unas pocas decenas de series, siempre el mismo número — nunca una por monitor.
GET /federateLas mediciones, seleccionadas por match[], exactamente como Prometheus federa otro Prometheus: el punto más reciente de cada serie seleccionada.
GET /prometheus/api/v1/…La mitad de lectura de la API de Prometheus, retransmitida al almacén: lo que llama una fuente de datos de Grafana.

Las tres toman Authorization: Bearer dmt_… con el alcance read — un token creado en Settings → API & assistants, el mismo tipo que usa el servidor MCP. No hay ninguna cookie implicada, así que no se necesita ninguna cabecera X-Requested-With; una cookie de sesión también se acepta, así que puedes abrir cualquiera de ellas desde un navegador con sesión iniciada. Un token se limita a 120 llamadas por minuto: suficiente para un sondeo cada 15 segundos, y bastante para un dashboard de Grafana de unas pocas decenas de paneles — dale a un dashboard ocupado su propio token en lugar de compartir uno con un scraper.

# prometheus.yml — la propia salud de DumbMonit, luego las mediciones que recolecta.
scrape_configs:
- job_name: dumbmonit
metrics_path: /metrics
scheme: http
authorization:
type: Bearer
credentials: dmt_0123456789abcdef0123456789abcdef
static_configs:
- targets: ['dumbmonit.lan:8080']
- job_name: dumbmonit-federate
metrics_path: /federate
scheme: http
honor_labels: true
scrape_interval: 60s
authorization:
type: Bearer
credentials: dmt_0123456789abcdef0123456789abcdef
params:
'match[]':
- '{__name__=~"dumbmonit_.*"}'
static_configs:
- targets: ['dumbmonit.lan:8080']

honor_labels: true conserva las etiquetas target y host que define DumbMonit en lugar de sobrescribirlas con las propias del job de sondeo. Pon el token en un archivo y usa authorization: {type: Bearer, credentials_file: /etc/prometheus/dumbmonit.token} si prefieres no tenerlo en la configuración.

Sin match[], /federate selecciona {__name__=~"dumbmonit_.*"} — cada serie que escribe DumbMonit, y nada que pertenezca a otra herramienta que comparta la misma VictoriaMetrics. Limítalo para mantener pequeña una federación: {__name__=~"dumbmonit_.*",target="4"} para un monitor, {__name__="dumbmonit_up"} solo para disponibilidad. Como máximo 10 selectores por petición, y una respuesta de más de 8 MiB se rechaza con un mensaje que te dice que la limites — divide una flota grande en varios jobs con selectores más estrechos en lugar de uno que pida todo. max_lookback=15m amplía la ventana en la que se busca el último punto, para monitores sondeados con menos frecuencia que cada cinco minutos.

Ventana de terminal
curl -H 'Authorization: Bearer dmt_…' https://localhost:8080/metrics
curl -H 'Authorization: Bearer dmt_…' -G https://localhost:8080/federate \
--data-urlencode 'match[]={__name__=~"dumbmonit_.*",target="4"}'

Apunta Grafana a DumbMonit, no a la VictoriaMetrics que ejecuta: el proceso hijo escucha en el loopback del contenedor, no tiene ninguna autenticación propia, y expone las rutas que eliminan series con la misma facilidad que las que las leen. DumbMonit retransmite la mitad de lectura de la API de Prometheus bajo /prometheus, detrás del mismo token, así que Grafana habla con una fuente de datos Prometheus normal:

  1. Connections → Data sources → Add → Prometheus.
  2. URL: https://dumbmonit.lan:8080/prometheus (Grafana añade /api/v1/query él mismo).
  3. HTTP headers: añade uno, Authorization = Bearer dmt_…. Grafana lo guarda cifrado y nunca lo vuelve a mostrar.
  4. Save & test — Grafana reporta que la fuente de datos funciona, y cada serie dumbmonit_* está entonces disponible en PromQL, con autocompletado de nombres de métrica y etiqueta.

Solo se retransmiten las rutas de lectura — query, query_range, series, labels, valores de etiqueta, metadata y la versión que pide Grafana al probar la conexión. Cualquier otra cosa, admin/tsdb/delete_series entre las primeras, responde 404: este punto de entrada no puede cambiar ni borrar nada.

Si ya ejecutas un Prometheus, la otra vía funciona igual de bien: Prometheus federa DumbMonit con el job de arriba, Grafana lee Prometheus, y las consultas son idénticas.

Todo lo que expone GET /metrics. Los valores se leen cuando sondeas; los contadores _total son monótonos y se reinician solo cuando el servidor se reinicia (dumbmonit_uptime_seconds te dice cuándo pasó eso).

MétricaTipoSignificado
dumbmonit_build_info{version}gaugeSiempre 1. La etiqueta version es la versión del servidor en ejecución, la misma que reporta /api/health.
dumbmonit_uptime_secondsgaugeSegundos desde que arrancó el proceso del servidor.
dumbmonit_scheduler_cycles_totalcounterCiclos de scheduler ejecutados. El bucle marca una vez por segundo, así que esto también sirve de señal de vida.
dumbmonit_scheduler_cycle_secondsgaugeDuración del último ciclo. Normalmente por debajo de un milisegundo: el ciclo solo despacha, no espera a las sondas.
dumbmonit_scheduler_backloggaugeMonitores que todavía esperaban una sonda cuando terminó el último ciclo. Cero en una instancia sana; un valor distinto de cero persistente significa que DUMBMONIT_MAX_CONCURRENT_PROBES es demasiado bajo para el número de monitores y sus intervalos.
dumbmonit_probes_total{kind}counterSondas ejecutadas, por tipo de monitor (snmp, proxmox, http…). Incluye las que un agente relay ejecutó en nombre del servidor.
dumbmonit_probes_failed_total{kind}counterSondas que fallaron, por tipo — un monitor inaccesible o un error de configuración. rate(dumbmonit_probes_failed_total[15m]) / rate(dumbmonit_probes_total[15m]) es la proporción de fallo.
dumbmonit_samples_written_totalcounterMuestras aceptadas por VictoriaMetrics.
dumbmonit_sample_writes_failed_totalcounterLotes que VictoriaMetrics rechazó o no respondió. El lote permanece en búfer y se reintenta; un valor en aumento con un dumbmonit_samples_pending en aumento significa que el almacén está caído o lleno.
dumbmonit_samples_pendinggaugeMuestras todavía en el búfer de escritura tras el último flush. Normalmente 0.
dumbmonit_samples_dropped_totalcounterMuestras descartadas antes de llegar siquiera al búfer de escritura, porque estaba lleno o cerrado. Nunca se reintentan — un valor en aumento durante una caída significa pérdida de datos, no solo retraso.
dumbmonit_alerting_cycles_totalcounterCiclos de alertas ejecutados (uno cada DUMBMONIT_ALERT_INTERVAL_SECS, 30 s por defecto).
dumbmonit_alerting_cycle_secondsgaugeDuración del último ciclo de alertas, tiempo de consulta incluido. Acercarse al intervalo significa que las reglas consultan más de lo que puede servir el almacén.
dumbmonit_alerting_rules_evaluatedgaugeReglas evaluadas en el último ciclo.
dumbmonit_alerting_rules_failedgaugeReglas cuya consulta falló en el último ciclo. Sus alertas se congelan, no se resuelven. Cualquier cosa distinta de 0 merece revisar los registros.
dumbmonit_alerts{phase}gaugeAlertas que rastrea el motor, por fase: ok, pending (condición verdadera, for no transcurrido), firing, resolved.
dumbmonit_alerts_suppressedgaugeAlertas ocultas porque un monitor padre está caído (la fase efectiva suppressed).
dumbmonit_alerts_silencedgaugeAlertas cubiertas por una ventana de mantenimiento.
dumbmonit_alerts_learninggaugeAlertas de referencia todavía aprendiendo, y por tanto en silencio.
dumbmonit_notifications_total{kind}counterNotificaciones enviadas, por tipo de canal (email, discord, ntfy…).
dumbmonit_notifications_failed_total{kind}counterNotificaciones que el canal rechazó, por tipo. Se vuelven a encolar y reintentan; un valor en aumento constante es un webhook o cuenta SMTP rota.
dumbmonit_agentsgaugeMáquinas que han registrado un agente.
dumbmonit_agents_stalegaugeAgentes que no han enviado nada en cinco minutos.
dumbmonit_database_upgauge1 cuando SQLite responde — la misma comprobación que /api/health.
dumbmonit_database_bytesgaugeTamaño de dumbmonit.db y su write-ahead log. No incluye /data/vm.
dumbmonit_victoriametrics_upgauge1 cuando VictoriaMetrics responde — la misma comprobación que /api/health. 0 mientras el hijo integrado se reinicia.
dumbmonit_victoriametrics_embeddedgauge1 cuando este servidor ejecuta VictoriaMetrics él mismo, 0 cuando DUMBMONIT_VM_URL apunta a una externa.

Ninguna métrica de esta página lleva ninguna etiqueta por monitor: el documento tiene el mismo tamaño para un monitor y para mil, y ningún nombre de monitor se filtra a quien pueda sondearlo.

Dos alertas que vale la pena añadir de tu lado, una vez que se sondea DumbMonit:

# La monitorización dejó de monitorizar
up{job="dumbmonit"} == 0
# Las mediciones se acumulan en lugar de guardarse
dumbmonit_samples_pending > 0 and increase(dumbmonit_sample_writes_failed_total[10m]) > 0

DUMBMONIT_METRICS_PUBLIC=true sirve /metrics, /federate y /prometheus/api/v1/… a cualquiera que pueda alcanzar el puerto, para quienes filtran el puerto ellos mismos — cualquiera en esa red puede entonces leer cada medición de cada monitor y el estado de la instancia, así que solo defínelo cuando algo más ya restrinja quién alcanza el puerto.