Документация/Архитектура

Request flows

Ingest (agent → API → VM)

  1. Агент открывает mTLS-conn к :8443
  2. Server TLS config верифицирует peer-cert против выписанного CA
  3. agentIDFromCert(r) → identity (НИКОГДА не из body/header)
  4. SELECT organization_id, status, region_id FROM agents
  5. Sample[]: каждой метрике клеится organization_id + agent_id + host
  6. router.VMForRegion(region_id) → VM-клиент региона
  7. vm.Write(samples)
  8. UPDATE agents SET last_seen_at = now()

Cabinet query

  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)

Embed query

  1. Партнёрский backend: POST /api/v1/embed/tokens с mk_xxx
  2. API верифицирует key origin против allowlist
  3. JWT выпускается: claims содержат {org_id, filters}
  4. Партнёр кладёт JWT в iframe или postMessage
  5. SDK → /api/v1/embed/query/range с Bearer JWT
  6. embed.Required: парсит JWT, извлекает filters из claims
  7. composeQuery с claim.filters