Documentation/Architecture

Flux de requêtes

Ingest (agent → API → TSDB)

  1. L'agent ouvre une conn mTLS vers :8443
  2. La config TLS serveur vérifie le peer-cert contre la CA émise
  3. agentIDFromCert(r) → identity (JAMAIS depuis body/header)
  4. SELECT organization_id, status, region_id FROM agents
  5. Sample[] : organization_id + agent_id + host sont accolés à chaque métrique
  6. router.VMForRegion(region_id) → le client TSDB de la région
  7. vm.Write(samples)
  8. UPDATE agents SET last_seen_at = now()

Requête 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)

Requête embed

  1. Backend partenaire : POST /api/v1/embed/tokens avec mk_xxx
  2. L'API vérifie l'origine de la clé contre l'allowlist
  3. Un JWT est émis : les claims contiennent {org_id, filters}
  4. Le partenaire place le JWT dans un iframe ou postMessage
  5. SDK → /api/v1/embed/query/range avec un Bearer JWT
  6. embed.Required : parse le JWT, extrait filters des claims
  7. composeQuery avec claim.filters