Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion tetra/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Import all the packahges here
from .logger import setup_logging
setup_logging()

from . import remote_execution_pb2, remote_execution_pb2_grpc
from .core.resources.resource_manager import ResourceManager
Expand Down
5 changes: 4 additions & 1 deletion tetra/core/resources/resource_manager.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from tetra.logger import get_logger
log = get_logger()

import json
from typing import Any, Dict
from pathlib import Path
Expand Down Expand Up @@ -36,7 +39,7 @@ async def get_or_create_resource(self, config: DeployableResource) -> str:

# Check if resource already exists
if resource_id in self._resources:
print(f"Resource {resource_id} already exists, reusing.")
log.debug(f"Resource {resource_id} already exists, reusing.")
return self._resources[resource_id]["server_name"]

# Deploy new resource based on type
Expand Down
9 changes: 6 additions & 3 deletions tetra/core/resources/serverless.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from tetra.logger import get_logger
log = get_logger()

from typing import Dict, List, Optional
from enum import Enum
from urllib.parse import urljoin
Expand Down Expand Up @@ -82,7 +85,7 @@ async def deploy(self) -> "ServerlessResource":
try:
# If the resource is already deployed, return it
if self.id:
print(f"Endpoint exists: {self.url}")
log.debug(f"Endpoint exists: {self.url}")
return self

result = runpod.create_endpoint(
Expand All @@ -100,9 +103,9 @@ async def deploy(self) -> "ServerlessResource":
)

if endpoint := ServerlessResource(**result):
print(f"Endpoint deployed: {endpoint.url}")
log.debug(f"Endpoint deployed: {endpoint.url}")
return endpoint

except Exception as e:
print(f"Endpoint failed to deploy: {e}")
log.error(f"Endpoint failed to deploy: {e}")
raise
21 changes: 0 additions & 21 deletions tetra/core/utils/logger.py

This file was deleted.

38 changes: 38 additions & 0 deletions tetra/logger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import inspect
import logging
import os
import sys


def setup_logging(level: int = logging.INFO, stream=sys.stdout, fmt: str = None):
"""
Sets up the root logger with a stream handler and basic formatting.
Does nothing if handlers are already configured.
"""
if fmt is None:
fmt = "%(asctime)s | %(name)s | %(levelname)s | %(message)s"

root_logger = logging.getLogger()
if not root_logger.hasHandlers():
handler = logging.StreamHandler(stream)
handler.setFormatter(logging.Formatter(fmt))
root_logger.setLevel(level)
root_logger.addHandler(handler)

# Optionally allow log level override via env var
env_level = os.environ.get("LOG_LEVEL")
if env_level:
root_logger.setLevel(env_level.upper())


def get_logger(name: str = None) -> logging.Logger:
"""
Returns a logger. If no name is provided, it infers the caller's module name.
"""
if name is None:
# Get the caller's module name.
frame = inspect.stack()[1]
module = inspect.getmodule(frame[0])
name = module.__name__ if module else "__main__"

return logging.getLogger(name)