"""Configuration management for otel-mcp server."""
import os
from typing import Literal, Optional
from pydantic import BaseModel, Field
from pydantic_settings import BaseSettings
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
class BackendAuth(BaseModel):
"""Authentication configuration for backends."""
type: Literal["none", "basic", "bearer"] = "none"
username: Optional[str] = None
password: Optional[str] = None
bearer_token: Optional[str] = None
class PrometheusConfig(BaseModel):
"""Prometheus backend configuration."""
url: str = Field(default="http://localhost:9090")
auth: BackendAuth = Field(default_factory=lambda: BackendAuth(type="none"))
timeout: int = Field(default=30)
class LokiConfig(BaseModel):
"""Loki backend configuration."""
url: str = Field(default="http://localhost:3100")
auth: BackendAuth = Field(default_factory=lambda: BackendAuth(type="none"))
tenant_id: str = Field(default="system")
timeout: int = Field(default=30)
class Config(BaseSettings):
"""Main configuration for otel-mcp server."""
# Server settings
server_name: str = Field(default="otel-mcp")
log_level: str = Field(default="INFO")
max_query_results: int = Field(default=10000)
default_time_range: str = Field(default="1h")
# Prometheus settings
prometheus_url: str = Field(default="http://localhost:9090")
prometheus_auth_type: Literal["none", "basic", "bearer"] = Field(default="none")
prometheus_username: Optional[str] = None
prometheus_password: Optional[str] = None
prometheus_bearer_token: Optional[str] = None
# Loki settings
loki_url: str = Field(default="http://localhost:3100")
loki_auth_type: Literal["none", "basic", "bearer"] = Field(default="none")
loki_username: Optional[str] = None
loki_password: Optional[str] = None
loki_bearer_token: Optional[str] = None
loki_tenant_id: str = Field(default="system")
# General settings
query_timeout: int = Field(default=30)
model_config = {
"env_file": ".env",
"case_sensitive": False,
"extra": "ignore"
}
@property
def prometheus(self) -> PrometheusConfig:
"""Get Prometheus configuration."""
return PrometheusConfig(
url=self.prometheus_url,
auth=BackendAuth(
type=self.prometheus_auth_type,
username=self.prometheus_username,
password=self.prometheus_password,
bearer_token=self.prometheus_bearer_token,
),
timeout=self.query_timeout,
)
@property
def loki(self) -> LokiConfig:
"""Get Loki configuration."""
return LokiConfig(
url=self.loki_url,
auth=BackendAuth(
type=self.loki_auth_type,
username=self.loki_username,
password=self.loki_password,
bearer_token=self.loki_bearer_token,
),
tenant_id=self.loki_tenant_id,
timeout=self.query_timeout,
)
# Global config instance
config = Config()