"""MCP Athena Analytics Server settings."""
import logging
from pathlib import Path
from lib.confutils import (
parse_bool,
parse_float,
parse_int,
parse_str,
)
# Environment
ENVIRONMENT: str = parse_str('ENVIRONMENT', 'local') or 'local'
DEV_MODE: bool = parse_bool('DEV_MODE', False)
# Base directory
BASE_DIR: Path = Path(__file__).parent.parent.resolve()
# Logging
LOG_LEVEL: str = parse_str('LOG_LEVEL', 'INFO') or 'INFO'
LOG_FORMATTER: str = parse_str('LOG_FORMATTER', 'json') or 'json'
# Sentry (optional)
SENTRY_ENABLED: bool = parse_bool('SENTRY_ENABLED', False)
SENTRY_DSN: str | None = parse_str('SENTRY_DSN')
SENTRY_SAMPLE_RATE: float = parse_float('SENTRY_SAMPLE_RATE', 0.1) or 0.1
SENTRY_WARNING_SAMPLE_RATE: float = parse_float('SENTRY_WARNING_SAMPLE_RATE', 0.01) or 0.01
SENTRY_LOG_HANDLE_LEVEL_STR: str = parse_str(
'SENTRY_LOG_HANDLE_LEVEL', str(logging.WARNING)
) or str(logging.WARNING)
SENTRY_ENVIRONMENT: str | None = parse_str('SENTRY_ENVIRONMENT')
SENTRY_ATTACH_STACKTRACE: bool = parse_bool('SENTRY_ATTACH_STACKTRACE', True)
SENTRY_USE_COMPRESS_FINGERPRINT: bool = parse_bool('SENTRY_USE_COMPRESS_FINGERPRINT', True)
if SENTRY_ENABLED:
SENTRY_IGNORED_LOG_MESSAGES: list[str] = []
if not SENTRY_DSN:
raise ValueError('SENTRY_DSN is required when SENTRY_ENABLED=True')
if not SENTRY_ENVIRONMENT:
raise ValueError('SENTRY_ENVIRONMENT is required when SENTRY_ENABLED=True')
if SENTRY_SAMPLE_RATE < 0 or SENTRY_SAMPLE_RATE > 1:
raise ValueError('SENTRY_SAMPLE_RATE must be between 0 and 1')
if SENTRY_WARNING_SAMPLE_RATE < 0 or SENTRY_WARNING_SAMPLE_RATE > 1:
raise ValueError('SENTRY_WARNING_SAMPLE_RATE must be between 0 and 1')
SENTRY_LOG_HANDLE_LEVEL: int
try:
SENTRY_LOG_HANDLE_LEVEL = logging._nameToLevel[SENTRY_LOG_HANDLE_LEVEL_STR.upper()]
except KeyError:
SENTRY_LOG_HANDLE_LEVEL = (
parse_int('SENTRY_LOG_HANDLE_LEVEL', logging.WARNING) or logging.WARNING
)
# AWS
AWS_ENABLED: bool = parse_bool('AWS_ENABLED', True)
# AWS Athena
AWS_ATHENA_DB_MAIN: str | None = parse_str('AWS_ATHENA_DB_MAIN')
_AWS_ATHENA_S3_TMP_RAW = parse_str('AWS_ATHENA_S3_TMP_LOCATION')
if not _AWS_ATHENA_S3_TMP_RAW:
raise ValueError('AWS_ATHENA_S3_TMP_LOCATION is required. Set environment variable.')
AWS_ATHENA_S3_TMP_LOCATION: str = _AWS_ATHENA_S3_TMP_RAW
AWS_ATHENA_WORKGROUP: str = (
parse_str('AWS_ATHENA_WORKGROUP', 'analytics-backend') or 'analytics-backend'
)
AWS_ATHENA_DEFAULT_QUERY_TIMEOUT_SEC: int = parse_int(
'AWS_ATHENA_DEFAULT_QUERY_TIMEOUT_SEC', 40 * 60
) or (40 * 60)
AWS_ATHENA_LONG_QUERY_SEC: int = parse_int('AWS_ATHENA_LONG_QUERY_SEC', 10 * 60) or (10 * 60)
AWS_ATHENA_DEFAULT_CACHE_TIMEOUT_MIN: int = parse_int(
'AWS_ATHENA_DEFAULT_CACHE_TIMEOUT_MIN', 24 * 60
) or (24 * 60)
# AWS Athena query templates
AWS_ATHENA_BRAND_NAME: str | None = parse_str('AWS_ATHENA_BRAND_NAME', 'alpha')
AWS_ATHENA_QUERY_TEMPLATES_DIR: str | None = parse_str('AWS_ATHENA_QUERY_TEMPLATES_DIR')
AWS_ATHENA_S3_DATA_SOURCE_LOCATION: str | None = parse_str('AWS_ATHENA_S3_DATA_SOURCE_LOCATION')
AWS_ATHENA_S3_UNLOAD_LOCATION: str | None = parse_str('AWS_ATHENA_S3_UNLOAD_LOCATION')
AWS_ATHENA_QUERY_TEMPLATES_STRIP_COMMENTS: bool = parse_bool(
'AWS_ATHENA_QUERY_TEMPLATES_STRIP_COMMENTS', True
)
# AWS Profiles
AWS_PROFILES_CONFIG_PATH: str | None = parse_str('AWS_PROFILES_CONFIG_PATH')
AWS_CREDENTIAL_REFRESH_BUFFER_SEC: int = parse_int('AWS_CREDENTIAL_REFRESH_BUFFER_SEC', 300) or 300