From 42f9e3005859934ac14d98ebaa52dc342d810709 Mon Sep 17 00:00:00 2001 From: JLCode-tech Date: Sun, 3 May 2026 09:52:31 +0530 Subject: [PATCH] fix(app/bedrock-smartllm-backend): start prometheus_client server on 9100 so ServiceMonitor scrape works MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shim previously mounted /metrics only on the FastAPI app at CHAT_PORT (8080). The accompanying Service exposes port 9100 named "metrics" and the ServiceMonitor scrapes :metrics, but nothing was listening on 9100 → Prometheus reported up=0 for all 3 backends despite the pods being healthy. Adding prometheus_client.start_http_server(METRICS_PORT) before uvicorn.run binds 9100 with the same metric registry. ServiceMonitor scrape now succeeds without needing any cluster-side port redirect. Keeps the FastAPI /metrics route too — harmless duplicate that lets ad-hoc curl on either port keep working. --- .../manifests/01-shim-source.yaml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/bedrock-smartllm-backend/manifests/01-shim-source.yaml b/app/bedrock-smartllm-backend/manifests/01-shim-source.yaml index 73d0d15..c6e2a60 100644 --- a/app/bedrock-smartllm-backend/manifests/01-shim-source.yaml +++ b/app/bedrock-smartllm-backend/manifests/01-shim-source.yaml @@ -25,7 +25,7 @@ data: import boto3 from fastapi import FastAPI, HTTPException - from prometheus_client import CONTENT_TYPE_LATEST, Gauge, Histogram, generate_latest + from prometheus_client import CONTENT_TYPE_LATEST, Gauge, Histogram, generate_latest, start_http_server from pydantic import BaseModel from starlette.responses import Response @@ -33,6 +33,7 @@ data: MODEL_NAME = os.environ.get("MODEL_NAME", MODEL_ID.replace("/", "-")) AWS_REGION = os.environ.get("AWS_REGION", "ap-southeast-2") CHAT_PORT = int(os.environ.get("CHAT_PORT", "8080")) + METRICS_PORT = int(os.environ.get("METRICS_PORT", "9100")) logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") log = logging.getLogger("bedrock-shim") @@ -136,5 +137,14 @@ data: if __name__ == "__main__": import uvicorn + # Start a dedicated prometheus_client server on METRICS_PORT so the + # ServiceMonitor (which scrapes :metrics named-port → 9100) actually + # finds an open socket. Previously /metrics was only mounted on the + # FastAPI app at CHAT_PORT (8080), so port 9100 was unbound and the + # ServiceMonitor scrape silently failed (`up=0`). Keeping the FastAPI + # /metrics endpoint too — harmless duplicate, lets ad-hoc curl from + # either port still work. + start_http_server(METRICS_PORT) + log.info("metrics server listening on :%d", METRICS_PORT) log.info("starting bedrock-shim model=%s region=%s", MODEL_NAME, AWS_REGION) uvicorn.run(app, host="0.0.0.0", port=CHAT_PORT, log_level="info")