Skip to content

Commit f75282f

Browse files
committed
refactor(integrations): use env constants in remaining from_env loaders
Point Postgres, MySQL, Better Stack, SigNoz, and Sentry env reads at the shared config.constants names so catalog discovery and runtime loaders cannot drift.
1 parent 6014b26 commit f75282f

7 files changed

Lines changed: 46 additions & 19 deletions

File tree

config/constants/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@
304304
SENTRY_MAX_BREADCRUMBS,
305305
SENTRY_ORGANIZATION_SLUG_ENV,
306306
SENTRY_PROJECT_SLUG_ENV,
307+
SENTRY_STATS_PERIOD_ENV,
307308
SENTRY_TRACES_SAMPLE_RATE,
308309
)
309310
from config.constants.sentry_mcp import (
@@ -613,6 +614,7 @@
613614
"SENTRY_MCP_URL_ENV",
614615
"SENTRY_ORGANIZATION_SLUG_ENV",
615616
"SENTRY_PROJECT_SLUG_ENV",
617+
"SENTRY_STATS_PERIOD_ENV",
616618
"SENTRY_TRACES_SAMPLE_RATE",
617619
"SERVICENOW_INSTANCE_URL_ENV",
618620
"SERVICENOW_PASSWORD_ENV",

config/constants/sentry.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@
2626
SENTRY_ORGANIZATION_SLUG_ENV: Final[str] = "SENTRY_ORG_SLUG"
2727
SENTRY_AUTH_TOKEN_ENV: Final[str] = "SENTRY_AUTH_TOKEN"
2828
SENTRY_PROJECT_SLUG_ENV: Final[str] = "SENTRY_PROJECT_SLUG"
29+
SENTRY_STATS_PERIOD_ENV: Final[str] = "SENTRY_STATS_PERIOD"
2930
DEFAULT_SENTRY_BASE_URL: Final[str] = "https://sentry.io"

integrations/betterstack/__init__.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
import httpx
2929
from pydantic import Field, field_validator
3030

31+
from config.constants.betterstack import (
32+
BETTERSTACK_PASSWORD_ENV,
33+
BETTERSTACK_QUERY_ENDPOINT_ENV,
34+
BETTERSTACK_SOURCES_ENV,
35+
BETTERSTACK_USERNAME_ENV,
36+
)
3137
from config.strict_config import StrictConfigModel
3238
from core.tool_framework.utils.tool_availability import tool_unavailable
3339
from integrations._validation_helpers import report_classify_failure, report_validation_failure
@@ -104,16 +110,16 @@ def betterstack_config_from_env() -> BetterStackConfig | None:
104110
surfaced to the planner via :func:`betterstack_extract_params`; it is
105111
not required for availability.
106112
"""
107-
endpoint = os.getenv("BETTERSTACK_QUERY_ENDPOINT", "").strip()
108-
username = os.getenv("BETTERSTACK_USERNAME", "").strip()
113+
endpoint = os.getenv(BETTERSTACK_QUERY_ENDPOINT_ENV, "").strip()
114+
username = os.getenv(BETTERSTACK_USERNAME_ENV, "").strip()
109115
if not endpoint or not username:
110116
return None
111117
return build_betterstack_config(
112118
{
113119
"query_endpoint": endpoint,
114120
"username": username,
115-
"password": os.getenv("BETTERSTACK_PASSWORD", ""),
116-
"sources": os.getenv("BETTERSTACK_SOURCES", ""),
121+
"password": os.getenv(BETTERSTACK_PASSWORD_ENV, ""),
122+
"sources": os.getenv(BETTERSTACK_SOURCES_ENV, ""),
117123
}
118124
)
119125

integrations/mysql/__init__.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414

1515
from pydantic import Field, field_validator
1616

17+
from config.constants.mysql import (
18+
MYSQL_DATABASE_ENV,
19+
MYSQL_HOST_ENV,
20+
MYSQL_PASSWORD_ENV,
21+
MYSQL_PORT_ENV,
22+
MYSQL_SSL_MODE_ENV,
23+
MYSQL_USERNAME_ENV,
24+
)
1725
from integrations._relational import (
1826
RelationalConfigBase,
1927
env_int,
@@ -80,18 +88,18 @@ def build_mysql_config(raw: dict[str, Any] | None) -> MySQLConfig:
8088

8189
def mysql_config_from_env() -> MySQLConfig | None:
8290
"""Load a MySQL config from environment variables."""
83-
host = env_str("MYSQL_HOST")
84-
database = env_str("MYSQL_DATABASE")
91+
host = env_str(MYSQL_HOST_ENV)
92+
database = env_str(MYSQL_DATABASE_ENV)
8593
if not host or not database:
8694
return None
8795
return build_mysql_config(
8896
{
8997
"host": host,
90-
"port": env_int("MYSQL_PORT", DEFAULT_MYSQL_PORT),
98+
"port": env_int(MYSQL_PORT_ENV, DEFAULT_MYSQL_PORT),
9199
"database": database,
92-
"username": env_str("MYSQL_USERNAME", DEFAULT_MYSQL_USER),
93-
"password": os.getenv("MYSQL_PASSWORD", ""),
94-
"ssl_mode": env_str("MYSQL_SSL_MODE", DEFAULT_MYSQL_SSL_MODE),
100+
"username": env_str(MYSQL_USERNAME_ENV, DEFAULT_MYSQL_USER),
101+
"password": os.getenv(MYSQL_PASSWORD_ENV, ""),
102+
"ssl_mode": env_str(MYSQL_SSL_MODE_ENV, DEFAULT_MYSQL_SSL_MODE),
95103
}
96104
)
97105

integrations/postgresql/__init__.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414

1515
from pydantic import Field, field_validator
1616

17+
from config.constants.postgresql import (
18+
POSTGRESQL_DATABASE_ENV,
19+
POSTGRESQL_HOST_ENV,
20+
POSTGRESQL_PASSWORD_ENV,
21+
POSTGRESQL_PORT_ENV,
22+
POSTGRESQL_SSL_MODE_ENV,
23+
POSTGRESQL_USERNAME_ENV,
24+
)
1725
from core.tool_framework.utils.tool_availability import tool_unavailable
1826
from integrations._relational import (
1927
RelationalConfigBase,
@@ -77,18 +85,18 @@ def build_postgresql_config(raw: dict[str, Any] | None) -> PostgreSQLConfig:
7785

7886
def postgresql_config_from_env() -> PostgreSQLConfig | None:
7987
"""Load a PostgreSQL config from env vars."""
80-
host = env_str("POSTGRESQL_HOST")
81-
database = env_str("POSTGRESQL_DATABASE")
88+
host = env_str(POSTGRESQL_HOST_ENV)
89+
database = env_str(POSTGRESQL_DATABASE_ENV)
8290
if not host or not database:
8391
return None
8492
return build_postgresql_config(
8593
{
8694
"host": host,
87-
"port": env_int("POSTGRESQL_PORT", DEFAULT_POSTGRESQL_PORT),
95+
"port": env_int(POSTGRESQL_PORT_ENV, DEFAULT_POSTGRESQL_PORT),
8896
"database": database,
89-
"username": env_str("POSTGRESQL_USERNAME", DEFAULT_POSTGRESQL_USER),
90-
"password": os.getenv("POSTGRESQL_PASSWORD", ""),
91-
"ssl_mode": env_str("POSTGRESQL_SSL_MODE", DEFAULT_POSTGRESQL_SSL_MODE),
97+
"username": env_str(POSTGRESQL_USERNAME_ENV, DEFAULT_POSTGRESQL_USER),
98+
"password": os.getenv(POSTGRESQL_PASSWORD_ENV, ""),
99+
"ssl_mode": env_str(POSTGRESQL_SSL_MODE_ENV, DEFAULT_POSTGRESQL_SSL_MODE),
92100
}
93101
)
94102

integrations/sentry/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
SENTRY_BASE_URL_ENV,
1919
SENTRY_ORGANIZATION_SLUG_ENV,
2020
SENTRY_PROJECT_SLUG_ENV,
21+
SENTRY_STATS_PERIOD_ENV,
2122
)
2223
from config.llm_credentials import resolve_env_credential
2324
from config.strict_config import StrictConfigModel
@@ -42,7 +43,7 @@
4243

4344
def _resolve_stats_period(explicit: str | None = None) -> str:
4445
"""Resolve the issues lookback window, overridable via ``SENTRY_STATS_PERIOD``."""
45-
period = (explicit or os.getenv("SENTRY_STATS_PERIOD", "") or "").strip()
46+
period = (explicit or os.getenv(SENTRY_STATS_PERIOD_ENV, "") or "").strip()
4647
return period or DEFAULT_SENTRY_STATS_PERIOD
4748

4849

integrations/signoz/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import httpx
1515
from pydantic import Field
1616

17+
from config.constants.signoz import SIGNOZ_API_KEY_ENV, SIGNOZ_URL_ENV
1718
from config.strict_config import StrictConfigModel
1819
from integrations._validation_helpers import report_classify_failure, report_validation_failure
1920

@@ -52,8 +53,8 @@ def build_signoz_config(raw: dict[str, Any] | None) -> SigNozConfig:
5253

5354
def signoz_config_from_env() -> SigNozConfig | None:
5455
"""Load a SigNoz config from env vars."""
55-
url = os.getenv("SIGNOZ_URL", "").strip()
56-
api_key = os.getenv("SIGNOZ_API_KEY", "").strip()
56+
url = os.getenv(SIGNOZ_URL_ENV, "").strip()
57+
api_key = os.getenv(SIGNOZ_API_KEY_ENV, "").strip()
5758

5859
if not (url and api_key):
5960
return None

0 commit comments

Comments
 (0)