Skip to main content
Glama

inferwatch

ci python license

Métricas en tiempo real e históricas para LLM servidos localmente — Ollama y vLLM — con un panel en el navegador, una pantalla de configuración y un servidor MCP para que un agente pueda consultar los mismos datos.

Un proceso Python, un archivo SQLite. Sin Docker, sin Node, sin Prometheus, sin servicios externos. Nunca se interpone en la ruta de solicitudes, por lo que no puede ralentizar ni romper la inferencia.

┌── Ollama ──────────────┐        ┌── vLLM ────────────────┐
│ journald / file /      │        │ GET /metrics           │
│ docker logs            │        │ (native Prometheus)    │
└──────────┬─────────────┘        └──────────┬─────────────┘
           │ per-request rows                │ pre-aggregated
           ▼                                 ▼
        ┌──────────────── SQLite (WAL) ────────────────┐
        │  requests · rollups · vllm_samples/hist      │
        └───────┬──────────────────────────┬───────────┘
                ▼                          ▼
         dashboard :7070            MCP server (stdio)

Los dos motores no son simétricos, y la herramienta no finge lo contrario

Este es el hecho central del diseño, por lo que vale la pena decirlo claramente.

Ollama

vLLM

Fuente

su registro

/metrics

Filas por solicitud

no — no existen para recopilar

TTFT / latencia

exacto, por solicitud

solo histogramas

Tokens

por solicitud

contadores acumulativos

Errores

estado HTTP por solicitud

request_success_total{finished_reason}

Dirección del cliente

no

Percentiles

exactos dentro de la retención

límites superiores de cubo; las medias son exactas

Extras únicos

reutilización de caché de prompt, aceptación de borrador, tiempo de carga en frío

ocupación de caché KV, preferencias, ocupación de lote, espera por motivo

Ambas pestañas muestran utilización de GPU, VRAM, temperatura y consumo de energía, ya que esos se miden con nvidia-smi en lugar de con cualquiera de los motores. La temperatura y la energía tienen gráficos separados en lugar de compartir un eje, y cada uno se agrega según lo que exige su unidad: la utilización promedia entre tarjetas, la VRAM y los vatios suman, la temperatura informa la tarjeta más caliente. La temperatura es la única serie que no se traza desde cero: un rango de 33–68 °C que comienza en 0 desperdicia la mayor parte del gráfico.

Por lo tanto, obtienen pestañas de panel separadas, tablas separadas y herramientas MCP separadas. No se intenta reconstruir filas por solicitud para vLLM diferenciando contadores: no se puede recuperar qué TTFT perteneció a qué solicitud, y falsificarlo pondría filas inventadas junto a las reales.

Ollama: de dónde vienen los números

Ollama no expone un endpoint /metrics (verificado — la ruta no está en el binario). Con OLLAMA_DEBUG=1, el llama.cpp integrado imprime un bloque de tiempos por solicitud, que se combina con la línea de acceso y la línea del programador:

slot print_timing: id 0 | task 6763 | prompt eval time = 1254.52 ms /  55 tokens
slot print_timing: id 0 | task 6763 |        eval time = 14591.31 ms / 416 tokens
[GIN] ... | 200 | 16.862061865s | 192.0.2.10 | POST "/v1/chat/completions"
time=... msg="context for request finished" runner.name=.../llama3.2:3b

Eso produce TTFT, división prefill/decode, recuentos de tokens, tasa de decode, estado, cliente, endpoint y modelo — para cada solicitud, de cada cliente, sin tocar la ruta de solicitudes. Dos números surgen de la combinación que ninguna fuente tiene por sí sola:

  • espera en cola = latencia de pared − tiempo de ejecución: tiempo dedicado a esperar en lugar de generar. Un proxy no puede separar estos.

  • reutilización de caché de prompt = longitud completa del prompt − tokens realmente evaluados.

Se requiere OLLAMA_DEBUG=1. Sin él, llama.cpp no imprime líneas de tiempos: las tasas de solicitudes, los estados y las métricas de GPU aún funcionan, pero TTFT y los recuentos de tokens permanecen vacíos. El panel lo indica en un banner en lugar de mostrar ceros.

# /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_DEBUG=1"

vLLM: de dónde vienen los números

El endpoint Prometheus nativo de vLLM se consulta cada collection.scrape_interval_s (por defecto 10s). Los contadores acumulativos se diferencian; los cubos de histograma se diferencian por cubo; ambos se escriben agregados por minuto, porque almacenar cada consulta añadiría millones de filas al mes en resoluciones que ningún gráfico usa.

Tres detalles que vale la pena conocer:

  • Los límites de cubo propios de vLLM se almacenan con los recuentos. Sus límites avanzan 1ms/20ms/250ms/2.5s/40s/640s; los de Ollama avanzan 25ms/200ms/1.5s/15s/60s. Ninguno es un refinamiento del otro, por lo que re-cubicar uno en el otro requeriría interpolar entre límites — inventar números. Los percentiles se calculan contra los límites de cada fuente y se informan como límites superiores de cubo.

  • _sum y _count son exactos, por lo que la media es exacta. Dado que los cubos de vLLM son gruesos en el rango de segundos, el panel y las herramientas MCP lideran con la media y etiquetan los percentiles como "como máximo".

  • Los reinicios se detectan mediante process_start_time_seconds (y por un contador que retrocede). El intervalo que abarca un reinicio se descarta en lugar de emitirse como un delta falso.

La latencia entre tokens se ha escrito time_per_output_token_seconds, inter_token_latency_seconds y request_time_per_output_token_seconds a lo largo de las versiones de vLLM. Todos se recopilan y se usa el que tenga datos, por lo que esto funciona con servidores antiguos y nuevos sin configuración.


Related MCP server: System Monitor MCP Server

Instalación

Requiere Python 3.10 o más reciente — no por este código (que es limpio para 3.9) sino porque fastapi, uvicorn, starlette y mcp lo requieren.

pip install git+https://github.com/floatsmyboat/inferwatch     # or:
git clone https://github.com/floatsmyboat/inferwatch && cd inferwatch
python3 -m venv --upgrade-deps .venv && .venv/bin/pip install -e ".[dev]"

Instalar te da dos comandos:

Comando

Qué es

inferwatch

el recopilador, panel y API (serve, ingest, stats, sources)

inferwatch-mcp

el servidor MCP, sobre stdio

Aún no está en PyPI; instala desde git por ahora.

Haz un backfill desde un journal que ya tengas, luego mira la base de datos:

inferwatch ingest --since 2d      # or: python -m inferwatch.main ingest
inferwatch stats

Ejecútalo:

inferwatch serve                  # http://127.0.0.1:7070

Como servicio — la unidad se genera desde systemd/inferwatch.service.in para el usuario actual, la ruta de checkout y el intérprete, por lo que nada está codificado:

./scripts/install-systemd.sh          # system service (uses sudo)
sudo systemctl enable --now inferwatch

./scripts/install-systemd.sh --user   # or per-user, no sudo
systemctl --user enable --now inferwatch

Anula con HOST=0.0.0.0 PORT=7070 DATADIR=... ./scripts/install-systemd.sh.

Exponerlo en una red

No hay autenticación. El panel es de solo lectura (solo GET) y no almacena texto de prompts ni respuestas — solo recuentos, tiempos, nombres de modelos y direcciones de clientes. Restringe en el firewall:

sudo ufw allow from 192.168.1.0/24 to any port 7070 proto tcp comment "inferwatch"

Configurar lo que se monitorea

Todo es editable desde la pestaña Configuración del panel, o desde la CLI:

python -m inferwatch.main sources                       # list
python -m inferwatch.main sources add --kind vllm --name qwen \
    --set url=http://127.0.0.1:8000
python -m inferwatch.main sources add --kind ollama --name box \
    --set reader=file --set path=~/.ollama/logs/server.log
python -m inferwatch.main sources disable qwen

Lectores de registros de Ollama. No todos ejecutan Ollama bajo systemd:

lector

para

fidelidad de timestamp

journald

ollama.service

microsegundo, desde journald

file

ollama serve en una terminal, o cualquier instalación que registre en un archivo

derivado; ver más abajo

docker

Ollama en un contenedor

por línea, desde docker logs -t

El lector file sigue como tail -F, sobreviviendo a la rotación (cambio de inodo) y truncamiento, y persiste un offset para que un reinicio no reproduzca. Las líneas Go de Ollama llevan time=, pero las líneas slot de llama.cpp — las que contienen los recuentos de tokens — no llevan timestamp, por lo que el más reciente visto se arrastra hacia adelante. El orden, del que dependen las uniones, siempre se mantiene; la precisión absoluta es menor que la de journald, y una línea [GIN] de resolución de segundo se sujeta hacia adelante para que el tiempo nunca parezca retroceder.

Precedencia de configuración

spec default  <  database (Settings tab)  <  environment  <  command line

Una clave suministrada por el entorno o una bandera se muestra solo lectura en la pestaña Configuración con su origen, porque al proceso se le dijo que la usara y un navegador no debe anularla silenciosamente. Guardar es todo o nada, por lo que un error tipográfico en un campo no puede dejar una configuración a medias. Los cambios en fuentes, intervalos y retención se aplican sin reinicio; server.host y server.port están marcados como que necesitan uno, y la API lo dice después de guardar.

Referencia de configuración

Cada configuración a continuación es editable en la pestaña Configuración, configurable como variable de entorno, y algunas se pueden fijar con una bandera. Las tablas se generan desde el código (scripts/gen-config-docs.py), por lo que no pueden desviarse de lo que el programa realmente acepta.

Generado por scripts/gen-config-docs.py — no editar a mano.

Colección

Configuración

Predeterminado

Acepta

Variable de entorno

Notas

collection.poll_interval_s

5.0

1–300

INFERWATCH_COLLECTION_POLL_INTERVAL_S

Con qué frecuencia se muestrean nvidia-smi y el propio endpoint de estado del motor.

collection.scrape_interval_s

10.0

1–300

INFERWATCH_COLLECTION_SCRAPE_INTERVAL_S

Con qué frecuencia se lee el endpoint /metrics de cada instancia de vLLM. Los contadores de vLLM son acumulativos, por lo que esto establece la resolución de cada tasa e histograma derivado de ellos.

collection.backfill

2d

7d, o -2 days / @epoch

INFERWATCH_COLLECTION_BACKFILL

requiere reinicio — Cuánto hacia atrás leer en la primera ejecución, antes de que exista cualquier estado de reanudación. Acepta 7d / 6h, o una forma de journalctl como '-2 days'.

collection.rollup_interval_s

60.0

10–3600

INFERWATCH_COLLECTION_ROLLUP_INTERVAL_S

Con qué frecuencia se recalculan los agregados de 1 minuto y 1 hora.

Retención

Configuración

Predeterminado

Acepta

Variable de entorno

Notas

retention.raw_days

7.0

0.5–3650

INFERWATCH_RETENTION_RAW_DAYS

El detalle por solicitud más antiguo que esto se elimina. Los resúmenes se conservan indefinidamente, por lo que los gráficos de largo alcance sobreviven.

retention.sample_days

30.0

0.5–3650

INFERWATCH_RETENTION_SAMPLE_DAYS

Las muestras de GPU, las muestras del motor y el registro de eventos se recortan a esto.

Panel

Ajuste

Predeterminado

Acepta

Variable de entorno

Notas

dashboard.default_window

1h

15m, 1h, 6h, 24h, 7d, 30d

INFERWATCH_DASHBOARD_DEFAULT_WINDOW

Rango seleccionado al abrir el panel.

dashboard.include_health

false

INFERWATCH_DASHBOARD_INCLUDE_HEALTH

Incluye HEAD / y sondeos de estado en las tasas de solicitudes. Desactivado por defecto porque en una instancia sondeada puede ser el 90%+ de los accesos.

dashboard.refresh_s

10.0

2–600

INFERWATCH_DASHBOARD_REFRESH_S

Con qué frecuencia el panel abierto vuelve a obtener datos. El feed de solicitudes en vivo se envía por separado y no se ve afectado por esto.

Servidor

Setting

Predeterminado

Acepta

Variable de entorno

Notas

server.host

127.0.0.1

INFERWATCH_SERVER_HOST

requiere reinicio — 0.0.0.0 expone el panel en la red. No hay autenticación, así que restrinja el acceso en su cortafuegos.

server.port

7070

1–65535

INFERWATCH_SERVER_PORT

requiere reinicio — Puerto en el que escuchan el panel y la API.

Campos de fuente

Establezca estos con --set key=value en sources add, o en la pestaña Settings.

Ollama (--kind ollama)

Campo

Predeterminado

Requerido cuando

Notas

reader

journald

De dónde leer el log de ollama. Las métricas por solicitud provienen de las líneas de depuración de llama.cpp, por lo que se requiere uno de estos. Uno de journald, file, docker.

unit

ollama

reader=journald

path

reader=file

Se sigue como tail -F, por lo que la rotación y la truncación se manejan.

container

ollama

reader=docker

url

http://127.0.0.1:11434

Se usa para sondear /api/ps en busca de modelos residentes.

models_dir

Opcional. Resuelve resúmenes de blob a nombres de modelos en eventos de carga. Por defecto a $OLLAMA_MODELS o ~/.ollama/models.

vLLM (--kind vllm)

Campo

Predeterminado

Requerido cuando

Notas

url

http://127.0.0.1:8000

La raíz del servidor compatible con OpenAI. /metrics se lee desde aquí.

unit

Si se establece, el journal también se lee para códigos de estado HTTP, direcciones de cliente y errores del motor, que /metrics no expone.

api_key

Se envía como token de portador si el servidor lo requiere.

Banderas de línea de comandos

Bandera

Propósito

Fija el ajuste

--db

--unit

unidad systemd para la fuente Ollama sembrada / para ingestión

--ollama-url

--models-dir

directorio de modelos de ollama (resuelve resúmenes de blob a nombres de modelos)

--log-file

ingestión: leer este archivo de log en lugar del journal

--since

ventana de relleno de log, p. ej. '-2 days'

collection.backfill

--retention-days

retención de solicitudes crudas; los rollups se conservan para siempre

retention.raw_days

--poll-interval

collection.poll_interval_s

--scrape-interval

collection.scrape_interval_s

--host

server.host

--port

server.port

-v, --verbose

Las banderas que fijan un ajuste tienen prioridad sobre el entorno y la pestaña Settings; la pestaña muestra esas claves de solo lectura con su origen.

Alcance: una fuente de Ollama, muchas fuentes de vLLM

Las filas de vLLM se identifican por fuente en todas partes, por lo que se puede monitorear cualquier número de instancias vLLM en paralelo. Las tablas de Ollama (requests, events, ps_samples) no están particionadas por fuente, por lo que exactamente una fuente de Ollama se ejecuta a la vez; habilitar una segunda registra una advertencia y la ignora en lugar de mezclar silenciosamente dos instancias en un conjunto de números. Particionar esas tablas es un cambio de esquema que vale la pena hacer deliberadamente.


Dashboard

http://127.0.0.1:7070 — tres pestañas: Ollama, vLLM, Settings.

¿Qué GPU pertenecen a qué motor?

Un host a menudo ejecuta más de un motor, por lo que trazar cada tarjeta en el panel de una instancia implicaría que usa todas. Las GPU de cada instancia vLLM se resuelven siguiendo procesos — el puerto que sirve → el pid que escucha → sus descendientes → intersectado con los procesos de cómputo de nvidia-smi → las tarjetas que estos ocupan. Las tarjetas de la instancia llevan el color de la serie y su mosaico de VRAM cuenta solo esas; las otras tarjetas del host permanecen visibles en gris, etiquetadas como "other engine".

La atribución necesita ss, una instancia local y visibilidad de procesos de nvidia-smi (a menudo ausente dentro de contenedores). Cuando falta alguno de estos, el panel lo indica y muestra todas las tarjetas sin énfasis, en lugar de adivinar.

Una fila de filtro limita todo lo que está debajo. Cada gráfico tiene un conmutador Table que muestra la misma serie como números, por lo que ningún valor es alcanzable solo al pasar el cursor. Un feed SSE en vivo impulsa el ticker de solicitudes y la cifra de tasa actual.

Parámetros de URL: ?tab=vllm, ?window=6h, ?model=llama3.2:3b, ?source=name, ?nostream=1 (desactiva el feed en vivo — útil para pantallas de kiosco y herramientas de captura de pantalla, que de lo contrario esperan para siempre en un stream abierto).

API

Endpoint

Devuelve

/api/dashboard?window=1h&model=

todo lo que necesita la pestaña Ollama, una franja de tiempo

/api/vllm/dashboard?window=1h&source=

igual para una instancia vLLM

/api/summary, /api/timeseries, /api/models, /api/slowest?by=queue_ms

desgloses de Ollama

/api/vllm/summary, /api/vllm/timeseries, /api/vllm/instances

desgloses de vLLM

/api/requests, /api/errors, /api/events, /api/gpu, /api/ps

filas crudas y líneas de tiempo

/api/config (GET/PUT), /api/config/reset

ajustes

/api/sources (GET/POST/PUT/DELETE), /api/sources/probe

motores monitoreados

/api/prefs, /api/status, /api/health

valores predeterminados del panel, estado del recopilador

/api/stream

feed SSE en vivo

/api/sources/probe verifica una definición antes de que se guarde, por lo que un error tipográfico aparece allí en lugar de como silencio en los gráficos.


Servidor MCP

./scripts/install-mcp.sh      # writes .mcp.json for this checkout (gitignored)

o claude mcp add inferwatch -- /path/to/.venv/bin/python -m inferwatch.mcp_server.

Abre el mismo archivo SQLite de solo lectura (mode=ro más PRAGMA query_only) y responde a través de la misma capa de consultas que el panel, por lo que un número que informa siempre coincide con el número en pantalla.

Herramienta

Propósito

get_summary, get_timeseries

Métricas principales y series de Ollama

compare_models, list_models

desglose por modelo; qué está residente

recent_requests, slowest_requests, recent_errors

detalle por solicitud de Ollama

get_events

cargas en frío, desalojos, truncamientos, advertencias

vllm_summary, vllm_timeseries, vllm_instances

métricas de vLLM, alcanzabilidad, atribución de GPU

gpu_status

util/VRAM/temp/potencia por dispositivo

list_sources, get_settings

qué se monitorea y cómo está configurado

health

si la recopilación funciona, si el registro de depuración está activado

run_sql, describe_schema

vía de escape SELECT de solo lectura, con unidades


Retención

  • Filas crudas por solicitud (Ollama): 7 días (retention.raw_days).

  • Muestras de GPU, eventos, filas de vLLM: 30 días (retention.sample_days).

  • rollup_1m y rollup_1h: se conservan indefinidamente.

Los rollups almacenan histogramas de cubos fijos de TTFT y latencia, no percentiles precalculados. Los histogramas se suman, por lo que un percentil sobre cualquier rango se calcula sumando los cubos y avanzando hasta el rango objetivo. Los percentiles de percentiles no tendrían sentido; esto no.

{"type": "text"}

Las consultas dentro de la ventana sin procesar devuelven percentiles exactos; más allá provienen de histogramas y se informan como el límite superior del cubo contenedor. Cada respuesta lleva exact: true|false.

Reinicios y rearranques

El estado de reanudación es por fuente — un cursor de journald, un inodo+offset de archivo, o una marca de tiempo de docker — y se vacía en SIGTERM. Dos cosas hacen que eso sea seguro en lugar de meramente probable:

Las escrituras son idempotentes. Cada fila de solicitud y evento lleva una dedupe_key bajo un índice UNIQUE, y las inserciones son INSERT OR IGNORE. Releer líneas que ya estaban almacenadas es un no-op, por lo que ingest puede ejecutarse repetidamente y una reanudación puede superponerse de forma segura.

Un cursor que no se puede usar no es de confianza. Si el diario al que apunta un cursor fue rotado, journalctl se reposiciona silenciosamente usando la marca de tiempo incrustada en el cursor y se reanuda correctamente. Pero un cursor sellado en el futuro (desviación de reloj, base de datos restaurada) hace que journalctl espere entradas que no llegarán, deteniendo la recopilación silenciosamente; tal cursor se rechaza al inicio. Un intento de seguimiento que no produce nada dos veces seguidas hace lo mismo.

systemctl stop se completa en mucho menos de un segundo. systemd registra ExecMainStatus=15 junto con Result=success: uvicorn deliberadamente vuelve a lanzar la señal después de apagarse, por lo que salir por SIGTERM es esperado, no un fallo.


Limitaciones honestas

Atribución bajo paralelismo (Ollama). El id de tarea en las líneas de temporización de llama.cpp y el estado de la línea de acceso nunca aparecen juntos, por lo que se unen por orden de llegada. Con una solicitud en curso eso es exacto. Cuando dos terminan antes de que se imprima cualquiera de las líneas de acceso, nada en el registro las desambigua — esas filas se almacenan como attribution='ambiguous' en lugar de adivinarse. Valores: exact, ambiguous, none (falló antes de llegar al runner — no se adivina ningún modelo tampoco), orphan (temporizaciones sin línea de acceso). Un backfill de 2 días en el host de desarrollo obtuvo 174 exactos, 9 ambiguos, 4 huérfanos, con OLLAMA_NUM_PARALLEL=1 en efecto; espera una mayor proporción de ambiguos cuanto más solicitudes se ejecuten concurrentemente.

Los contadores de tokens y solicitudes de vLLM no están alineados por solicitud. generation_tokens_total avanza a medida que los tokens se transmiten; request_success_total avanza solo cuando una solicitud se completa. En una ventana corta, por lo tanto, describen conjuntos de solicitudes superpuestos pero diferentes, y dividir uno por el otro no da tokens por solicitud. La API marca esto con counters_aligned: false, y el panel lo indica en la pestaña de vLLM.

Nada por solicitud para vLLM. Cubierto arriba. Si necesitas detalles por solicitud de vLLM, su registro a nivel de solicitud es la única fuente, y registra el texto del prompt — que esta herramienta deliberadamente nunca almacena.

Los registros son la fuente, no el archivo. Un diario puede contener solo un día o dos dependiendo de journald.conf; el archivo SQLite es el historiador. Si los registros rotan más rápido de lo que se ejecuta inferwatch, ese vacío es irrecuperable.

Dos eventos idénticos en bytes en el mismo microsegundo se colapsan en uno. La clave de deduplicación para eventos se construye a partir de sus valores, por lo que una advertencia idéntica registrada dos veces dentro de un microsegundo conserva una fila. Una compensación deliberada por idempotencia garantizada — descartar una advertencia repetida es mejor que duplicar el historial.

El tráfico de verificación de salud está separado, no contado. HEAD / y GET /api/ps fueron el 96% de las solicitudes en el host de desarrollo. Se almacenan con class='health' y se excluyen de las tasas de inferencia a menos que dashboard.include_health esté activado; requests_all siempre los incluye.

Depende de los formatos de registro y los nombres de métricas. Las líneas de temporización de Ollama son salida de depuración, no un contrato, y vLLM renombra métricas entre versiones. tests/test_parse.py contiene líneas de fixture verbatim y tests/test_vllm.py un extracto real de /metrics; si una actualización rompe el parseo, esas pruebas fallan y muestran qué cambió.


Pruebas

python -m unittest discover -s tests -t .

CI ejecuta esto en Python 3.10 hasta 3.14, más un trabajo de empaquetado que construye la rueda, verifica que el HTML del panel esté dentro, y lo instala en un entorno limpio desde un directorio vacío para que el árbol fuente no pueda ocultar un error de empaquetado. No se requiere red, GPU o motor. Los fixtures del parser son líneas de registro reales verbatim y un extracto real de /metrics. La cobertura incluye la unión del correlacionador y sus casos ambiguos/huérfanos/fallidos, percentiles de histograma e idempotencia de rollup, la migración de esquema, commits seguros para señales, validación de cursor, rotación y truncamiento de archivos, monotonicidad de marcas de tiempo, detección de reinicio de contadores, y precedencia y bloqueo de configuración. La referencia de configuración en este archivo se genera a partir de la especificación y una prueba falla si se desvía. El JavaScript del panel se verifica sintácticamente con un parser puro de Python y sus formateadores se ejecutan en un motor JS real (ambos opcionales — no se necesita Node).

.venv/bin/python scripts/gen-config-docs.py --check   # docs match the code?

Estructura

inferwatch/parse.py        ollama log line parsers (pure, fixture-tested)
inferwatch/readers.py      journald / file / docker log readers
inferwatch/collect.py      correlator, GPU + model pollers, maintainer
inferwatch/vllm.py         Prometheus scraper, delta and reset handling
inferwatch/gpuproc.py      maps GPUs to the process tree holding them
inferwatch/vllm_metrics.py vLLM query layer
inferwatch/metrics.py      ollama query layer (shared by API and MCP)
inferwatch/store.py        SQLite schema, rollups, histograms, retention
inferwatch/config.py       typed settings spec, precedence, source validation
inferwatch/supervisor.py   builds and rebuilds collectors from the sources table
inferwatch/api.py          FastAPI endpoints + SSE
inferwatch/web/index.html  dashboard (single file, no CDN, no build step)
inferwatch/mcp_server.py   MCP server (read-only)
inferwatch/main.py         serve / ingest / stats / sources

Contribuciones

Los issues y pull requests son bienvenidos. Dos cosas hacen que un cambio sea fácil de aceptar:

  • python -m unittest discover -s tests -t . pasa.

  • Si tocaste inferwatch/config.py, ejecuta python scripts/gen-config-docs.py para que la referencia de configuración del README coincida con el código — una prueba lo hace cumplir.

Los cambios en el parser deben venir con una línea de fixture copiada verbatim de la salida real del motor, como hacen las pruebas existentes. Los formatos de registro y los nombres de métricas no son contratos, y un fixture real es lo que hace obvia una futura ruptura.

Licencia

Apache License 2.0 — ver LICENSE y NOTICE.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables AI agents to query Prometheus metrics and Loki logs for intelligent alert investigation and troubleshooting. Provides service discovery, metric querying, log searching, and correlation tools to help identify root causes of issues.
    9
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to monitor real-time CPU, RAM, and disk usage on the local machine.

View all related MCP servers

Related MCP Connectors

  • Provide real-time data querying and visualization by integrating Tako with your agents. Generate o…

  • Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.

  • See, price, and control every tool call your AI agents make: policy checks, cost, and audit tools.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/floatsmyboat/inferwatch'

If you have feedback or need assistance with the MCP directory API, please join our Discord server