Add license metadata to health/readiness endpoint. (#15997)

* health: expose license metadata (available & expiration) in /health/readiness endpoint

* test: add health readiness license metadata coverage

* test: ensure /health/readiness response includes license metadata

* chore: remove standalone license metadata test as requested; existing test covers codepath

---------

Co-authored-by: Plan42.ai <robot@plan42.ai>
This commit is contained in:
Andrew Bernat
2025-10-28 19:21:54 -07:00
committed by GitHub
parent a5b725917c
commit d89990e0c5
2 changed files with 28 additions and 0 deletions

View File

@@ -831,6 +831,28 @@ async def health_readiness():
index_info = "index does not exist - error: " + str(e)
cache_type = {"type": cache_type, "index_info": index_info}
# build license metadata
try:
from litellm.proxy.proxy_server import _license_check # type: ignore
license_available: bool = _license_check.is_premium() if _license_check else False
license_expiration: Optional[str] = None
if getattr(_license_check, "airgapped_license_data", None):
license_expiration = _license_check.airgapped_license_data.get( # type: ignore[arg-type]
"expiration_date"
)
license_metadata = {
"license": {
"has_license": license_available,
"expiration_date": license_expiration,
}
}
except Exception:
# fail closed: don't let license check break readiness
license_metadata = {"license": {"has_license": False, "expiration_date": None}}
# check DB
if prisma_client is not None: # if db passed in, check if it's connected
db_health_status = await _db_health_readiness_check()
@@ -841,6 +863,7 @@ async def health_readiness():
"litellm_version": version,
"success_callbacks": success_callback_names,
"use_aiohttp_transport": AsyncHTTPHandler._should_use_aiohttp_transport(),
**license_metadata,
**db_health_status,
}
else:
@@ -851,6 +874,7 @@ async def health_readiness():
"litellm_version": version,
"success_callbacks": success_callback_names,
"use_aiohttp_transport": AsyncHTTPHandler._should_use_aiohttp_transport(),
**license_metadata,
}
except Exception as e:
raise HTTPException(status_code=503, detail=f"Service Unhealthy ({str(e)})")

View File

@@ -25,6 +25,10 @@ async def test_health_and_chat_completion():
readiness_response = await response.json()
assert readiness_response["status"] == "connected"
# New assertion: license metadata is present
assert "license" in readiness_response
assert "has_license" in readiness_response["license"]
# Test liveness endpoint
async with session.get("http://0.0.0.0:4000/health/liveness") as response:
assert response.status == 200