Documentación/Arquitectura

Flujos de petición

Ingest (agent → API → TSDB)

  1. El agente abre una conn mTLS hacia :8443
  2. La config TLS del servidor verifica el peer-cert contra la CA emitida
  3. agentIDFromCert(r) → identity (NUNCA desde body/header)
  4. SELECT organization_id, status, region_id FROM agents
  5. Sample[]: organization_id + agent_id + host se pegan a cada métrica
  6. router.VMForRegion(region_id) → el cliente TSDB de la región
  7. vm.Write(samples)
  8. UPDATE agents SET last_seen_at = now()

Consulta del cabinet

  1. Browser → /api/v1/orgs/:slug/query/range?metric=X&host=Y
  2. Session middleware (cookie) → userCtx
  3. orgMiddleware → orgContext{OrgID, UserID, Role}
  4. composeQuery("X", {organization_id: OrgID, host: Y})
  5. vm.Range(promQuery, start, end, step)

Consulta embed

  1. Backend partner: POST /api/v1/embed/tokens con mk_xxx
  2. La API verifica el origin de la clave contra la allowlist
  3. Se emite un JWT: los claims contienen {org_id, filters}
  4. El partner coloca el JWT en un iframe o postMessage
  5. SDK → /api/v1/embed/query/range con un Bearer JWT
  6. embed.Required: parsea el JWT, extrae filters de los claims
  7. composeQuery con claim.filters