@agentunion/fastaun-browser 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +190 -178
  2. package/_packed_docs/AUN_SDK_0.4.0_/350/256/276/350/256/241/345/257/271/346/257/224/345/210/206/346/236/220.md +194 -194
  3. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/345/256/236/346/226/275/350/256/241/345/210/222.md +596 -596
  4. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/350/256/276/350/256/241/346/226/271/346/241/210_v3.md +1698 -1697
  5. package/_packed_docs/CHANGELOG.md +190 -178
  6. package/_packed_docs/INDEX.md +17 -17
  7. package/_packed_docs/KITE_DOCS_GUIDE.md +11 -11
  8. package/_packed_docs/agent.md/SCHEMA.md +49 -49
  9. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +22 -22
  10. package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +327 -327
  11. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +686 -686
  12. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +542 -542
  13. package/_packed_docs/design/E2EE_V2/347/256/200/345/214/226/344/270/2721DH/345/212/240Per-AID_Wrap/346/226/271/346/241/210.md +124 -124
  14. package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +665 -665
  15. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +2 -2
  16. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -170
  17. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -419
  18. package/_packed_docs/protocol/README.md +1 -1
  19. package/_packed_docs/protocol/aun-docs-guide.md +1 -1
  20. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +15 -15
  21. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +4 -4
  22. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +98 -98
  23. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +46 -46
  24. package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +257 -257
  25. package/_packed_docs/python-sdk-v2-only-changelog.md +189 -189
  26. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
  27. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
  28. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1 -0
  29. package/_packed_docs/sdk/09-payload-reference.md +13 -13
  30. package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +171 -171
  31. package/dist/aid.d.ts +2 -1
  32. package/dist/aid.d.ts.map +1 -1
  33. package/dist/aid.js +7 -6
  34. package/dist/aid.js.map +1 -1
  35. package/dist/auth.d.ts.map +1 -1
  36. package/dist/auth.js +4 -0
  37. package/dist/auth.js.map +1 -1
  38. package/dist/bundle.js +237 -149
  39. package/dist/client.d.ts +7 -1
  40. package/dist/client.d.ts.map +1 -1
  41. package/dist/client.js +238 -153
  42. package/dist/client.js.map +1 -1
  43. package/dist/version.d.ts +1 -1
  44. package/dist/version.js +1 -1
  45. package/package.json +1 -1
@@ -1,542 +1,542 @@
1
- # AUN RPC Trace 增强设计
2
-
3
- **日期**: 2026-05-22
4
- **范围**: Gateway + Message + Auth + CA + Group + Python SDK
5
- **目标**: 补全 RPC trace 诊断信息,从"只有路径和耗时"到"能定位业务失败原因"
6
-
7
- ---
8
-
9
- ## 问题现状
10
-
11
- 当前 trace 输出示例:
12
-
13
- ```
14
- [TRACE][message.v2.put_peer_pk][error] total=54ms trace_id=93643d8d922d3d49a86345b8c267c178
15
- ├─ sdk.send dur=0ms @00:24:29.197
16
- ├─ gateway.relay_in dur=0ms @00:24:29.378
17
- ├─ ca.process dur=2ms @00:24:29.382
18
- ├─ message.process dur=7ms @00:24:29.380
19
- ├─ gateway.relay_out dur=10ms @00:24:29.378
20
- └─ sdk.recv dur=54ms
21
- ```
22
-
23
- **缺陷:**
24
- 1. 只能看到"经过了哪些模块",看不到"每个模块做了什么"
25
- 2. `ca.process dur=2ms` 无法知道查的是哪个 AID、什么条件、结果是否找到
26
- 3. `message.process dur=7ms` 无法知道调用了哪个嵌套 RPC、为什么失败
27
- 4. 单行 `process` span 无法区分"进入"和"退出",嵌套关系不清晰
28
-
29
- **根本原因:**
30
- - 服务端 span 只有 `node`、`ts`、`action=process`、`ms` 四个字段
31
- - 没有业务诊断字段(aid、method、found、error_code 等)
32
- - SDK 展示逻辑按"平铺列表"而非"调用树"
33
-
34
- ---
35
-
36
- ## 设计方案
37
-
38
- ### 1. Span 结构改造
39
-
40
- #### 1.1 Enter/Exit 语义
41
-
42
- 每个服务产生 **两个 span**:
43
-
44
- **Enter span(承载所有诊断信息):**
45
- ```python
46
- {
47
- "node": "message", # 模块名
48
- "ts": 1234567890123, # 毫秒时间戳
49
- "action": "enter", # 固定 "enter"
50
- "method": "v2.put_peer_pk", # RPC 方法短名
51
- # 业务诊断字段(按模块定制,尽可能详细)
52
- "caller_aid": "yayi2000.agentid.pub",
53
- "peer_aid": "yayi2000.agentid.pub",
54
- "key_source": "peer_device_prekey",
55
- "spk_id": "sha256:abc123ab",
56
- "device_id": "device-xyz",
57
- }
58
- ```
59
-
60
- **Exit span:**
61
- ```python
62
- {
63
- "node": "message",
64
- "ts": 1234567890130,
65
- "action": "exit",
66
- "ms": 7, # 耗时(必需)
67
- "status": "error", # ok / error(必需)
68
- # 失败时补充错误信息 + 上下文
69
- "error_code": -32603,
70
- "error_msg": "AID cert not found",
71
- "peer_aid": "yayi2000.agentid.pub", # 失败相关的关键上下文
72
- "method": "v2.put_peer_pk",
73
- # 成功时补充关键结果(可选)
74
- "found": false, # CA 查询结果
75
- "delivered_count": 2, # Message 发送结果
76
- }
77
- ```
78
-
79
- **设计原则:**
80
- - **Enter span 承载完整上下文**,方便定位问题根因
81
- - **Exit span 关注结果和性能**:
82
- - 成功时:`ms`、`status=ok`、关键结果字段(found/delivered_count)
83
- - 失败时:`ms`、`status=error`、`error_code`、`error_msg`、**失败相关的上下文字段**(aid/method/peer_aid 等)
84
- - SDK 展示时,enter 行显示完整诊断信息,exit 行显示结果和耗时
85
-
86
- #### 1.2 嵌套调用处理
87
-
88
- 当 Message 调用 CA 时:
89
- - Message 的 `_current_trace.child_spans` 自动收集 CA 的 enter/exit span
90
- - Message exit 时,将 child_spans 合并到响应的 `_trace.spans` 列表
91
- - SDK 收到后按 ts 排序,自动识别嵌套关系
92
-
93
- #### 1.3 安全字段白名单
94
-
95
- **允许放入 span:**
96
- - ✅ aid、method、curve、lifecycle_state、found、error_code
97
- - ✅ cert_sn 前缀(前 8 位)、route、namespace、instance_id
98
- - ✅ group_id、member_count、delivered_count
99
-
100
- **严格禁止:**
101
- - ❌ token、私钥、证书 PEM、签名原文
102
- - ❌ challenge nonce、密码、refresh_token
103
-
104
- ---
105
-
106
- ### 2. 各模块补充字段
107
-
108
- #### 2.1 Gateway (relay.py)
109
-
110
- **Enter span (`relay_in`):**
111
- ```python
112
- {
113
- "node": "gateway",
114
- "action": "enter",
115
- "ts": <timestamp>,
116
- # 详细诊断信息
117
- "route": "service_plane", # direct / service_plane / kernel / fallback
118
- "namespace": "message",
119
- "method": "v2.put_peer_pk",
120
- "aid": "yayi2000.agentid.pub",
121
- "instance_id": "message#1", # service_plane 时有值
122
- "connection_id": "conn-abc123",
123
- "device_id": "device-xyz",
124
- }
125
- ```
126
-
127
- **Exit span:**
128
- ```python
129
- {
130
- "node": "gateway",
131
- "action": "exit",
132
- "ts": <timestamp>,
133
- "ms": 10, # 耗时(必需)
134
- "status": "error", # ok / error(必需)
135
- # 失败时补充错误信息 + 上下文
136
- "error_code": -32603,
137
- "error_msg": "AID cert not found",
138
- "method": "v2.put_peer_pk",
139
- "aid": "yayi2000.agentid.pub",
140
- }
141
- ```
142
-
143
- **修改位置:**
144
- - `relay.py:844` — relay_in span 补字段
145
- - `relay.py:962` — relay_out span 补字段
146
-
147
- #### 2.2 Message (entry.py)
148
-
149
- **Enter span:**
150
- ```python
151
- {
152
- "node": "message",
153
- "action": "enter",
154
- "ts": <timestamp>,
155
- # 详细诊断信息
156
- "method": "v2.put_peer_pk",
157
- "caller_aid": "yayi2000.agentid.pub",
158
- "peer_aid": "yayi2000.agentid.pub",
159
- "key_source": "peer_device_prekey",
160
- "spk_id": "sha256:abc123ab",
161
- "device_id": "device-xyz",
162
- # 或按方法不同:
163
- # "to_aid" / "from_aid" / "group_id" / "message_id"
164
- }
165
- ```
166
-
167
- **Exit span:**
168
- ```python
169
- {
170
- "node": "message",
171
- "action": "exit",
172
- "ts": <timestamp>,
173
- "ms": 7, # 耗时(必需)
174
- "status": "error", # ok / error(必需)
175
- # 失败时补充错误信息 + 上下文
176
- "error_code": -32603,
177
- "error_msg": "AID cert not found",
178
- "method": "v2.put_peer_pk",
179
- "peer_aid": "yayi2000.agentid.pub",
180
- # 成功时补充关键结果
181
- "found": true, # bootstrap 方法
182
- "delivered_count": 2, # send 方法
183
- "message_id": "msg-xyz",
184
- }
185
- ```
186
-
187
- **修改位置:**
188
- - `entry.py:199-268` — `_TracingWS` 类改造
189
- - `__init__` 记录 enter 时间
190
- - `_inject_trace` 改成生成 enter + exit 两个 span
191
- - enter span 从 `params` 提取业务字段
192
- - exit span 从 `payload` 提取 status/error
193
-
194
- #### 2.3 Auth (entry.py)
195
-
196
- **Enter span:**
197
- ```python
198
- {
199
- "node": "auth",
200
- "action": "enter",
201
- "ts": <timestamp>,
202
- # 详细诊断信息
203
- "method": "verify", # 或 login_phase1 / login_phase2 / create_aid
204
- "aid": "yayi2000.agentid.pub",
205
- "auth_method": "aid", # pairing_code / kite_token / aid
206
- "device_id": "device-xyz",
207
- "client_nonce": "nonce-abc...", # 前 16 位
208
- }
209
- ```
210
-
211
- **Exit span:**
212
- ```python
213
- {
214
- "node": "auth",
215
- "action": "exit",
216
- "ts": <timestamp>,
217
- "ms": 15, # 耗时(必需)
218
- "status": "ok", # ok / error(必需)
219
- # 成功时补充
220
- "success": true, # verify 方法
221
- "created": false, # create_aid 方法(幂等标识)
222
- # 失败时补充
223
- "error_code": -32001,
224
- "error_msg": "invalid signature",
225
- }
226
- ```
227
-
228
- **修改位置:**
229
- - Auth 模块当前没有 `_TracingWS` 封装,需要新增或复用 Message 的模式
230
-
231
- #### 2.4 CA (entry.py)
232
-
233
- **Enter span:**
234
- ```python
235
- {
236
- "node": "ca",
237
- "action": "enter",
238
- "ts": <timestamp>,
239
- # 详细诊断信息
240
- "method": "get_cert",
241
- "aid": "yayi2000.agentid.pub",
242
- "curve": "P-256",
243
- "lifecycle_state": "active_signing",
244
- "cert_sn": "abc123...", # 按序列号查询时
245
- "cert_fingerprint": "sha256:abc123ab...", # 按指纹查询时(前 16 位)
246
- }
247
- ```
248
-
249
- **Exit span:**
250
- ```python
251
- {
252
- "node": "ca",
253
- "action": "exit",
254
- "ts": <timestamp>,
255
- "ms": 2, # 耗时(必需)
256
- "status": "ok", # ok / error(必需)
257
- # 成功时补充
258
- "found": true,
259
- "cert_sn_prefix": "abc123ab", # 找到时返回前 8 位
260
- "lifecycle_state": "active_signing",
261
- # 失败时补充错误信息 + 上下文
262
- "found": false,
263
- "error_code": -32002,
264
- "error_msg": "certificate not found",
265
- "method": "get_cert",
266
- "aid": "yayi2000.agentid.pub",
267
- "curve": "P-256",
268
- }
269
- ```
270
-
271
- **修改位置:**
272
- - CA 模块当前没有 `_TracingWS` 封装,需要新增
273
-
274
- #### 2.5 Group (entry.py)
275
-
276
- **Enter span:**
277
- ```python
278
- {
279
- "node": "group",
280
- "action": "enter",
281
- "ts": <timestamp>,
282
- # 详细诊断信息
283
- "method": "create",
284
- "group_id": "group-abc123",
285
- "caller_aid": "alice.aid.com",
286
- "member_aids": ["alice.aid.com", "bob.aid.com", "carol.aid.com"], # 或 member_count
287
- "group_name": "Project Team",
288
- }
289
- ```
290
-
291
- **Exit span:**
292
- ```python
293
- {
294
- "node": "group",
295
- "action": "exit",
296
- "ts": <timestamp>,
297
- "ms": 12, # 耗时(必需)
298
- "status": "ok", # ok / error(必需)
299
- # 成功时补充
300
- "group_id": "group-abc123",
301
- "member_count": 3,
302
- # 失败时补充错误信息 + 上下文
303
- "error_code": -32603,
304
- "error_msg": "member not found",
305
- "method": "create",
306
- "caller_aid": "alice.aid.com",
307
- }
308
- ```
309
-
310
- **修改位置:**
311
- - Group 模块当前没有 `_TracingWS` 封装,需要新增
312
-
313
- ---
314
-
315
- ### 3. SDK 展示改造(Python)
316
-
317
- #### 3.1 目标效果
318
-
319
- ```
320
- [TRACE][message.v2.put_peer_pk][error] total=54ms trace_id=93643d8d922d3d49a86345b8c267c178
321
- ├─ sdk.send @00:24:29.197
322
- ├─ gateway.enter route=service_plane namespace=message @00:24:29.378
323
- ├─ message.enter method=v2.put_peer_pk peer_aid=yayi2000.agentid.pub @00:24:29.380
324
- │ ├─ ca.enter method=get_cert aid=yayi2000.agentid.pub curve=P-256 lifecycle=active_signing @00:24:29.382
325
- │ └─ ca.exit status=not_found found=false dur=2ms @00:24:29.384
326
- ├─ message.exit status=error error_code=-32603 error="AID cert not found" dur=7ms @00:24:29.387
327
- ├─ gateway.exit status=error dur=10ms @00:24:29.388
328
- └─ sdk.recv dur=54ms
329
- ```
330
-
331
- #### 3.2 实现要点
332
-
333
- **树状结构识别:**
334
- 1. 按 `ts` 排序所有 span
335
- 2. 维护栈:遇到 `action=enter` 入栈,遇到 `action=exit` 出栈
336
- 3. 栈深度决定缩进层级
337
- 4. exit span 展示 duration(从对应 enter span 计算)
338
-
339
- **字段展示规则:**
340
- - enter span:展示关键业务字段(aid、method、route 等)
341
- - exit span:展示结果字段(status、found、error_code、dur)
342
- - 单行最多展示 3-4 个关键字段,避免过长
343
-
344
- **向后兼容:**
345
- - 旧格式 `action=process`:按单行展示,dur 直接取 `ms` 字段
346
- - 新格式 enter/exit:按树状展示
347
- - 混合格式:分别处理
348
-
349
- **修改位置:**
350
- - `python/src/aun_core/transport.py:268-281` — `_trace_observer` 回调
351
- - 新增 `_format_trace_tree(spans)` 函数,返回多行字符串
352
-
353
- ---
354
-
355
- ### 4. 实现计划
356
-
357
- #### Phase 1: 服务端 span 结构改造
358
-
359
- **Task 1.1: Message 模块 enter/exit span**
360
- - 修改 `_TracingWS` 类,改造 `_inject_trace` 方法
361
- - enter span 从 `params` 提取 `method`、`caller_aid`、`peer_aid`/`to_aid`/`group_id`
362
- - exit span 从 `payload` 提取 `status`、`error_code`、`found`/`delivered_count`
363
- - 测试:`message.v2.put_peer_pk` 失败时 trace 包含 `peer_aid` 和 `error_code`
364
-
365
- **Task 1.2: CA 模块 enter/exit span**
366
- - 新增 `_TracingWS` 封装(复用 Message 模式)
367
- - enter span 提取 `aid`、`cert_sn`、`curve`、`lifecycle_state`
368
- - exit span 提取 `found`、`cert_sn_prefix`(前 8 位)
369
- - 测试:`ca.get_cert` 查询失败时 trace 包含 `aid` 和 `found=false`
370
-
371
- **Task 1.3: Auth 模块 enter/exit span**
372
- - 新增 `_TracingWS` 封装
373
- - enter span 提取 `method`、`aid`、`auth_method`
374
- - exit span 提取 `success`、`created`
375
- - 测试:`auth.verify` 失败时 trace 包含 `aid` 和 `auth_method`
376
-
377
- **Task 1.4: Group 模块 enter/exit span**
378
- - 新增 `_TracingWS` 封装
379
- - enter span 提取 `method`、`group_id`、`caller_aid`、`member_count`
380
- - exit span 提取 `group_id`、`member_count`
381
- - 测试:`group.create` 成功时 trace 包含 `group_id` 和 `member_count`
382
-
383
- **Task 1.5: Gateway relay span 补字段**
384
- - `relay_in` span 补充 `route`、`namespace`、`method`、`aid`、`instance_id`
385
- - `relay_out` span 补充 `status`、`error_code`
386
- - 测试:service_plane 路由时 trace 包含 `route=service_plane` 和 `instance_id`
387
-
388
- #### Phase 2: SDK 展示改造
389
-
390
- **Task 2.1: 树状展示逻辑**
391
- - 新增 `_format_trace_tree(spans)` 函数
392
- - 按 `ts` 排序,维护栈识别嵌套
393
- - enter/exit 配对,exit 时计算 duration
394
- - 返回多行字符串(带缩进)
395
-
396
- **Task 2.2: 字段展示规则**
397
- - enter span:展示 `method`、`aid`、`route` 等关键字段
398
- - exit span:展示 `status`、`found`、`error_code`、`dur`
399
- - 单行最多 3-4 个字段
400
-
401
- **Task 2.3: 向后兼容**
402
- - 识别旧格式 `action=process`,按单行展示
403
- - 混合格式分别处理
404
-
405
- **Task 2.4: 集成到 transport.py**
406
- - 修改 `_trace_observer` 回调,调用 `_format_trace_tree`
407
- - 输出到日志(`self._log.info`)
408
-
409
- #### Phase 3: 测试验证
410
-
411
- **Task 3.1: 单元测试**
412
- - `test_trace_span_enter_exit.py` — 验证 enter/exit span 生成
413
- - `test_trace_tree_format.py` — 验证 SDK 树状展示
414
-
415
- **Task 3.2: 集成测试**
416
- - 运行 `python -X utf8 tests/integration_test_e2ee.py`
417
- - 验证 `message.v2.put_peer_pk` 失败时 trace 包含完整诊断信息
418
- - 验证嵌套调用(message → ca)的 span 正确合并
419
-
420
- **Task 3.3: 手动测试**
421
- - `aun login yayi2000.agentid.pub` 触发 `put_peer_pk` 失败
422
- - 检查日志输出是否包含 `peer_aid`、`ca.enter`、`found=false`、`error_code`
423
-
424
- ---
425
-
426
- ### 5. 向后兼容
427
-
428
- **旧 SDK 收到新 span:**
429
- - 忽略不认识的字段(`action=enter/exit`、业务字段)
430
- - 仍能展示基本路径和耗时
431
-
432
- **新 SDK 收到旧 span:**
433
- - 识别 `action=process`,按单行展示
434
- - 不影响现有功能
435
-
436
- **trace mode 不变:**
437
- - 仍为 `off/log/diag` 三档
438
- - 不引入新模式
439
-
440
- ---
441
-
442
- ### 6. 安全审查
443
-
444
- **禁止字段清单:**
445
- - token、refresh_token、access_token
446
- - 私钥(private_key、priv、secret)
447
- - 证书 PEM(cert_pem、cert、certificate)
448
- - 签名原文(signature、sig_raw)
449
- - challenge nonce、密码(password、pwd)
450
-
451
- **允许字段清单:**
452
- - aid、method、curve、lifecycle_state
453
- - found、error_code、error_msg(不含敏感信息)
454
- - cert_sn 前缀(前 8 位)
455
- - route、namespace、instance_id
456
- - group_id、member_count、delivered_count
457
-
458
- **审查机制:**
459
- - 代码审查时检查所有 span 字段来源
460
- - 禁止直接 `span.update(params)` 全量复制
461
- - 必须显式白名单提取
462
-
463
- ---
464
-
465
- ### 7. 性能影响
466
-
467
- **额外开销:**
468
- - 每个 RPC 多生成 1 个 span(enter + exit 共 2 个,原来 1 个)
469
- - 每个 span 增加 3-5 个业务字段(约 50-100 字节)
470
- - SDK 展示增加树状格式化(O(n log n) 排序 + O(n) 遍历)
471
-
472
- **预估影响:**
473
- - diag 模式下单次 RPC 增加 ~200 字节网络传输
474
- - SDK 格式化耗时 <1ms(100 个 span 以内)
475
- - 对 off/log 模式无影响(不生成 span)
476
-
477
- **优化措施:**
478
- - span 数量上限保持 32 个(已有限制)
479
- - 字段值截断(error_msg 最多 200 字符)
480
- - 仅 diag 模式生成详细字段
481
-
482
- ---
483
-
484
- ## 实施顺序
485
-
486
- 1. **Phase 1.1-1.2**:Message + CA(最高优先级,覆盖 80% 失败场景)
487
- 2. **Phase 2**:SDK 展示改造(让 Phase 1 的字段可见)
488
- 3. **Phase 3.2-3.3**:集成测试 + 手动验证
489
- 4. **Phase 1.3-1.5**:Auth + Group + Gateway(补全剩余模块)
490
- 5. **Phase 3.1**:单元测试(回归保护)
491
-
492
- ---
493
-
494
- ## 成功标准
495
-
496
- **功能完整性:**
497
- - ✅ `message.v2.put_peer_pk` 失败时,trace 包含 `peer_aid` 和 `ca.get_cert` 的 `found=false`
498
- - ✅ `ca.get_cert` 查询失败时,trace 包含 `aid`、`curve`、`lifecycle_state`
499
- - ✅ SDK 展示为树状结构,嵌套调用正确缩进
500
- - ✅ enter/exit span 配对,exit 展示 duration
501
-
502
- **向后兼容:**
503
- - ✅ 旧 SDK 收到新 span 不报错
504
- - ✅ 新 SDK 收到旧 span 降级展示
505
-
506
- **安全合规:**
507
- - ✅ 所有 span 字段通过白名单审查
508
- - ✅ 不包含 token、私钥、证书 PEM、签名原文
509
-
510
- **性能可接受:**
511
- - ✅ diag 模式下单次 RPC 增加传输 <500 字节
512
- - ✅ SDK 格式化耗时 <5ms
513
-
514
- ---
515
-
516
- ## 风险与缓解
517
-
518
- **风险 1:span 数量爆炸**
519
- - 缓解:保持 32 个上限,超出时截断最早的 span
520
-
521
- **风险 2:敏感信息泄露**
522
- - 缓解:代码审查 + 白名单机制 + 单元测试覆盖
523
-
524
- **风险 3:向后兼容性破坏**
525
- - 缓解:旧 SDK 忽略新字段,新 SDK 识别旧格式
526
-
527
- **风险 4:性能回退**
528
- - 缓解:仅 diag 模式生成详细字段,off/log 模式不变
529
-
530
- ---
531
-
532
- ## 后续扩展
533
-
534
- **Phase 4(可选):**
535
- - 其他语言 SDK(Go/TS/JS/C++)展示改造
536
- - 其他服务模块(Storage/Stream/Mail)span 补全
537
- - Trace 聚合分析工具(按 trace_id 查询完整链路)
538
-
539
- **Phase 5(可选):**
540
- - Trace 持久化(写入 ClickHouse/Elasticsearch)
541
- - Trace 可视化(Web UI 展示调用树)
542
- - Trace 告警(失败率/耗时异常自动通知)
1
+ # AUN RPC Trace 增强设计
2
+
3
+ **日期**: 2026-05-22
4
+ **范围**: Gateway + Message + Auth + CA + Group + Python SDK
5
+ **目标**: 补全 RPC trace 诊断信息,从"只有路径和耗时"到"能定位业务失败原因"
6
+
7
+ ---
8
+
9
+ ## 问题现状
10
+
11
+ 当前 trace 输出示例:
12
+
13
+ ```
14
+ [TRACE][message.v2.put_peer_pk][error] total=54ms trace_id=93643d8d922d3d49a86345b8c267c178
15
+ ├─ sdk.send dur=0ms @00:24:29.197
16
+ ├─ gateway.relay_in dur=0ms @00:24:29.378
17
+ ├─ ca.process dur=2ms @00:24:29.382
18
+ ├─ message.process dur=7ms @00:24:29.380
19
+ ├─ gateway.relay_out dur=10ms @00:24:29.378
20
+ └─ sdk.recv dur=54ms
21
+ ```
22
+
23
+ **缺陷:**
24
+ 1. 只能看到"经过了哪些模块",看不到"每个模块做了什么"
25
+ 2. `ca.process dur=2ms` 无法知道查的是哪个 AID、什么条件、结果是否找到
26
+ 3. `message.process dur=7ms` 无法知道调用了哪个嵌套 RPC、为什么失败
27
+ 4. 单行 `process` span 无法区分"进入"和"退出",嵌套关系不清晰
28
+
29
+ **根本原因:**
30
+ - 服务端 span 只有 `node`、`ts`、`action=process`、`ms` 四个字段
31
+ - 没有业务诊断字段(aid、method、found、error_code 等)
32
+ - SDK 展示逻辑按"平铺列表"而非"调用树"
33
+
34
+ ---
35
+
36
+ ## 设计方案
37
+
38
+ ### 1. Span 结构改造
39
+
40
+ #### 1.1 Enter/Exit 语义
41
+
42
+ 每个服务产生 **两个 span**:
43
+
44
+ **Enter span(承载所有诊断信息):**
45
+ ```python
46
+ {
47
+ "node": "message", # 模块名
48
+ "ts": 1234567890123, # 毫秒时间戳
49
+ "action": "enter", # 固定 "enter"
50
+ "method": "v2.put_peer_pk", # RPC 方法短名
51
+ # 业务诊断字段(按模块定制,尽可能详细)
52
+ "caller_aid": "yayi2000.agentid.pub",
53
+ "peer_aid": "yayi2000.agentid.pub",
54
+ "key_source": "peer_device_prekey",
55
+ "spk_id": "sha256:abc123ab",
56
+ "device_id": "device-xyz",
57
+ }
58
+ ```
59
+
60
+ **Exit span:**
61
+ ```python
62
+ {
63
+ "node": "message",
64
+ "ts": 1234567890130,
65
+ "action": "exit",
66
+ "ms": 7, # 耗时(必需)
67
+ "status": "error", # ok / error(必需)
68
+ # 失败时补充错误信息 + 上下文
69
+ "error_code": -32603,
70
+ "error_msg": "AID cert not found",
71
+ "peer_aid": "yayi2000.agentid.pub", # 失败相关的关键上下文
72
+ "method": "v2.put_peer_pk",
73
+ # 成功时补充关键结果(可选)
74
+ "found": false, # CA 查询结果
75
+ "delivered_count": 2, # Message 发送结果
76
+ }
77
+ ```
78
+
79
+ **设计原则:**
80
+ - **Enter span 承载完整上下文**,方便定位问题根因
81
+ - **Exit span 关注结果和性能**:
82
+ - 成功时:`ms`、`status=ok`、关键结果字段(found/delivered_count)
83
+ - 失败时:`ms`、`status=error`、`error_code`、`error_msg`、**失败相关的上下文字段**(aid/method/peer_aid 等)
84
+ - SDK 展示时,enter 行显示完整诊断信息,exit 行显示结果和耗时
85
+
86
+ #### 1.2 嵌套调用处理
87
+
88
+ 当 Message 调用 CA 时:
89
+ - Message 的 `_current_trace.child_spans` 自动收集 CA 的 enter/exit span
90
+ - Message exit 时,将 child_spans 合并到响应的 `_trace.spans` 列表
91
+ - SDK 收到后按 ts 排序,自动识别嵌套关系
92
+
93
+ #### 1.3 安全字段白名单
94
+
95
+ **允许放入 span:**
96
+ - ✅ aid、method、curve、lifecycle_state、found、error_code
97
+ - ✅ cert_sn 前缀(前 8 位)、route、namespace、instance_id
98
+ - ✅ group_id、member_count、delivered_count
99
+
100
+ **严格禁止:**
101
+ - ❌ token、私钥、证书 PEM、签名原文
102
+ - ❌ challenge nonce、密码、refresh_token
103
+
104
+ ---
105
+
106
+ ### 2. 各模块补充字段
107
+
108
+ #### 2.1 Gateway (relay.py)
109
+
110
+ **Enter span (`relay_in`):**
111
+ ```python
112
+ {
113
+ "node": "gateway",
114
+ "action": "enter",
115
+ "ts": <timestamp>,
116
+ # 详细诊断信息
117
+ "route": "service_plane", # direct / service_plane / kernel / fallback
118
+ "namespace": "message",
119
+ "method": "v2.put_peer_pk",
120
+ "aid": "yayi2000.agentid.pub",
121
+ "instance_id": "message#1", # service_plane 时有值
122
+ "connection_id": "conn-abc123",
123
+ "device_id": "device-xyz",
124
+ }
125
+ ```
126
+
127
+ **Exit span:**
128
+ ```python
129
+ {
130
+ "node": "gateway",
131
+ "action": "exit",
132
+ "ts": <timestamp>,
133
+ "ms": 10, # 耗时(必需)
134
+ "status": "error", # ok / error(必需)
135
+ # 失败时补充错误信息 + 上下文
136
+ "error_code": -32603,
137
+ "error_msg": "AID cert not found",
138
+ "method": "v2.put_peer_pk",
139
+ "aid": "yayi2000.agentid.pub",
140
+ }
141
+ ```
142
+
143
+ **修改位置:**
144
+ - `relay.py:844` — relay_in span 补字段
145
+ - `relay.py:962` — relay_out span 补字段
146
+
147
+ #### 2.2 Message (entry.py)
148
+
149
+ **Enter span:**
150
+ ```python
151
+ {
152
+ "node": "message",
153
+ "action": "enter",
154
+ "ts": <timestamp>,
155
+ # 详细诊断信息
156
+ "method": "v2.put_peer_pk",
157
+ "caller_aid": "yayi2000.agentid.pub",
158
+ "peer_aid": "yayi2000.agentid.pub",
159
+ "key_source": "peer_device_prekey",
160
+ "spk_id": "sha256:abc123ab",
161
+ "device_id": "device-xyz",
162
+ # 或按方法不同:
163
+ # "to_aid" / "from_aid" / "group_id" / "message_id"
164
+ }
165
+ ```
166
+
167
+ **Exit span:**
168
+ ```python
169
+ {
170
+ "node": "message",
171
+ "action": "exit",
172
+ "ts": <timestamp>,
173
+ "ms": 7, # 耗时(必需)
174
+ "status": "error", # ok / error(必需)
175
+ # 失败时补充错误信息 + 上下文
176
+ "error_code": -32603,
177
+ "error_msg": "AID cert not found",
178
+ "method": "v2.put_peer_pk",
179
+ "peer_aid": "yayi2000.agentid.pub",
180
+ # 成功时补充关键结果
181
+ "found": true, # bootstrap 方法
182
+ "delivered_count": 2, # send 方法
183
+ "message_id": "msg-xyz",
184
+ }
185
+ ```
186
+
187
+ **修改位置:**
188
+ - `entry.py:199-268` — `_TracingWS` 类改造
189
+ - `__init__` 记录 enter 时间
190
+ - `_inject_trace` 改成生成 enter + exit 两个 span
191
+ - enter span 从 `params` 提取业务字段
192
+ - exit span 从 `payload` 提取 status/error
193
+
194
+ #### 2.3 Auth (entry.py)
195
+
196
+ **Enter span:**
197
+ ```python
198
+ {
199
+ "node": "auth",
200
+ "action": "enter",
201
+ "ts": <timestamp>,
202
+ # 详细诊断信息
203
+ "method": "verify", # 或 login_phase1 / login_phase2 / create_aid
204
+ "aid": "yayi2000.agentid.pub",
205
+ "auth_method": "aid", # pairing_code / kite_token / aid
206
+ "device_id": "device-xyz",
207
+ "client_nonce": "nonce-abc...", # 前 16 位
208
+ }
209
+ ```
210
+
211
+ **Exit span:**
212
+ ```python
213
+ {
214
+ "node": "auth",
215
+ "action": "exit",
216
+ "ts": <timestamp>,
217
+ "ms": 15, # 耗时(必需)
218
+ "status": "ok", # ok / error(必需)
219
+ # 成功时补充
220
+ "success": true, # verify 方法
221
+ "created": false, # create_aid 方法(幂等标识)
222
+ # 失败时补充
223
+ "error_code": -32001,
224
+ "error_msg": "invalid signature",
225
+ }
226
+ ```
227
+
228
+ **修改位置:**
229
+ - Auth 模块当前没有 `_TracingWS` 封装,需要新增或复用 Message 的模式
230
+
231
+ #### 2.4 CA (entry.py)
232
+
233
+ **Enter span:**
234
+ ```python
235
+ {
236
+ "node": "ca",
237
+ "action": "enter",
238
+ "ts": <timestamp>,
239
+ # 详细诊断信息
240
+ "method": "get_cert",
241
+ "aid": "yayi2000.agentid.pub",
242
+ "curve": "P-256",
243
+ "lifecycle_state": "active_signing",
244
+ "cert_sn": "abc123...", # 按序列号查询时
245
+ "cert_fingerprint": "sha256:abc123ab...", # 按指纹查询时(前 16 位)
246
+ }
247
+ ```
248
+
249
+ **Exit span:**
250
+ ```python
251
+ {
252
+ "node": "ca",
253
+ "action": "exit",
254
+ "ts": <timestamp>,
255
+ "ms": 2, # 耗时(必需)
256
+ "status": "ok", # ok / error(必需)
257
+ # 成功时补充
258
+ "found": true,
259
+ "cert_sn_prefix": "abc123ab", # 找到时返回前 8 位
260
+ "lifecycle_state": "active_signing",
261
+ # 失败时补充错误信息 + 上下文
262
+ "found": false,
263
+ "error_code": -32002,
264
+ "error_msg": "certificate not found",
265
+ "method": "get_cert",
266
+ "aid": "yayi2000.agentid.pub",
267
+ "curve": "P-256",
268
+ }
269
+ ```
270
+
271
+ **修改位置:**
272
+ - CA 模块当前没有 `_TracingWS` 封装,需要新增
273
+
274
+ #### 2.5 Group (entry.py)
275
+
276
+ **Enter span:**
277
+ ```python
278
+ {
279
+ "node": "group",
280
+ "action": "enter",
281
+ "ts": <timestamp>,
282
+ # 详细诊断信息
283
+ "method": "create",
284
+ "group_id": "group-abc123",
285
+ "caller_aid": "alice.aid.com",
286
+ "member_aids": ["alice.aid.com", "bob.aid.com", "carol.aid.com"], # 或 member_count
287
+ "group_name": "Project Team",
288
+ }
289
+ ```
290
+
291
+ **Exit span:**
292
+ ```python
293
+ {
294
+ "node": "group",
295
+ "action": "exit",
296
+ "ts": <timestamp>,
297
+ "ms": 12, # 耗时(必需)
298
+ "status": "ok", # ok / error(必需)
299
+ # 成功时补充
300
+ "group_id": "group-abc123",
301
+ "member_count": 3,
302
+ # 失败时补充错误信息 + 上下文
303
+ "error_code": -32603,
304
+ "error_msg": "member not found",
305
+ "method": "create",
306
+ "caller_aid": "alice.aid.com",
307
+ }
308
+ ```
309
+
310
+ **修改位置:**
311
+ - Group 模块当前没有 `_TracingWS` 封装,需要新增
312
+
313
+ ---
314
+
315
+ ### 3. SDK 展示改造(Python)
316
+
317
+ #### 3.1 目标效果
318
+
319
+ ```
320
+ [TRACE][message.v2.put_peer_pk][error] total=54ms trace_id=93643d8d922d3d49a86345b8c267c178
321
+ ├─ sdk.send @00:24:29.197
322
+ ├─ gateway.enter route=service_plane namespace=message @00:24:29.378
323
+ ├─ message.enter method=v2.put_peer_pk peer_aid=yayi2000.agentid.pub @00:24:29.380
324
+ │ ├─ ca.enter method=get_cert aid=yayi2000.agentid.pub curve=P-256 lifecycle=active_signing @00:24:29.382
325
+ │ └─ ca.exit status=not_found found=false dur=2ms @00:24:29.384
326
+ ├─ message.exit status=error error_code=-32603 error="AID cert not found" dur=7ms @00:24:29.387
327
+ ├─ gateway.exit status=error dur=10ms @00:24:29.388
328
+ └─ sdk.recv dur=54ms
329
+ ```
330
+
331
+ #### 3.2 实现要点
332
+
333
+ **树状结构识别:**
334
+ 1. 按 `ts` 排序所有 span
335
+ 2. 维护栈:遇到 `action=enter` 入栈,遇到 `action=exit` 出栈
336
+ 3. 栈深度决定缩进层级
337
+ 4. exit span 展示 duration(从对应 enter span 计算)
338
+
339
+ **字段展示规则:**
340
+ - enter span:展示关键业务字段(aid、method、route 等)
341
+ - exit span:展示结果字段(status、found、error_code、dur)
342
+ - 单行最多展示 3-4 个关键字段,避免过长
343
+
344
+ **向后兼容:**
345
+ - 旧格式 `action=process`:按单行展示,dur 直接取 `ms` 字段
346
+ - 新格式 enter/exit:按树状展示
347
+ - 混合格式:分别处理
348
+
349
+ **修改位置:**
350
+ - `python/src/aun_core/transport.py:268-281` — `_trace_observer` 回调
351
+ - 新增 `_format_trace_tree(spans)` 函数,返回多行字符串
352
+
353
+ ---
354
+
355
+ ### 4. 实现计划
356
+
357
+ #### Phase 1: 服务端 span 结构改造
358
+
359
+ **Task 1.1: Message 模块 enter/exit span**
360
+ - 修改 `_TracingWS` 类,改造 `_inject_trace` 方法
361
+ - enter span 从 `params` 提取 `method`、`caller_aid`、`peer_aid`/`to_aid`/`group_id`
362
+ - exit span 从 `payload` 提取 `status`、`error_code`、`found`/`delivered_count`
363
+ - 测试:`message.v2.put_peer_pk` 失败时 trace 包含 `peer_aid` 和 `error_code`
364
+
365
+ **Task 1.2: CA 模块 enter/exit span**
366
+ - 新增 `_TracingWS` 封装(复用 Message 模式)
367
+ - enter span 提取 `aid`、`cert_sn`、`curve`、`lifecycle_state`
368
+ - exit span 提取 `found`、`cert_sn_prefix`(前 8 位)
369
+ - 测试:`ca.get_cert` 查询失败时 trace 包含 `aid` 和 `found=false`
370
+
371
+ **Task 1.3: Auth 模块 enter/exit span**
372
+ - 新增 `_TracingWS` 封装
373
+ - enter span 提取 `method`、`aid`、`auth_method`
374
+ - exit span 提取 `success`、`created`
375
+ - 测试:`auth.verify` 失败时 trace 包含 `aid` 和 `auth_method`
376
+
377
+ **Task 1.4: Group 模块 enter/exit span**
378
+ - 新增 `_TracingWS` 封装
379
+ - enter span 提取 `method`、`group_id`、`caller_aid`、`member_count`
380
+ - exit span 提取 `group_id`、`member_count`
381
+ - 测试:`group.create` 成功时 trace 包含 `group_id` 和 `member_count`
382
+
383
+ **Task 1.5: Gateway relay span 补字段**
384
+ - `relay_in` span 补充 `route`、`namespace`、`method`、`aid`、`instance_id`
385
+ - `relay_out` span 补充 `status`、`error_code`
386
+ - 测试:service_plane 路由时 trace 包含 `route=service_plane` 和 `instance_id`
387
+
388
+ #### Phase 2: SDK 展示改造
389
+
390
+ **Task 2.1: 树状展示逻辑**
391
+ - 新增 `_format_trace_tree(spans)` 函数
392
+ - 按 `ts` 排序,维护栈识别嵌套
393
+ - enter/exit 配对,exit 时计算 duration
394
+ - 返回多行字符串(带缩进)
395
+
396
+ **Task 2.2: 字段展示规则**
397
+ - enter span:展示 `method`、`aid`、`route` 等关键字段
398
+ - exit span:展示 `status`、`found`、`error_code`、`dur`
399
+ - 单行最多 3-4 个字段
400
+
401
+ **Task 2.3: 向后兼容**
402
+ - 识别旧格式 `action=process`,按单行展示
403
+ - 混合格式分别处理
404
+
405
+ **Task 2.4: 集成到 transport.py**
406
+ - 修改 `_trace_observer` 回调,调用 `_format_trace_tree`
407
+ - 输出到日志(`self._log.info`)
408
+
409
+ #### Phase 3: 测试验证
410
+
411
+ **Task 3.1: 单元测试**
412
+ - `test_trace_span_enter_exit.py` — 验证 enter/exit span 生成
413
+ - `test_trace_tree_format.py` — 验证 SDK 树状展示
414
+
415
+ **Task 3.2: 集成测试**
416
+ - 运行 `python -X utf8 tests/integration_test_e2ee.py`
417
+ - 验证 `message.v2.put_peer_pk` 失败时 trace 包含完整诊断信息
418
+ - 验证嵌套调用(message → ca)的 span 正确合并
419
+
420
+ **Task 3.3: 手动测试**
421
+ - `aun login yayi2000.agentid.pub` 触发 `put_peer_pk` 失败
422
+ - 检查日志输出是否包含 `peer_aid`、`ca.enter`、`found=false`、`error_code`
423
+
424
+ ---
425
+
426
+ ### 5. 向后兼容
427
+
428
+ **旧 SDK 收到新 span:**
429
+ - 忽略不认识的字段(`action=enter/exit`、业务字段)
430
+ - 仍能展示基本路径和耗时
431
+
432
+ **新 SDK 收到旧 span:**
433
+ - 识别 `action=process`,按单行展示
434
+ - 不影响现有功能
435
+
436
+ **trace mode 不变:**
437
+ - 仍为 `off/log/diag` 三档
438
+ - 不引入新模式
439
+
440
+ ---
441
+
442
+ ### 6. 安全审查
443
+
444
+ **禁止字段清单:**
445
+ - token、refresh_token、access_token
446
+ - 私钥(private_key、priv、secret)
447
+ - 证书 PEM(cert_pem、cert、certificate)
448
+ - 签名原文(signature、sig_raw)
449
+ - challenge nonce、密码(password、pwd)
450
+
451
+ **允许字段清单:**
452
+ - aid、method、curve、lifecycle_state
453
+ - found、error_code、error_msg(不含敏感信息)
454
+ - cert_sn 前缀(前 8 位)
455
+ - route、namespace、instance_id
456
+ - group_id、member_count、delivered_count
457
+
458
+ **审查机制:**
459
+ - 代码审查时检查所有 span 字段来源
460
+ - 禁止直接 `span.update(params)` 全量复制
461
+ - 必须显式白名单提取
462
+
463
+ ---
464
+
465
+ ### 7. 性能影响
466
+
467
+ **额外开销:**
468
+ - 每个 RPC 多生成 1 个 span(enter + exit 共 2 个,原来 1 个)
469
+ - 每个 span 增加 3-5 个业务字段(约 50-100 字节)
470
+ - SDK 展示增加树状格式化(O(n log n) 排序 + O(n) 遍历)
471
+
472
+ **预估影响:**
473
+ - diag 模式下单次 RPC 增加 ~200 字节网络传输
474
+ - SDK 格式化耗时 <1ms(100 个 span 以内)
475
+ - 对 off/log 模式无影响(不生成 span)
476
+
477
+ **优化措施:**
478
+ - span 数量上限保持 32 个(已有限制)
479
+ - 字段值截断(error_msg 最多 200 字符)
480
+ - 仅 diag 模式生成详细字段
481
+
482
+ ---
483
+
484
+ ## 实施顺序
485
+
486
+ 1. **Phase 1.1-1.2**:Message + CA(最高优先级,覆盖 80% 失败场景)
487
+ 2. **Phase 2**:SDK 展示改造(让 Phase 1 的字段可见)
488
+ 3. **Phase 3.2-3.3**:集成测试 + 手动验证
489
+ 4. **Phase 1.3-1.5**:Auth + Group + Gateway(补全剩余模块)
490
+ 5. **Phase 3.1**:单元测试(回归保护)
491
+
492
+ ---
493
+
494
+ ## 成功标准
495
+
496
+ **功能完整性:**
497
+ - ✅ `message.v2.put_peer_pk` 失败时,trace 包含 `peer_aid` 和 `ca.get_cert` 的 `found=false`
498
+ - ✅ `ca.get_cert` 查询失败时,trace 包含 `aid`、`curve`、`lifecycle_state`
499
+ - ✅ SDK 展示为树状结构,嵌套调用正确缩进
500
+ - ✅ enter/exit span 配对,exit 展示 duration
501
+
502
+ **向后兼容:**
503
+ - ✅ 旧 SDK 收到新 span 不报错
504
+ - ✅ 新 SDK 收到旧 span 降级展示
505
+
506
+ **安全合规:**
507
+ - ✅ 所有 span 字段通过白名单审查
508
+ - ✅ 不包含 token、私钥、证书 PEM、签名原文
509
+
510
+ **性能可接受:**
511
+ - ✅ diag 模式下单次 RPC 增加传输 <500 字节
512
+ - ✅ SDK 格式化耗时 <5ms
513
+
514
+ ---
515
+
516
+ ## 风险与缓解
517
+
518
+ **风险 1:span 数量爆炸**
519
+ - 缓解:保持 32 个上限,超出时截断最早的 span
520
+
521
+ **风险 2:敏感信息泄露**
522
+ - 缓解:代码审查 + 白名单机制 + 单元测试覆盖
523
+
524
+ **风险 3:向后兼容性破坏**
525
+ - 缓解:旧 SDK 忽略新字段,新 SDK 识别旧格式
526
+
527
+ **风险 4:性能回退**
528
+ - 缓解:仅 diag 模式生成详细字段,off/log 模式不变
529
+
530
+ ---
531
+
532
+ ## 后续扩展
533
+
534
+ **Phase 4(可选):**
535
+ - 其他语言 SDK(Go/TS/JS/C++)展示改造
536
+ - 其他服务模块(Storage/Stream/Mail)span 补全
537
+ - Trace 聚合分析工具(按 trace_id 查询完整链路)
538
+
539
+ **Phase 5(可选):**
540
+ - Trace 持久化(写入 ClickHouse/Elasticsearch)
541
+ - Trace 可视化(Web UI 展示调用树)
542
+ - Trace 告警(失败率/耗时异常自动通知)