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)