Skip to content

Inicio rápido — MiniObserv ​

Esta guía le lleva desde cero hasta un sistema de observabilidad en funcionamiento en menos de diez minutos.


1. Requisitos previos ​

HerramientaVersión mínimaPropósito
Go1.23+Compilar los binarios
Docker24+Ejecutar TimescaleDB y los servicios
Docker Composev2 (docker compose)Orquestar el stack completo
makecualquieraAtajos de compilación opcionales

Verifique su entorno:

bash
go version          # go1.23.x o superior
docker compose version

2. Construir los binarios ​

Desde la raíz del repositorio:

bash
# Agente de recolección
go build -o bin/agent ./cmd/agent

# Servidor de ingesta y consulta
go build -o bin/server ./cmd/server

Ambos binarios quedan en bin/. También puede usar el Makefile si está disponible:

bash
make build

3. Configuración ​

Variables del agente ​

VariableObligatoriaPredeterminadoDescripción
SERVER_URLsí—URL HTTP/HTTPS del servidor, p. ej. http://localhost:8080
AGENT_TOKENrecomendadavacíoSecreto compartido HS256 para firmar los JWT
AGENT_HOSTnohostname del sistemaNombre lógico del host que aparecerá en las métricas
COLLECT_INTERVALno10sIntervalo de recolección (1 s – 300 s)
LOG_LEVELnoinfoNivel de log: debug, info, warn, error
LOG_PATHSnovacíoRutas de archivos de log a vigilar (separadas por coma)

Variables del servidor ​

VariableObligatoriaPredeterminadoDescripción
DATABASE_URLsí—DSN de PostgreSQL, p. ej. postgres://usuario:clave@host:5432/bd?sslmode=disable
AGENT_TOKENsí—Secreto compartido HS256, mínimo 16 caracteres
LISTEN_ADDRno:8080Dirección y puerto de escucha
MIGRATIONS_PATHno./migrationsDirectorio con los archivos de migración SQL
LOG_LEVELnoinfoNivel de log: debug, info, warn, error
REQUEST_TIMEOUTno10sTiempo máximo por petición HTTP (1 s – 120 s)
SHUTDOWN_TIMEOUTno5sTiempo de espera para apagado limpio (1 s – 30 s)
ALERT_NOTIFICATIONSno—Array JSON de objetos webhook. Ver sección Notificaciones.
HOST_STALE_AFTERno20sTiempo tras el cual un host silencioso se marca como stale. Acepta duraciones Go.
HOST_DOWN_AFTERno50sTiempo tras el cual un host silencioso se marca como down y se dispara el webhook host.down.

Importante: DATABASE_URL debe usar el esquema postgres:// o postgresql://. El esquema pgx5:// es solo para el driver de migraciones interno.


Notificaciones ​

MiniObserv puede enviar un payload JSON por HTTP a uno o más webhooks cuando una alerta de umbral se dispara o se resuelve, y también cuando un host deja de reportar métricas durante más tiempo del definido en HOST_DOWN_AFTER.

Configure ALERT_NOTIFICATIONS con un array JSON de objetos webhook:

bash
ALERT_NOTIFICATIONS='[{"type":"webhook","url":"https://hooks.slack.com/services/YOUR/WEBHOOK/URL"}]'

Cada webhook recibe un payload con esta forma:

json
{"event":"firing","rule":{...},"value":10.36,"fired_at":"2026-06-05T16:42:23Z"}
  • event es "firing" cuando se supera el umbral y "resolved" cuando se recupera.
  • La entrega es "fire-and-forget" con un timeout de 5 segundos; no hay reintentos en v1.
  • Compatible con cualquier webhook HTTP: Slack, Discord, Teams, PagerDuty o un endpoint propio.

Múltiples destinos:

bash
ALERT_NOTIFICATIONS='[
  {"type":"webhook","url":"https://hooks.slack.com/services/YOUR/WEBHOOK/URL"},
  {"type":"webhook","url":"https://discord.com/api/webhooks/YOUR/WEBHOOK"}
]'

Grafana ​

MiniObserv expone GET /metrics en formato de texto Prometheus. Para añadir Grafana:

bash
cd deployments
docker compose -f docker-compose.yml -f grafana/docker-compose.yml up

Guía completa → Integración con Grafana


4. Ejecutar con Docker Compose ​

El archivo deployments/docker-compose.yml levanta TimescaleDB, el servidor y el agente en una sola red interna.

bash
cd deployments
docker compose up --build

Qué esperar en los logs al arrancar:

timescaledb  | database system is ready to accept connections
server       | migrations applied successfully
server       | listening on :8080
agent        | starting collection loop interval=10s
agent        | batch sent metrics=7
  • Los primeros ticks del agente no incluirán métricas de red (net.*) — esto es normal (ver sección 8).
  • El servidor aplica las migraciones automáticamente al arrancar; no es necesario ejecutarlas a mano.

5. Generar AGENT_TOKEN ​

Crear un secreto fuerte ​

bash
# openssl (disponible en Linux, macOS y WSL)
openssl rand -base64 32

# Ejemplo de salida:
# 7kQzP1mXwN8vLhR3tYsA0bJdCeOuGfIi4nKpMqVrTg==

El secreto debe tener al menos 16 caracteres. Úselo como valor de AGENT_TOKEN tanto en el servidor como en el agente.

Generar un JWT manualmente (para pruebas) ​

Si necesita llamar a la API directamente sin ejecutar el agente:

bash
# Instalar jwt-cli (opcional, solo para pruebas)
# go install github.com/nicholasgasior/jwt-cli@latest

# O usar Python si está disponible:
python3 - <<'EOF'
import hmac, hashlib, base64, json, time

secret = b"TU_SECRETO_AQUI"
header = base64.urlsafe_b64encode(json.dumps({"alg":"HS256","typ":"JWT"}).encode()).rstrip(b"=")
payload = base64.urlsafe_b64encode(json.dumps({"sub":"agent","exp": int(time.time()) + 86400}).encode()).rstrip(b"=")
sig_input = header + b"." + payload
sig = base64.urlsafe_b64encode(hmac.new(secret, sig_input, hashlib.sha256).digest()).rstrip(b"=")
print((sig_input + b"." + sig).decode())
EOF

El agente genera sus propios JWTs automáticamente si AGENT_TOKEN está configurado. El script anterior es solo para pruebas manuales.


6. Verificar que funciona ​

Espere al menos 30 segundos para que el agente envíe su primer batch completo (con deltas de red).

Verificar liveness ​

bash
curl -s http://localhost:8080/healthz
# ok

Verificar readiness (conexión con la base de datos) ​

bash
curl -s http://localhost:8080/readyz
# ok

Obtener un token JWT para las pruebas ​

Si está usando Docker Compose con el valor de ejemplo, el token es change-me-use-a-real-secret-min-16ch. Para producción, reemplácelo y genere un JWT como se describe en la sección 5.

Consultar métricas de CPU (últimos 5 minutos) ​

bash
TOKEN="TU_JWT_AQUI"
HOST="TU_HOST_AQUI"

curl -s \
  -H "Authorization: Bearer $TOKEN" \
  "http://localhost:8080/api/v1/metrics/query?host=$HOST&name=cpu.usage_pct&from=2026-06-05T12:00:00Z&to=2026-06-05T12:05:00Z&bucket=1m&agg=avg"

Respuesta esperada:

json
{
  "host": "mi-servidor",
  "name": "cpu.usage_pct",
  "bucket": "1m",
  "agg": "avg",
  "points": [
    { "time": "2026-06-05T12:04:00Z", "value": 12.5 },
    { "time": "2026-06-05T12:03:00Z", "value": 11.8 }
  ]
}

7. Detener el sistema ​

Presione Ctrl+C o envíe SIGINT al proceso. El servidor acepta la señal y espera a que las peticiones en vuelo terminen antes de cerrarse (según SHUTDOWN_TIMEOUT, predeterminado 5 s).

bash
# Con Docker Compose:
docker compose down

# Para eliminar también los volúmenes de datos:
docker compose down -v

8. Solución de problemas ​

El servidor no arranca: "DATABASE_URL must be a valid postgres:// URL" ​

El DSN debe comenzar con postgres:// o postgresql://, no con pgx5:// ni postgresql5://.

bash
# Correcto:
DATABASE_URL="postgres://usuario:clave@localhost:5432/miniobserv?sslmode=disable"

# Incorrecto:
DATABASE_URL="pgx5://usuario:clave@localhost:5432/miniobserv"

El servidor no arranca: "AGENT_TOKEN must be at least 16 characters" ​

El secreto configurado tiene menos de 16 caracteres. Genere uno nuevo:

bash
openssl rand -base64 32

El agente no envía métricas de red en el primer tick ​

Esto es por diseño. net.bytes_in y net.bytes_out usan semántica de deltas: el primer tick solo registra el estado inicial de los contadores. A partir del segundo tick, las métricas de red estarán disponibles normalmente.

Las consultas devuelven [] aunque el agente está enviando ​

Verifique que los parámetros host y from/to coincidan exactamente con los datos almacenados. Puede inspeccionar el host real en los logs del agente:

bash
docker compose logs agent | grep "batch sent"

El agente no puede conectarse al servidor: "connection refused" ​

  • Confirme que SERVER_URL apunta a la dirección correcta.
  • Si ejecuta fuera de Docker, use http://localhost:8080 en lugar de http://server:8080.

Error 401 Unauthorized en la API ​

  • Confirme que AGENT_TOKEN es idéntico en el servidor y en el agente.
  • Verifique que el JWT no haya expirado (duración predeterminada: 24 horas).
  • El encabezado debe ser exactamente Authorization: Bearer <token>.

Released under the MIT License.