add alembic and store metrics at db

This commit is contained in:
2026-02-10 16:19:56 +04:00
parent f2a9520410
commit 3ff4b61492
17 changed files with 532 additions and 34 deletions

View File

@@ -1,17 +1,24 @@
import socket
from typing import Callable
from fastapi import FastAPI
from prometheus_client import Counter
from prometheus_client import Gauge
from prometheus_fastapi_instrumentator import Instrumentator
from prometheus_fastapi_instrumentator.metrics import Info
from sqlalchemy.orm.session import Session
REQUEST_COUNT = Counter(
import models
REQUEST_COUNT = Gauge(
"label_counter", "How many times called with specific label", labelnames=("label",)
)
def http_requested_languages_total() -> Callable[[Info], None]:
def instrumentation(info: Info) -> None: ...
def instrumentation(info: Info) -> None:
with Session(models.engine) as session:
for label_info in models.LabelUsageRecord.get_all_stats(session=session):
REQUEST_COUNT.labels(label_info.label).set(label_info.used_count)
return instrumentation
@@ -23,5 +30,13 @@ Instrumentator().add(http_requested_languages_total()).instrument(app).expose(ap
@app.get("/")
async def read_root(label=None):
if label:
REQUEST_COUNT.labels(label).inc()
return {"Hello": "World"}
with Session(models.engine) as session:
models.LabelUsageRecord.update_label_usage_record(label, session=session)
session.commit()
return {"Hello": "World", "from": socket.gethostname()}
@app.get("/test")
async def read_label(label):
with Session(models.engine) as session:
return models.LabelUsageRecord.get_label_usage_record(label, session=session)

43
src/models.py Normal file
View File

@@ -0,0 +1,43 @@
import os
import time
from typing import List
from sqlalchemy import Boolean, Column, Integer, String, create_engine, select
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm.session import Session
engine = create_engine(os.getenv("DATABASE_URL"), echo=True)
class BaseModel(DeclarativeBase):
pass
class LabelUsageRecord(BaseModel):
__tablename__ = "label_usage_stats"
label = Column(String, primary_key=True)
last_used = Column(Integer, nullable=False)
used_count = Column(Integer)
@staticmethod
def get_label_usage_record(label, session: Session):
stmt = select(LabelUsageRecord).where(LabelUsageRecord.label == label)
result = session.scalar(stmt)
if not result:
result = LabelUsageRecord(label=label, last_used=0, used_count=0)
return result
@staticmethod
def update_label_usage_record(label: str, session: Session):
usage = LabelUsageRecord.get_label_usage_record(label, session=session)
usage.used_count += 1
usage.last_used = int(time.time())
session.add(usage)
@staticmethod
def get_all_stats(session: Session) -> List[LabelUsageRecord]:
stmt = select(LabelUsageRecord)
return session.scalars(stmt)