fix(java): 部署级字段兜底、community 跨请求串染 + ObsFilter 测试覆盖 - #9
Conversation
1. 无兜底:新增 internal/Env 三级解析(显式参数 > OBS_* > 内置默认),
ObsSdkConfig 在构造时即完成解析,四个部署级字段取值恒非空。
此前 fromEnvironment() 直接读 getenv,未配置时为 null —— 日志 provider 对空值
省略该键,service/env/instance/community 会整条从 JSON 里消失;指标侧
community 为 null 时 Tag.of 直接 NPE,service/env/instance 为 null 时
commonTags 被整段跳过。契约见 spec/common-fields.md「静态字段来源与默认值」。
2. clearRequestScope() 漏清 community:MDC 是线程本地的,web 容器请求线程复用,
残留的上一个请求覆盖值会串给同线程后续的定时任务/异步日志,不报错。
改为复位为部署默认(而非删除 —— 删除会连部署默认一起丢,字段整个消失)。
3. 测试覆盖:新增 ObsFilterTest(request_id 沿用/生成、resolver 回退、
作用域与 MDC 清理、异常穿透)与 internal/EnvTest;另补 6 条回归断言,
全部落在真实 JSON / 指标文本输出上而非 MDC 中间变量。
回归验证:6 条新断言在修复前的实现上全部失败,输出即为缺陷本身 ——
{"time":...,"level":"info","msg":"job done","logger":...} 四字段消失
"community":"mindspore" cron 日志串染
events_total 1.0 指标无任何 label
java UT 19 → 38,mvn test 全绿。
Welcome To opensourceways CommunityHey @TangJia025 , thanks for your contribution to the community. Bot Usage ManualI'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands. Contact GuideIf you have any questions, please contact the SIG: infratructure , |
CLA Signature PassTangJia025, thanks for your pull request. All authors of the commits have signed the CLA. 👍 |
Linking Issue Notice@TangJia025 , the pull request must be linked to at least one issue. |
承接 #1(feat/2061-sdk-impl)合入后的 Java 侧缺陷修复,对应 #1938 / 子任务 #2061。
1. 部署级字段缺后两级回退(无兜底)
ObsSdkConfig.fromEnvironment()此前直接System.getenv(),未配置时为null:service/env/instance/community整条从 JSON 里消失(而不是显示unknown),采集侧按字段建索引会静默漏数;community为null时Tag.of直接 NPE;service/env/instance为null时commonTags被整段跳过 → 同一份大盘查询,Java 服务比 Go 服务少几个 label。改为新增 Env.java 实现三级解析(对齐 Go 侧
go/internal/env),ObsSdkConfig构造时即完成解析,四个字段取值恒非空:契约依据:spec/common-fields.md 的「静态字段来源与默认值」——spec 无改动,本次是把实现对齐到既有契约。
2.
clearRequestScope()漏清 community → 跨请求串染(真 bug)MDC 是线程本地的,而 web 容器的请求线程是复用的。
clearRequestScope()只清了request_id/trace_id/span_id,community停留在上一个请求的覆盖值上,串给同线程后续打出的日志(定时任务 / 异步回调),且不报错 —— 按 community 的聚合与告警会失真。改为复位为部署默认,而不是删除:删掉会连部署默认一起丢,字段又整个消失(回到问题 1)。
3. ObsFilter 零测试覆盖
新增 ObsFilterTest.java(
java.lang.reflect.Proxy造 servlet 替身,不引入 mock 框架)+ EnvTest.java,并补 6 条回归断言:X-Request-Id沿用 / 缺省生成 /trace_id不主动生成;null或缺省时回退部署默认;RequestContext;断言全部落在真实 JSON / 指标文本输出上(真跑 logback encoder 与 Micrometer scrape),而不是 MDC 中间变量。
回归验证
6 条新断言在修复前的实现上全部失败,失败输出即缺陷本身:
java UT 19 → 38,
mvn test全绿(与 CI 的java: mvn -B test一致)。遗留(未在本次改动内,待确认)
docs/进度追踪.md第 19 行仍记着「存在无兜底缺陷」,设计文档 §4.2.4 的已知问题表同理 —— 属你手工维护的文档,未擅自改动;distributionManagement;http_server_requests_seconds)与 spec 里的obs_http_server_requests_total存在并存/冲突,需拍板。🤖 Generated with Claude Code
AI 使用声明
当前 PR 是否有 AI 参与:
docs/进度追踪.md记录的「无兜底缺陷」与代码审查中发现的clearRequestScope串染问题触发