ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Qdrant 新增 REST 端点后如何更新 OpenAPI 规范?从 ytt 文件到 redoc 验证的完整流程

Qdrant 新增 REST 端点后如何更新 OpenAPI 规范?从 ytt 文件到 redoc 验证的完整流程 Qdrant 新增 REST 端点后如何更新 OpenAPI 规范从 ytt 文件到 redoc 验证的完整流程【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant在 Qdrant 的 Rust 代码里新增或修改了一个 REST 端点后光改代码是不够的Qdrant 用 OpenAPI 规范描述 API规范要求“API 变更必须同步到规范文件且由 CI 强制检查”见 docs/DEVELOPMENT.md 的API changes → REST一节。如果不同步test-consistencyCI 任务会跑 tests/openapi_consistency_check.sh 重新生成规范并与仓库中已提交的文件做 diff有差异就直接失败。这篇文章走一遍完整路径从在openapi/*.ytt.yaml里写端点定义、在src/schema_generator.rs里登记模型到运行tools/generate_openapi_models.sh生成规范、用 redoc 页面人工验证最后跑集成测试确认行为。适用前提你在本地 clone 了 qdrant 仓库机器上有 Rust 工具链cargo、jq和 Docker生成脚本会构建并运行两个镜像ytt/yq未安装时脚本自动回退到 Docker 版本。规范文件由哪些部分组成先看清楚生成脚本 tools/generate_openapi_models.sh 的数据流后面每步修改的文件就都对应上了端点定义openapi/*.ytt.yaml如 openapi/openapi-service.ytt.yaml使用 openapi/openapi.lib.yml 提供的 ytt 辅助函数response、reference、type、array等描述路径、参数和响应模型定义src/schema_generator.rs中的AllDefinitions结构体通过schemars把 Rust 类型转成 JSON Schema输出openapi/schemas/AllDefinitions.json再由tools/schema2openapi容器转成openapi/models.yaml合并脚本把 9 个openapi-*.yaml和models.yaml合并为openapi/openapi-merged.yaml/openapi-merged.json并拷贝到 docs/redoc/master/openapi.json——这就是 redoc 页面加载的文件也是 CI 一致性检查比对的目标。第一步实现 Rust 端点与模型按照 DEVELOPMENT.md 的第 1 步先在 Rust 代码里完成端点和模型lib/api下的 REST 模型、src/actix/api下的路由。模型类型会被AllDefinitions引用所以最终要能进 OpenAPI 组件表。第二步修改openapi/*.ytt.yaml添加端点端点按功能归属到对应的 ytt 文件openapi-main、openapi-collections、openapi-points、openapi-service、openapi-cluster、openapi-quotas、openapi-snapshots、openapi-shards、openapi-shard-snapshots生成脚本对每个文件逐一执行ytt。文件开头统一加载公共库# load(openapi.lib.yml, response, reference, type, array)下面是 openapi/openapi-service.ytt.yaml 中现有GET /端点的原文示例可以照这个结构新增路径、operationId、tags和响应paths: /: get: summary: Returns information about the running Qdrant instance description: Returns information about the running Qdrant instance like version and commit id operationId: root tags: - Service responses: 200: description: Qdrant server version information content: application/json: schema: $ref: #/components/schemas/VersionInfo 4XX: description: error第三步在src/schema_generator.rs登记新模型src/schema_generator.rs 里有一个#[derive(Serialize, JsonSchema)]的AllDefinitions结构体每个字段对应一个要导出到components/schemas的 Rust 类型#[derive(Serialize, JsonSchema)] struct AllDefinitions { a1: CollectionsResponse, a2: CollectionInfo, // ... 现有字段 ... br: segment::data_types::vector_name_config::VectorNameConfig, bs: QuotaStatus, }如果你的新端点引入了新的请求/响应模型就在该结构体里加一个字段字段名如a*/b*只是编号习惯类型必须实现schemars::JsonSchema。已有模型如VersionInfo、Usage已登记无需重复添加。第四步运行生成脚本在仓库根目录执行./tools/generate_openapi_models.sh脚本内部依次做这些动作脚本有set -e任一步失败会立即退出检查本地ytt没有则用gerritk/ytt镜像执行对 9 个openapi-*.ytt.yaml逐个生成openapi/*.yamlcargo run --package qdrant --featuresservice_debug --bin schema_generator生成openapi/schemas/AllDefinitions.jsondocker build tools/schema2openapi并用容器把 JSON Schema 转成openapi/models.json再用yq转成models.yaml本地无yq时回退到mikefarah/yq镜像合并所有文件为openapi/openapi-merged.yaml然后用redocly/openapi-cli:v1.0.0-beta.88容器执行lint openapi-merged.yaml——lint 不过脚本会失败这是第一道机器校验转成 JSON 并cp到docs/redoc/master/openapi.json。副作用说明该脚本会构建本地 Docker 镜像schema2openapi、拉取/运行上述容器并覆盖写入openapi/目录下全部生成文件和docs/redoc/master/openapi.json——这些文件本身就是需要随代码一起提交的产物属于预期行为。前置依赖Docker、cargo、jq脚本最后一步用jq格式化没有本地回退CI 里是用apt-get install -y clang jq装的本地需自行保证jq可用。第五步redoc 页面验证按 DEVELOPMENT.md 的 6、7 步在docs/redoc目录下起一个静态文件服务python -m http.server然后浏览器打开http://localhost:8000/?vmaster。?vmaster参数不能省docs/redoc/default_version.js 里默认版本是v1.18.x不带参数加载的是历史版本快照只有?vmaster才加载刚生成的 docs/redoc/master/openapi.json。检查点新增端点出现在对应 tag 分组下、请求参数和响应模型渲染正确。DEVELOPMENT.md 的第 8 步建议再把openapi-merged.yaml贴进 Swagger Editor 做一次可视化校验确认无告警。第六步更新并运行集成测试DEVELOPMENT.md 第 5 步要求在 tests/openapi 下更新或新增对应测试然后运行uv --project tests run pytest tests/openapi前置条件本地有一个可访问的 Qdrant 实例在localhost:6333测试通过 HTTP 直接打本地服务参考 tests/integration-tests.shCI 的做法是先启动./target/debug/qdrant再跑 pytest。uv未安装时先按 DEVELOPMENT.md 的本地开发一节安装。别忘了metrics 白名单与端点总数DEVELOPMENT.md 的System integration一节指出新增端点还要把新端点加进src/common/metrics.rs的 metrics 白名单JWT 相关改动需要过tests/auth_tests。这一点和一致性检查脚本直接挂钩tests/openapi_consistency_check.sh 除了比对生成结果与仓库文件通过则输出 No diffs found.还会统计openapi.json中路径总数并与脚本内的EXPECTED_NUMBER_OF_APIS当前仓库中为69比较。数量不符时脚本给出的处理建议是确认新端点在 metrics 端点的白名单REST_ENDPOINT_WHITELIST/GRPC_ENDPOINT_WHITELIST中配置正确一致性恢复后更新脚本里的EXPECTED_NUMBER_OF_APIS。CI 侧的验收本地全部通过后integration-tests工作流的test-consistency任务会以同样的方式复核构建schema2openapi镜像、装好clang/jq与 protoc 后执行./tests/openapi_consistency_check.sh。它先把docs/redoc/master/openapi.json复制为.diff.openapi.json重新运行tools/generate_openapi_models.sh再diff两者——所以生成文件必须提交而不是只在本地跑一遍。限制说明生成脚本强依赖 Dockerschema2openapi镜像构建和 redocly lint 都在容器里执行无 Docker 环境无法完成第 4 步。EXPECTED_NUMBER_OF_APIS 69是当前脚本中的固定值每新增端点都要同步更新否则即使 diff 一致也会因数量检查失败。本文只覆盖 REST 规范链路gRPC 侧lib/api/src/grpc/proto/*.proto与tests/basic_grpc_test.sh是 DEVELOPMENT.md 中另一条独立流程不在本任务范围内。【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进