Blog AI/ML Azure Cloud

Per-user states en presupuestos multiusuario: control de consumo desde la REST API

Panel técnico con varios usuarios, barras de presupuesto y una API REST centralizada para supervisar consumo individual

GitHub ha anunciado una mejora relevante para la gestión de presupuestos multiusuario en GitHub Enterprise Cloud: la posibilidad de recuperar el progreso de cada usuario frente a un presupuesto multiusuario desde un único endpoint de la REST API.

La novedad, descrita en el changelog oficial de GitHub, permite a propietarios de empresa y responsables de billing consultar de forma paginada el estado de los usuarios asociados a un presupuesto multiusuario. También permite filtrar por porcentaje de uso, consultar un usuario concreto, ordenar resultados por consumo y ver cuándo un usuario tiene un override individual que modifica el límite aplicado.

El cambio puede parecer pequeño, pero tiene impacto operativo. Hasta ahora, según GitHub, revisar el consumo por usuario requería realizar una llamada por cada usuario y no era posible filtrar directamente por el porcentaje consumido. En organizaciones grandes, ese modelo hacía más lenta la supervisión y empujaba a los equipos a crear scripts propios para identificar quién estaba cerca de su límite.

Nota técnica: el changelog público consultado confirma la capacidad y sus casos principales, pero no incluye el path exacto del endpoint ni el esquema completo de respuesta. Por ese motivo, este artículo evita inventar rutas, parámetros o nombres de campos. Los ejemplos se presentan como modelos conceptuales de integración y deben adaptarse a la documentación oficial de la REST API de GitHub.

Qué aporta un estado por usuario en un presupuesto multiusuario

Un presupuesto multiusuario permite gestionar consumo para varios usuarios bajo una política común. GitHub indica que esta mejora aplica a dos tipos de presupuesto multiusuario:

  • Un presupuesto universal que aplica a todos los usuarios de una empresa.
  • Un presupuesto por usuario acotado a un centro de coste.

El “estado por usuario” añade una vista individual dentro de ese presupuesto. En lugar de observar únicamente una cifra agregada, el equipo de plataforma puede revisar cuánto ha consumido cada usuario, cuál es el límite que le aplica y qué porcentaje de ese límite se ha utilizado.

Ese nivel de granularidad es importante porque las decisiones operativas rara vez se toman solo con agregados. Saber que un presupuesto está creciendo más de lo esperado ayuda, pero saber qué usuarios están cerca del límite permite actuar con más precisión: enviar avisos, revisar configuraciones, detectar usos anómalos o ajustar políticas internas.

La mejora también reduce fricción entre tres áreas que suelen trabajar separadas:

  • FinOps y control de gasto, que necesitan visibilidad sobre consumo y límites.
  • Plataforma e ingeniería, que necesitan automatizar alertas y respuestas.
  • Gobierno e identidad, que necesitan entender qué usuarios o identidades están originando consumo.

Por qué importa consultar todos los usuarios desde un único endpoint

La principal mejora no es solo disponer de más datos, sino poder obtenerlos de forma más eficiente.

Cuando una integración necesita hacer una llamada por usuario para revisar cien, mil o decenas de miles de identidades, aparecen varios problemas:

  • Mayor latencia total.
  • Más complejidad de orquestación.
  • Más posibilidades de errores parciales.
  • Mayor exposición a límites de uso de la API.
  • Dificultad para obtener una vista consistente del estado del presupuesto.

Con un endpoint que permite recorrer todos los usuarios asociados al presupuesto, el proceso se simplifica. La integración puede paginar resultados, aplicar filtros y centrarse en los usuarios que requieren atención.

Según el anuncio de GitHub, el endpoint permite:

  • Obtener cuánto ha consumido cada usuario y cuál es su límite asignado.
  • Recorrer resultados por páginas.
  • Filtrar por porcentaje de presupuesto consumido.
  • Filtrar por un usuario concreto.
  • Ordenar los resultados por consumo.
  • Identificar si existe un override individual de presupuesto para un usuario.

Para equipos de plataforma, esto habilita tres escenarios inmediatos: detección temprana, reporting y automatización.

Detección temprana de usuarios cercanos al límite

El caso más directo es detectar usuarios que están cerca de agotar su presupuesto.

Por ejemplo, una organización podría definir una política interna como esta:

  • Aviso informativo al superar el 80 %.
  • Aviso al responsable técnico al superar el 90 %.
  • Revisión manual o workflow de aprobación al alcanzar el 100 %.

La ventaja de la nueva capacidad es que esa evaluación puede hacerse sobre todos los usuarios del presupuesto sin ejecutar una llamada por identidad. Además, si la API permite filtrar por porcentaje consumido, una integración puede pedir directamente los usuarios que están por encima de un umbral determinado, en lugar de descargar todo el conjunto y filtrar después en cliente.

Es importante que estas alertas se diseñen como mecanismos de acompañamiento, no como castigos automáticos. Un usuario cerca del límite puede estar ejecutando pruebas legítimas, preparando una demo, validando una integración o absorbiendo una carga puntual. La alerta debe aportar contexto antes de activar medidas restrictivas.

Reporting para FinOps y responsables técnicos

Los presupuestos multiusuario también son útiles para construir cuadros de mando internos. Una vista agregada puede indicar si el presupuesto global evoluciona bien, pero la vista por usuario permite responder preguntas más accionables:

  • ¿Qué usuarios concentran más consumo?
  • ¿Qué centros de coste están usando más presupuesto?
  • ¿Hay usuarios con overrides individuales?
  • ¿Existen diferencias relevantes entre equipos?
  • ¿El consumo crece de forma gradual o aparece en picos?

Este tipo de reporting debe tratarse con cuidado. El objetivo no debería ser vigilar individualmente a las personas, sino entender patrones de uso y mejorar la asignación de recursos. En entornos de desarrollo, investigación o automatización, no todos los perfiles consumen igual ni deberían hacerlo.

Un responsable de plataforma puede necesitar más margen que un usuario ocasional. Un equipo que está validando una funcionalidad crítica puede tener consumo temporalmente superior. La granularidad por usuario sirve para explicar y gobernar, no para comparar de forma simplista.

Automatización: de la visibilidad a la acción

Una vez que el estado por usuario está disponible vía API, puede integrarse en procesos automáticos. Un patrón habitual sería:

  1. Un job programado consulta la REST API.
  2. La respuesta se pagina y se normaliza.
  3. Se calculan umbrales o se aplican filtros.
  4. Se publican métricas, logs o eventos.
  5. Se activan notificaciones o workflows internos.

El job podría ejecutarse desde una plataforma de automatización interna, un sistema de observabilidad, una función serverless o un pipeline operativo. La elección concreta dependerá de la arquitectura de cada organización.

Lo importante es separar responsabilidades:

  • La llamada a la API obtiene datos.
  • La normalización adapta esos datos al modelo interno.
  • La lógica de umbrales decide si hay riesgo.
  • La capa de acciones notifica, registra o escala.

Esa separación evita que toda la organización dependa directamente del contrato externo de la API. Si GitHub cambia detalles de formato, solo debería modificarse el componente de ingesta o normalización.

Modelo conceptual de datos

El siguiente ejemplo no representa el contrato oficial de GitHub. Es una estructura conceptual para explicar cómo una organización podría normalizar internamente la información de estados por usuario.

{
  "budget_id": "budget-identifier",
  "users": [
    {
      "user_login": "ana",
      "used": 750,
      "limit": 1000,
      "percentage": 75,
      "has_override": false
    },
    {
      "user_login": "luis",
      "used": 930,
      "limit": 1000,
      "percentage": 93,
      "has_override": true
    }
  ]
}

La estructura separa cuatro conceptos:

  • Identidad: qué usuario está asociado al consumo.
  • Uso: cuánto ha consumido.
  • Límite: cuál es la asignación aplicable.
  • Estado derivado: porcentaje, override u otras señales útiles.

En una implementación real, los nombres de campos, unidades, tipos y semántica deben tomarse exclusivamente de la documentación oficial de GitHub.

Ejemplo de procesamiento sobre datos normalizados

El siguiente fragmento muestra una lógica de umbral sobre datos ya normalizados. No realiza ninguna llamada HTTP ni asume rutas de API.

from dataclasses import dataclass
from typing import Any


@dataclass
class BudgetUserState:
    user_login: str
    used: float
    limit: float
    percentage: float
    has_override: bool


def parse_user_states(payload: dict[str, Any]) -> list[BudgetUserState]:
    parsed_users: list[BudgetUserState] = []

    for item in payload.get("users", []):
        used = float(item["used"])
        limit = float(item["limit"])

        percentage = 0.0 if limit <= 0 else round((used / limit) * 100, 2)

        parsed_users.append(
            BudgetUserState(
                user_login=str(item["user_login"]),
                used=used,
                limit=limit,
                percentage=percentage,
                has_override=bool(item.get("has_override", False)),
            )
        )

    return parsed_users


def users_above_threshold(
    user_states: list[BudgetUserState],
    threshold_percentage: float
) -> list[BudgetUserState]:
    return [
        user_state
        for user_state in user_states
        if user_state.percentage >= threshold_percentage
    ]


example_payload = {
    "users": [
        {
            "user_login": "ana",
            "used": 750,
            "limit": 1000,
            "has_override": False
        },
        {
            "user_login": "luis",
            "used": 930,
            "limit": 1000,
            "has_override": True
        }
    ]
}

states = parse_user_states(example_payload)
users_at_risk = users_above_threshold(states, threshold_percentage=90)

for user in users_at_risk:
    print(
        f"{user.user_login} está al {user.percentage}% "
        f"del presupuesto asignado ({user.used}/{user.limit})."
    )

La idea principal es que el cálculo de umbrales no dependa de la llamada HTTP. En producción, esto facilita pruebas, reduce acoplamiento y permite reutilizar la lógica para distintos destinos: notificaciones, métricas, dashboards o tickets.

Diseño de umbrales: no todo es 80/90/100

Los umbrales fijos son fáciles de entender, pero no siempre reflejan bien el riesgo.

Un usuario al 85 % al final del ciclo puede no ser preocupante. En cambio, un usuario al 50 % durante los primeros días puede indicar un ritmo de consumo que agotará el presupuesto antes de tiempo.

Por eso, además del porcentaje actual, conviene calcular tendencia. Una métrica sencilla es la proyección de días hasta agotar el límite, basada en dos muestras temporales.

from datetime import datetime, timezone


def projected_days_to_limit(
    previous_used: float,
    current_used: float,
    previous_timestamp: datetime,
    current_timestamp: datetime,
    limit: float
) -> float | None:
    elapsed_seconds = (current_timestamp - previous_timestamp).total_seconds()

    if elapsed_seconds <= 0:
        return None

    consumed_delta = current_used - previous_used

    if consumed_delta <= 0:
        return None

    remaining = limit - current_used

    if remaining <= 0:
        return 0.0

    consumption_per_day = consumed_delta / (elapsed_seconds / 86_400)

    if consumption_per_day <= 0:
        return None

    return round(remaining / consumption_per_day, 2)


previous_time = datetime(2026, 7, 14, 8, 0, tzinfo=timezone.utc)
current_time = datetime(2026, 7, 14, 20, 0, tzinfo=timezone.utc)

days = projected_days_to_limit(
    previous_used=400,
    current_used=550,
    previous_timestamp=previous_time,
    current_timestamp=current_time,
    limit=1000
)

print(f"Días estimados hasta agotar el presupuesto: {days}")

Esta aproximación convierte estados puntuales en una señal de tendencia. No sustituye a un análisis completo, pero ayuda a priorizar. Un usuario que aún no ha superado el 80 %, pero agotará su presupuesto en pocos días si mantiene el ritmo, puede requerir atención antes que otro que ya está al 90 % pero cerca del final del ciclo.

Relación con identidad y gobierno

Los estados por usuario conectan directamente con identidad y acceso. Un presupuesto no es solo un objeto financiero; también refleja qué identidades pueden consumir recursos y bajo qué límites.

Por eso, conviene analizar esta información junto con otros datos internos:

  • Pertenencia a equipos o centros de coste.
  • Roles y permisos.
  • Antigüedad de accesos.
  • Cambios recientes de configuración.
  • Eventos de auditoría relevantes.
  • Overrides individuales de presupuesto.

Si una identidad conserva permisos que ya no necesita, puede seguir generando consumo. Si una cuenta se ve comprometida, un incremento anómalo de uso puede ser una señal adicional, aunque no sustituya a los controles de seguridad específicos.

La clave está en no interpretar el presupuesto de forma aislada. Un pico de consumo puede ser legítimo, pero también puede indicar una automatización mal configurada, un workflow que reintenta sin control o una credencial utilizada de forma inesperada.

Buenas prácticas de implementación

Para adoptar esta capacidad de forma robusta, conviene aplicar varias prácticas.

Centralizar la ingesta

Evita que cada dashboard o script consulte la API por separado. Es preferible tener un componente centralizado que obtenga los estados por usuario, los normalice y los publique internamente.

Esto reduce llamadas duplicadas, simplifica la gestión de credenciales y permite controlar mejor los cambios de contrato.

Conservar histórico

El valor actual sirve para alertar, pero el histórico sirve para explicar. Sin histórico es difícil saber si un usuario llegó al límite por una tendencia gradual, por un pico puntual o por un cambio reciente.

Guardar muestras periódicas permite construir tendencias, detectar anomalías y justificar decisiones.

Separar avisos de acciones restrictivas

Enviar una notificación es una acción de bajo riesgo. Bloquear un usuario, reducir una cuota o detener una integración puede afectar a entregas críticas.

Si se automatizan medidas restrictivas, deberían estar respaldadas por una política explícita, aprobada y comunicada.

Respetar permisos y confidencialidad

Los datos de consumo pueden revelar actividad interna, prioridades de proyecto o patrones individuales de trabajo. No deberían exponerse de forma indiscriminada.

El acceso a dashboards o informes debe limitarse a quienes necesitan operar, auditar o gestionar el presupuesto.

Documentar excepciones

Los overrides individuales son especialmente importantes. Si un usuario tiene un límite diferente, conviene documentar por qué existe, quién lo aprobó y durante cuánto tiempo aplica.

Sin esa trazabilidad, los presupuestos pueden perder valor como herramienta de gobierno.

Errores habituales

Un primer error es tratar el presupuesto como sustituto de observabilidad técnica. Si una integración consume demasiado, el presupuesto detectará el síntoma, pero no necesariamente explicará la causa. Hay que combinarlo con logs, métricas, trazas y auditoría.

Otro error es asumir que todos los usuarios deberían consumir lo mismo. En equipos reales hay perfiles distintos: plataforma, desarrollo, QA, investigación, soporte o usuarios ocasionales. La comparación debe hacerse con contexto.

También es problemático reaccionar demasiado tarde. Si la API permite identificar usuarios cercanos al límite de forma eficiente, revisar el consumo solo al cierre del ciclo desaprovecha la capacidad. Una ejecución periódica puede ser suficiente para muchos escenarios, siempre respetando las recomendaciones oficiales de uso de la API.

Por último, conviene evitar alertas opacas. Cuando los usuarios entienden su consumo y reciben recomendaciones útiles, pueden ajustar comportamiento sin intervención central. La transparencia convierte el presupuesto en una herramienta de autonomía, no en una barrera inesperada.

Una mejora pequeña con impacto de plataforma

La posibilidad de recuperar el progreso de cada usuario frente a un presupuesto multiusuario desde un único endpoint REST mejora la operativa de GitHub Enterprise Cloud en organizaciones grandes.

El valor está en pasar de una revisión manual o basada en llamadas por usuario a un modelo más directo: paginar estados, filtrar por porcentaje, ordenar por consumo y detectar overrides individuales.

Para equipos de plataforma, FinOps y gobierno, la recomendación práctica es empezar de forma simple:

  1. Validar la documentación oficial del endpoint y sus permisos.
  2. Implementar una ingesta centralizada.
  3. Normalizar la respuesta en un modelo interno.
  4. Crear alertas por umbral.
  5. Conservar histórico para análisis de tendencia.
  6. Revisar políticas de overrides y excepciones.

El objetivo no es controlar por controlar. Es dar a los equipos visibilidad suficiente para operar con autonomía, detectar desviaciones a tiempo y mantener el consumo bajo gobierno técnico y financiero.