Source code for harp_apps.sqlalchemy_storage.models.metrics
from datetime import UTC, datetime
from sqlalchemy import TIMESTAMP, ForeignKey, Integer, String, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from .base import Base, Repository, with_session
[docs]
class Metric(Base):
    __tablename__ = "metrics"
    id = mapped_column(Integer(), primary_key=True, unique=True, autoincrement=True)
    name = mapped_column(String(255), unique=True, nullable=False) 
[docs]
class MetricValue(Base):
    __tablename__ = "metric_values"
    metric_id = mapped_column(ForeignKey("metrics.id"), nullable=False, primary_key=True)
    metric: Mapped["Metric"] = relationship()
    created_at = mapped_column(TIMESTAMP(timezone=True), server_default=func.now(), primary_key=True)
    value = mapped_column(Integer()) 
[docs]
class MetricValuesRepository(Repository[MetricValue]):
    Type = MetricValue 
[docs]
class MetricsRepository(Repository[Metric]):
    Type = Metric
[docs]
    def __init__(self, session_factory, /):
        super().__init__(session_factory)
        self.values = MetricValuesRepository(session_factory) 
[docs]
    @with_session
    async def insert_values(self, values: dict, /, session):
        now = datetime.now(UTC)
        for name, value in values.items():
            metric = await self.find_or_create_one({"name": name}, session=session)
            await self.values.create({"metric_id": metric.id, "value": value, "created_at": now}, session=session)