Volver a la wiki

Servicio group_service — Group metrics con validación PromQL

Descripción

Módulo monitoring/services/group_service.py que consulta métricas agregadas de grupos de dispositivos en VictoriaMetrics. En sesión 107 se añadió validación contra inyección PromQL/MetricsQL.

Cambios sesión 107

Guard anti-inyección PromQL

La función query_group_metric(target_ids, tenant_id, metric, hours, avg_metrics=None) interpolaba los parámetros en la query sin validar:

_VALID_METRIC_NAME = re.compile(r"^[a-zA-Z_:][a-zA-Z0-9_:]*$")

# Validaciones:
if not _VALID_METRIC_NAME.match(metric or ""):
    logger.warning("query_group_metric rejected metric=%r (invalid token)", metric)
    return {"data": []}
if not str(tenant_id).isdigit():
    logger.warning("query_group_metric rejected tenant_id=%r (not numeric)", tenant_id)
    return {"data": []}
if not all(str(tid).isdigit() for tid in target_ids):
    logger.warning("query_group_metric rejected non-numeric target_ids")
    return {"data": []}

Una métrica maliciosa (cpu"}} or snmp_bandwidth_in_mbps{tenant_id="99) podía romper la query y leer datos de otro tenant. Ahora se rechaza silenciosamente (retorna {"data": []}).

Firma pública

query_group_metric(target_ids: list[int], tenant_id: int, metric: str, hours: int, avg_metrics: list[str] | None = None) → dict

Consulta VictoriaMetrics para un grupo de targets.

Retorna: {"data": [...]} (lista de muestras) o {"data": []} si parámetros inválidos.

Testing

TestGroupMetricInjectionGuard.test_rejects_injection_metric() — verifica rechazo de payloads PromQL.

Véase también

Subir