Skip to content

fix(java): 部署级字段兜底、community 跨请求串染 + ObsFilter 测试覆盖 - #9

Merged
TangJia025 merged 1 commit into
mainfrom
fix/2061-java-env-fallback
Sep 17, 2026
Merged

TangJia025 merged 1 commit into
mainfrom
fix/2061-java-env-fallback

Conversation

@TangJia025

Copy link
Copy Markdown
Contributor

承接 #1(feat/2061-sdk-impl)合入后的 Java 侧缺陷修复,对应 #1938 / 子任务 #2061。

1. 部署级字段缺后两级回退(无兜底)

ObsSdkConfig.fromEnvironment() 此前直接 System.getenv(),未配置时为 null

  • 日志:provider 对空值省略该键 → service/env/instance/community 整条从 JSON 里消失(而不是显示 unknown),采集侧按字段建索引会静默漏数;
  • 指标communitynullTag.of 直接 NPE;service/env/instancenullcommonTags 被整段跳过 → 同一份大盘查询,Java 服务比 Go 服务少几个 label。

改为新增 Env.java 实现三级解析(对齐 Go 侧 go/internal/env),ObsSdkConfig 构造时即完成解析,四个字段取值恒非空:

显式参数  >  OBS_* 环境变量  >  内置默认(service/env/community = "unknown",instance = hostname)

契约依据:spec/common-fields.md 的「静态字段来源与默认值」——spec 无改动,本次是把实现对齐到既有契约。

2. clearRequestScope() 漏清 community → 跨请求串染(真 bug)

MDC 是线程本地的,而 web 容器的请求线程是复用的。clearRequestScope() 只清了 request_id/trace_id/span_idcommunity 停留在上一个请求的覆盖值上,串给同线程后续打出的日志(定时任务 / 异步回调),且不报错 —— 按 community 的聚合与告警会失真。

改为复位为部署默认,而不是删除:删掉会连部署默认一起丢,字段又整个消失(回到问题 1)。

3. ObsFilter 零测试覆盖

新增 ObsFilterTest.javajava.lang.reflect.Proxy 造 servlet 替身,不引入 mock 框架)+ EnvTest.java,并补 6 条回归断言:

  • X-Request-Id 沿用 / 缺省生成 / trace_id 不主动生成;
  • resolver 返回 null 或缺省时回退部署默认;
  • resolver 返回值同时写入 MDC 与 RequestContext
  • 请求结束后四个键的状态(含 community 复位);
  • 链路抛异常穿透时作用域与 MDC 仍被清理。

断言全部落在真实 JSON / 指标文本输出上(真跑 logback encoder 与 Micrometer scrape),而不是 MDC 中间变量。

回归验证

6 条新断言在修复前的实现上全部失败,失败输出即缺陷本身:

{"time":"...","level":"info","msg":"job done","logger":"ObsJsonProviderTest.java:170"}   ← 四个字段消失
"community":"mindspore"                                                                   ← cron 日志串染
events_total 1.0                                                                          ← 指标无任何 label

java UT 19 → 38mvn test 全绿(与 CI 的 java: mvn -B test 一致)。

遗留(未在本次改动内,待确认)

  • docs/进度追踪.md 第 19 行仍记着「存在无兜底缺陷」,设计文档 §4.2.4 的已知问题表同理 —— 属你手工维护的文档,未擅自改动;
  • Java 制品怎么让 6 个目标服务消费(JitPack / GitHub Packages / 私服)尚未定,仓库无 tag 也无 distributionManagement
  • 服务端 HTTP 指标命名:SDK 走 Actuator 官方 instrumentation(http_server_requests_seconds)与 spec 里的 obs_http_server_requests_total 存在并存/冲突,需拍板。

🤖 Generated with Claude Code

AI 使用声明

当前 PR 是否有 AI 参与:

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 全绿。
@opensourceways-bot

Copy link
Copy Markdown

Welcome To opensourceways Community

Hey @TangJia025 , thanks for your contribution to the community.

Bot Usage Manual

I'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 Guide

If you have any questions, please contact the SIG: infratructure ,
and any of the maintainers: @GeorgeCao-hw, @TangJia025, @pkking, @zhongjun2 ,
and any of the committers: @GeorgeCao-hw, @TangJia025, @pkking, @zkhzkhz .

@opensourceways-bot

Copy link
Copy Markdown

CLA Signature Pass

TangJia025, thanks for your pull request. All authors of the commits have signed the CLA. 👍

@opensourceways-bot

Copy link
Copy Markdown

Linking Issue Notice

@TangJia025 , the pull request must be linked to at least one issue.
If an issue has already been linked, but the needs-issue label remains, you can remove the label by commenting /check-issue .

@TangJia025
TangJia025 merged commit 9ed2b96 into main Sep 17, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants