Documentación/Arquitectura

Frontera multi-tenant

El invariante de seguridad principal: cada consulta PromQL pasa por `composeQuery` o `rewritePromQL`. Ambos inyectan organization_id como mandatory label matcher. No existe un raw-query path para el input de usuario.

composeQuery

Toma un bare metric name + filters → construye PromQL de la forma:

metric{organization_id="<org-id>", host="web-01"}

Los mandatory filters siempre ganan. Los opcionales (de URL params) se añaden si no entran en conflicto.

rewritePromQL

Parsea el PromQL del usuario vía prometheus/promql/parser, recorre el AST vía parser.Inspect. En cada VectorSelector y MatrixSelector los LabelMatchers se reemplazan por un merged set donde organization_id gana.

Un usuario no puede «eludir» organization_id ni indicándolo explícitamente en la consulta — el rewrite lo sobrescribe.