Skip to content

Commit d89d1ff

Browse files
author
haibin.lhb
committed
refactor(settings/docs): CLI-only endpoint mapping; drop ENV/@file support
- settings.build_endpoint_mapping(): remove env/file handling, parse CLI strings only - __init__.py: build mappings from CLI only - tests: update to reflect CLI-only behavior - docs: remove ENV and @file examples; clarify CLI-only usage; CHANGELOG updated Change-Id: Ia869f1af56573a23e2d04de928656701daebf486 Co-developed-by: Cursor <[email protected]>
1 parent d728190 commit d89d1ff

File tree

6 files changed

+23
-109
lines changed

6 files changed

+23
-109
lines changed

CHANGELOG.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
## 0.3.2
44
- 新增全局配置 Settings:支持 SLS/ARMS endpoint 映射与模板回退
5-
- 启动参数:`--sls-endpoints``--arms-endpoints`(支持 `REGION=HOST`、逗号/空格分隔,或 `@file` 加载 JSON/纯文本)
6-
- 环境变量:`SLS_ENDPOINTS``ARMS_ENDPOINTS`
5+
- 启动参数:`--sls-endpoints``--arms-endpoints`(仅支持 `REGION=HOST`,逗号/空格分隔)比如 `--sls-endpoints "cn-shanghai=cn-hangzhou.log.aliyuncs.com"`
76
- 未命中映射时回退:SLS `"{region}.log.aliyuncs.com"`,ARMS `"arms.{region}.aliyuncs.com"`
87
- 统一客户端端点解析,并打印使用的 region/endpoint/source(explicit/mapping/template)
9-
- CLI 清理:仅保留 `--sls-endpoints`(移除其他变体)
8+
- CLI 清理:仅保留 `--sls-endpoints`(移除其他变体),不再支持环境变量与 @file 加载
109

1110
## 0.3.1
1211
- 修复ARMS工具返回结果类型错误问题,会导致高版本的MCP出现返回值提取错误

README.md

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ python -m mcp_server_aliyun_observability --transport sse --access-key-id <your_
214214

215215
### 端点映射与全局配置(SLS/ARMS)
216216

217-
支持在启动时覆盖各区域的服务端点,并在运行时打印实际生效的区域与端点(source=explicit/mapping/template)。
217+
支持在启动时通过命令行覆盖各区域的服务端点,并在运行时打印实际生效的区域与端点(source=explicit/mapping/template)。
218218

219219
- SLS 端点映射(CLI)
220220
```
@@ -228,24 +228,13 @@ python -m mcp_server_aliyun_observability \
228228
python -m mcp_server_aliyun_observability --arms-endpoints "cn-shanghai=arms.internal"
229229
```
230230

231-
- 环境变量方式(优先级低于 CLI)
232-
```
233-
SLS_ENDPOINTS="cn-shanghai=cn-hangzhou.log.aliyuncs.com" \
234-
ARMS_ENDPOINTS="cn-shanghai=arms.internal" \
235-
python -m mcp_server_aliyun_observability --transport sse
236-
```
237-
238-
- 从文件加载(@file),文件可为 JSON 对象或纯文本 pairs
239-
```
240-
echo '{"cn-shanghai":"cn-hangzhou.log.aliyuncs.com"}' > sls_endpoints.json
241-
python -m mcp_server_aliyun_observability --sls-endpoints @sls_endpoints.json
242-
```
231+
- 仅支持命令行参数方式(不支持环境变量与 @file 加载)
243232

244233
- 默认回退模板(未命中映射时):
245234
- SLS: `{region}.log.aliyuncs.com`
246235
- ARMS: `arms.{region}.aliyuncs.com`
247236

248-
- CMS 说明:CMS 工具内部使用 SLS 客户端,自动复用 `--sls-endpoints` 的映射,无需单独 cms 配置
237+
- CMS 说明:CMS 工具内部使用 SLS 客户端,自动复用 `--sls-endpoints` 的映射。
249238

250239
- 日志示例(控制台与文件均会输出):
251240
```

README_EN.md

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ python -m mcp_server_aliyun_observability --transport sse --access-key-id <your_
215215

216216
### Endpoint Overrides and Global Settings (SLS/ARMS)
217217

218-
You can override service endpoints per region at startup. The server logs the effective region/endpoint and its source (explicit/mapping/template) when a client is created.
218+
You can override service endpoints per region at startup via CLI only. The server logs the effective region/endpoint and its source (explicit/mapping/template) when a client is created.
219219

220220
- SLS endpoint overrides (CLI)
221221
```
@@ -229,24 +229,13 @@ python -m mcp_server_aliyun_observability \
229229
python -m mcp_server_aliyun_observability --arms-endpoints "cn-shanghai=arms.internal"
230230
```
231231

232-
- Environment variables (lower precedence than CLI)
233-
```
234-
SLS_ENDPOINTS="cn-shanghai=cn-hangzhou.log.aliyuncs.com" \
235-
ARMS_ENDPOINTS="cn-shanghai=arms.internal" \
236-
python -m mcp_server_aliyun_observability --transport sse
237-
```
238-
239-
- Load from file (@file). File can be a JSON object or plain pairs text
240-
```
241-
echo '{"cn-shanghai":"cn-hangzhou.log.aliyuncs.com"}' > sls_endpoints.json
242-
python -m mcp_server_aliyun_observability --sls-endpoints @sls_endpoints.json
243-
```
232+
- CLI only (environment variables and @file loading are not supported)
244233

245234
- Template fallback when no mapping matched:
246235
- SLS: `{region}.log.aliyuncs.com`
247236
- ARMS: `arms.{region}.aliyuncs.com`
248237

249-
- CMS note: CMS tools internally reuse the SLS client, so it automatically respects `--sls-endpoints`.
238+
- CMS note: CMS tools internally reuse the SLS client and automatically respect `--sls-endpoints`.
250239

251240
- Example logs (to console and file):
252241
```

src/mcp_server_aliyun_observability/__init__.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@
4848
"--sls-endpoints",
4949
"sls_endpoints",
5050
type=str,
51-
help="REGION=HOST pairs (comma/space separated) or @file (JSON object or pairs).",
51+
help="REGION=HOST pairs (comma/space separated)",
5252
)
5353
@click.option(
5454
"--arms-endpoints",
5555
"arms_endpoints",
5656
type=str,
57-
help="REGION=HOST pairs (comma/space separated) or @file (JSON object or pairs) for ARMS.",
57+
help="REGION=HOST pairs (comma/space separated) for ARMS.",
5858
)
5959
def main(
6060
access_key_id,
@@ -73,18 +73,8 @@ def main(
7373

7474
# Configure global settings (process-wide, frozen)
7575
try:
76-
sls_mapping = build_endpoint_mapping(
77-
cli_pairs=None,
78-
combined=sls_endpoints,
79-
file_ref=None,
80-
env_var="SLS_ENDPOINTS",
81-
)
82-
arms_mapping = build_endpoint_mapping(
83-
cli_pairs=None,
84-
combined=arms_endpoints,
85-
file_ref=None,
86-
env_var="ARMS_ENDPOINTS",
87-
)
76+
sls_mapping = build_endpoint_mapping(cli_pairs=None, combined=sls_endpoints)
77+
arms_mapping = build_endpoint_mapping(cli_pairs=None, combined=arms_endpoints)
8878
settings = GlobalSettings(
8979
sls=SLSSettings(endpoints=sls_mapping),
9080
arms=ArmsSettings(endpoints=arms_mapping),

src/mcp_server_aliyun_observability/settings.py

Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
from dataclasses import dataclass, field
1414
from threading import RLock
15-
from pathlib import Path
1615
from typing import Optional, Dict, Iterable
1716
import json
1817
import os
@@ -46,65 +45,21 @@ def _parse_pairs_str(s: str | None) -> Dict[str, str]:
4645
return out
4746

4847

49-
def _load_mapping_from_file(path: str) -> Dict[str, str]:
50-
"""Load a mapping from a file. Supports JSON object or pairs text.
51-
52-
- If content starts with '{', parse as JSON object: {"cn-hangzhou":"x", ...}
53-
- Otherwise parse as pairs text like "cn-shanghai=foo,cn-hangzhou=bar"
54-
"""
55-
p = Path(path).expanduser()
56-
if not p.exists():
57-
raise FileNotFoundError(f"Endpoints file not found: {path}")
58-
text = p.read_text(encoding="utf-8").strip()
59-
if not text:
60-
return {}
61-
if text.startswith("{"):
62-
data = json.loads(text)
63-
if not isinstance(data, dict):
64-
raise ValueError("Expected a JSON object for endpoints mapping")
65-
return {str(k): str(v) for k, v in data.items()}
66-
return _parse_pairs_str(text)
67-
68-
6948
def build_endpoint_mapping(
7049
cli_pairs: Iterable[str] | None,
7150
combined: Optional[str],
72-
file_ref: Optional[str],
73-
env_var: str = "SLS_ENDPOINTS",
7451
) -> Dict[str, str]:
75-
"""Build endpoint mapping from multiple sources with precedence:
52+
"""Build endpoint mapping from CLI inputs only.
7653
77-
file (lowest) < env var < combined < repeated cli pairs (highest)
54+
Precedence: combined string < repeated cli_pairs (last wins).
7855
"""
7956
mapping: Dict[str, str] = {}
8057

81-
# File (lowest)
82-
if file_ref:
83-
src = file_ref.strip()
84-
if src.startswith("@"):
85-
src = src[1:]
86-
mapping.update(_load_mapping_from_file(src))
87-
88-
# ENV
89-
env_val = os.getenv(env_var)
90-
if env_val:
91-
env_val = env_val.strip()
92-
if env_val.startswith("{"):
93-
data = json.loads(env_val)
94-
if isinstance(data, dict):
95-
mapping.update({str(k): str(v) for k, v in data.items()})
96-
else:
97-
mapping.update(_parse_pairs_str(env_val))
98-
99-
# Combined
58+
# Combined string
10059
if combined:
101-
c = combined.strip()
102-
if c.startswith("@"):
103-
mapping.update(_load_mapping_from_file(c[1:]))
104-
else:
105-
mapping.update(_parse_pairs_str(c))
60+
mapping.update(_parse_pairs_str(combined.strip()))
10661

107-
# Repeated CLI pairs (highest)
62+
# Repeated CLI pairs (override)
10863
for pair in (cli_pairs or []):
10964
mapping.update(_parse_pairs_str(pair))
11065

tests/test_settings_endpoints.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,17 @@
1313
)
1414

1515

16-
def test_build_endpoint_mapping_precedence(tmp_path, monkeypatch):
17-
# file (lowest)
18-
f = tmp_path / "eps.json"
19-
f.write_text(json.dumps({"cn-beijing": "file.example.com"}), encoding="utf-8")
20-
21-
# env (overrides file)
22-
monkeypatch.setenv("SLS_ENDPOINTS", "cn-beijing=env.example.com cn-shanghai=env-sh.example.com")
23-
24-
# combined (overrides env)
16+
def test_build_endpoint_mapping_precedence():
17+
# combined (base)
2518
combined = "cn-beijing=combined.example.com,cn-hangzhou=combined-hz.example.com"
2619

27-
# repeated CLI (highest)
20+
# repeated CLI (override)
2821
cli_pairs = [
2922
"cn-beijing=cli.example.com",
3023
"cn-shanghai=cli-sh.example.com",
3124
]
3225

33-
mapping = build_endpoint_mapping(cli_pairs, combined, f"@{str(f)}")
26+
mapping = build_endpoint_mapping(cli_pairs, combined)
3427
assert mapping["cn-beijing"] == "cli.example.com"
3528
assert mapping["cn-shanghai"] == "cli-sh.example.com"
3629
assert mapping["cn-hangzhou"] == "combined-hz.example.com"
@@ -57,7 +50,6 @@ def test_configure_and_get_settings(monkeypatch):
5750
assert get_settings().arms.resolve("cn-shanghai") == "arms.internal"
5851

5952

60-
def test_build_arms_endpoint_mapping(monkeypatch):
61-
monkeypatch.setenv("ARMS_ENDPOINTS", "cn-hangzhou=arms.hz.example.com")
62-
mapping = build_endpoint_mapping(None, None, None, env_var="ARMS_ENDPOINTS")
53+
def test_build_arms_endpoint_mapping():
54+
mapping = build_endpoint_mapping(None, "cn-hangzhou=arms.hz.example.com")
6355
assert mapping["cn-hangzhou"] == "arms.hz.example.com"

0 commit comments

Comments
 (0)