From d2b707ea5e7f20221f95cb363f1bbcf5cc9ffc25 Mon Sep 17 00:00:00 2001 From: ferdzo Date: Mon, 3 Nov 2025 15:57:23 +0100 Subject: [PATCH] DB Writer fixes and compose.yml update --- infrastructure/compose.yml | 2 +- services/db_write/src/db_writer.py | 7 ++++--- services/db_write/src/models.py | 30 +++++++++++++++++++++++++++++ services/gpt_service/config.py | 13 +++++-------- services/gpt_service/gpt_service.py | 19 +----------------- services/gpt_service/main.py | 6 +++++- 6 files changed, 46 insertions(+), 31 deletions(-) create mode 100644 services/db_write/src/models.py diff --git a/infrastructure/compose.yml b/infrastructure/compose.yml index 7b9c76a..a93f4be 100644 --- a/infrastructure/compose.yml +++ b/infrastructure/compose.yml @@ -15,7 +15,7 @@ services: - "9001:9001" - "8883:8883" volumes: - - ./mosquitto/:/mosquitto/ + - ./mosquitto/:/mosquitto/:Z restart: unless-stopped timescaledb: diff --git a/services/db_write/src/db_writer.py b/services/db_write/src/db_writer.py index 4eddbee..fada906 100644 --- a/services/db_write/src/db_writer.py +++ b/services/db_write/src/db_writer.py @@ -6,6 +6,7 @@ from sqlalchemy.pool import QueuePool from src.config import config from src.schema import TelemetryReading +from src.models import Telemetry class DatabaseWriter: @@ -37,9 +38,9 @@ class DatabaseWriter: session = self.SessionLocal() try: - # Convert to database objects using the correct field mapping + # Convert dataclass readings to SQLAlchemy Telemetry objects db_objects = [ - TelemetryReading( + Telemetry( time=reading.time, device_id=reading.device_id, metric=reading.metric, @@ -57,7 +58,7 @@ class DatabaseWriter: return True except Exception as e: - self.logger.error(f"Failed to write batch: {e}") + self.logger.error(f"Failed to write batch: {e}", exc_info=True) session.rollback() return False finally: diff --git a/services/db_write/src/models.py b/services/db_write/src/models.py new file mode 100644 index 0000000..508d7f7 --- /dev/null +++ b/services/db_write/src/models.py @@ -0,0 +1,30 @@ +""" +SQLAlchemy models for db_write service. + +These models mirror the schema in db_migrations/models.py. +Keep them in sync when schema changes occur. +""" + +from sqlalchemy import Column, Float, Text, DateTime +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() + + +class Telemetry(Base): + """ + Time-series telemetry data from devices. + + This model is used by the db_write service to insert data. + """ + + __tablename__ = "telemetry" + + time = Column(DateTime(timezone=True), primary_key=True, nullable=False) + device_id = Column(Text, primary_key=True, nullable=False) + metric = Column(Text, primary_key=True, nullable=False) + value = Column(Float, nullable=False) + unit = Column(Text) + + def __repr__(self): + return f"" diff --git a/services/gpt_service/config.py b/services/gpt_service/config.py index 261312c..938f066 100644 --- a/services/gpt_service/config.py +++ b/services/gpt_service/config.py @@ -3,11 +3,8 @@ from dotenv import load_dotenv load_dotenv() -class Config: - """Configuration settings for the GPT Service.""" - - API_KEY = os.getenv("API_KEY") - PROVIDER_NAME = os.getenv("PROVIDER_NAME", "openai") - MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4") - HOST_URL = os.getenv("HOST_URL") - LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO") +API_KEY = os.getenv("API_KEY") +PROVIDER_NAME = os.getenv("PROVIDER_NAME", "openai") +MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4") +HOST_URL = os.getenv("HOST_URL") +LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO") \ No newline at end of file diff --git a/services/gpt_service/gpt_service.py b/services/gpt_service/gpt_service.py index 96a2019..ce891c4 100644 --- a/services/gpt_service/gpt_service.py +++ b/services/gpt_service/gpt_service.py @@ -22,21 +22,4 @@ class GPTService: self.logger.error(f"Unsupported provider: {self.provider_name}") raise ValueError(f"Unsupported provider: {self.provider_name}") - def analyze_metrics(self, metrics: dict) -> str: - """Analyze given metrics using GPT model and return insights.""" - prompt = f"Analyze the following metrics and provide insights:\n{metrics}" - try: - response = openai.Completion.create( - engine=self.model_name, - prompt=prompt, - max_tokens=150, - n=1, - stop=None, - temperature=0.7, - ) - insights = response.choices[0].text.strip() - self.logger.info("Successfully obtained insights from GPT model") - return insights - except Exception as e: - self.logger.error(f"Error during GPT analysis: {e}") - raise \ No newline at end of file + \ No newline at end of file diff --git a/services/gpt_service/main.py b/services/gpt_service/main.py index 99a4c28..fe65d76 100644 --- a/services/gpt_service/main.py +++ b/services/gpt_service/main.py @@ -1,6 +1,10 @@ +from gpt_service import GPTService + + def main(): + GPTService() print("Hello from gpt-service!") if __name__ == "__main__": - main() + main() \ No newline at end of file