add alembic and store metrics at db
This commit is contained in:
25
src/main.py
25
src/main.py
@@ -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
43
src/models.py
Normal 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)
|
||||
Reference in New Issue
Block a user