Skip to content

GET /analytics/meta 的已声明响应契约与实际响应不是同一个形状(data: { cubes: CubeSchema[] } vs data: CubeMeta[] #6442

Description

@hotlong

在实现 #6369/analytics/query 响应示例的 fields[] 键集)时,为核实「display name / format 由 GET /analytics/meta 暴露」这句话而顺带查到。按 Prime Directive #10 独立立单,不搭 #6369 那个 docs PR(#6441)的车 —— 那张卡的评审面是 /analytics/query 的响应示例,本条是 /analytics/meta 的响应形状,两件事;而且本条的修复面在 packages/**#6369 明确不动。

未自我认领。

事实面(实测,file:line)

声明侧 —— 路由表为该端点指定的响应 schema:

  • packages/spec/src/api/plugin-rest-api.zod.ts:1230GET /metaresponseSchema: 'AnalyticsMetadataResponseSchema'
  • packages/spec/src/api/analytics.zod.ts:94-99 — 该 schema 声明 data: z.object({ cubes: z.array(CubeSchema) }),即 一个对象,带 cubes 键,元素是完整的 CubeSchema
  • content/docs/references/api/analytics.mdx:49 — 由上面这个 schema 生成并已发布的参考页照印:data{ cubes: { name: string; title?: string; description?: string; sql: string; … }[] }

实际侧 —— 运行时真正返回的:

  • packages/runtime/src/domains/analytics.ts:110-117subPath === 'meta' && m === 'GET'const result = await analyticsService.getMeta(cube); return deps.success(result)
  • packages/services/service-analytics/src/analytics-service.ts:1184-1204getMeta 返回 CubeMeta[]一个裸数组
  • packages/spec/src/contracts/analytics-service.ts:89-99CubeMeta 是更窄的投影:{ name, title?, measures: Array< { name, type, title? } >, dimensions: Array< { name, type, title? } > }
  • 第二个实现同形:packages/drivers/driver-memory/src/memory-analytics.ts:504-522

也就是说,按已发布契约写的客户端读 data.cubes 拿到的是 undefined(实际 data 本身就是数组),拿 AnalyticsMetadataResponseSchema 去 parse 会直接失败。

顺带的第二个后果:metric 的 format 没有任何读端点暴露

MetricSchema.formatpackages/spec/src/data/analytics.zod.ts:72)被 packages/services/service-analytics/src/dataset-compiler.ts:381 写入编译出的 cube metric,但 getMetaCubeMeta 投影只保留 { name, type, title } —— format(以及 sql / filters / description)在投影里被丢弃。

这正是 #6441 里那处「对分诊措辞的实测修正」的来源:分诊原句说 display name 与 format 都「由 GET /analytics/meta 暴露」,实测只有 label(映射为 title)到得了线上,format 到不了#6441 因此只对 label 那半句写进了文档。

影响 / 修法方向(不自行选)

两个方向对称度不高,需要裁定:

  • (a) 收窄声明:把 AnalyticsMetadataResponseSchema 改成实际形状(data: CubeMeta[])。零运行时改动,契约照实描述;代价是承认 /analytics/meta 只发投影,format 等键继续不可达。
  • (b) 放宽实现:让 getMeta 按已声明的 { cubes: CubeSchema[] } 返回完整 cube 定义。这会扩大该端点的输出面(把 sql 也发到客户端),属能力扩张,按启动期聚焦原则应先问有没有真实消费方拉动。

⚠️ 严重性我不自评:data-api.mdx:393-395 的手写描述其实贴近实际形状(说 data 是数组),只有 spec schema 和由它生成的 references/ 参考页是错的;一个只读手写页的读者不会撞上,一个照生成参考页或照 schema 写类型的读者会。这两种读者哪个是今天的真实用户,由分诊判定。

查重

搜过本仓 open issue:analytics meta cubes response schema / AnalyticsMetadataResponseSchema / CubeMeta / getMeta cube metadata format label / "analytics/meta" —— 除 #6369 本身外无同题单。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions