OpenMetadata REST API 服务连接器完全指南:从 OpenAPI Schema 到 API 集合与端点元数据
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
导读
本文围绕 OpenMetadata 的 REST API 服务连接器展开,它是 OpenMetadata 接入"任意暴露 OpenAPI 规范文档的 Web 服务"的统一入口。通过配置一个 OpenAPI Schema URL 和可选 Token,连接器即可解析该服务的 API 契约,自动生成 API Collection 与 API Endpoint 元数据,并进一步提取请求/响应 Schema,帮助团队在 OpenMetadata 中建立可检索、可治理的 API 数据目录。读完本文,你将掌握该连接器的连接参数语义、三种 OpenAPI Schema 来源的配置方式、元数据提取的底层流程,以及连接测试与过滤行为的源码级原理。
一、REST 连接器是什么
REST API Service 连接器(官方文档位于 openmetadata-ui 的 Rest.md 文档)是 OpenMetadata 中面向通用 REST API 服务的元数据采集源。它不针对某一具体厂商(如 Stripe、GitHub API),而是以 OpenAPI Specification(OAS)文档作为事实来源,只要你的 Web 服务对外暴露了符合 OpenAPI 规范的契约文件(通常是 JSON 格式),就能接入 OpenMetadata 进行元数据管理。
从源码结构看,该连接器由以下部分组成:
- 连接配置模型:restConnection.json(JSON Schema 定义,同时生成 Java 与 Python 模型);
- Python 连接处理器:connection.py;
- OpenAPI Schema 解析器:parser.py;
- 元数据采集主体:metadata.py。
它复用通用 API 服务的顶层拓扑(见 api_service.py),核心职责是从 OpenAPI 文档中派生出API Collection(集合)与API Endpoint(端点)两级实体。
二、Connection Details:核心连接参数
文档中给出的 Connection Details 只有两个必读参数,它们是连接器的"门槛"。下面结合源码逐一展开。
2.1 Open API Schema URL(openAPISchemaURL)
一个 OpenAPI schema URL 通常指 Web 服务托管 OpenAPI 规范(OAS)文档的地址。该文档定义了服务的 API,包括可用端点、请求/响应格式、认证方式等,通常是 JSON 格式。例如:
https://petstore3.swagger.io/api/v3/openapi.json
这是最常用的连接参数。从 restConnection.json 可以看到,该参数属于openAPISchemaConnection三选一(oneOf)配置之一:
| 配置项 | 类型 | 说明 |
|---|---|---|
openAPISchemaConnection | 必填(required) | OpenAPI Schema 来源,三选一:URL / 本地文件路径 / S3 |
token | 可选 | 访问受保护 schema 的认证令牌 |
docURL | 可选 | Schema 的文档链接,用于生成 Collection/Endpoint 的跳转 URL |
apiCollectionFilterPattern | 可选 | 按正则过滤 API Collection 名称 |
apiEndpointFilterPattern | 可选 | 按正则过滤 API Endpoint 名称 |
verifySSL/sslConfig | 可选 | 客户端 SSL 校验配置,默认no-ssl |
supportsMetadataExtraction | 布尔 | 是否支持元数据提取,默认true |
在 connection.py 的_get_client方法中,连接器会按类型分派:
- 若
openAPISchemaConnection是OpenAPISchemaURL(定义见 openAPISchemaURL.json),则通过requests.get直接拉取远程文档; - 若是
OpenAPISchemaFilePath(openAPISchemaFilePath.json),则读取本地文件; - 若是
OpenAPISchemaS3(openAPISchemaS3.json),则从 S3 下载。
实战建议:URL 应为可公网或内网直接访问的 JSON/YAML 文档地址;如果服务端的 schema 托管在需要认证的地址上,则必须配合token使用。OpenAPI 3.x 文档包含openapi字段,Swagger 2.0 文档包含swagger字段——两者均被支持(详见后文校验逻辑)。
2.2 Token(token)
用于连接 OpenAPI schema URL 的认证令牌。仅当 API schema 受保护或需要安全访问时才需要提供。
在 connection.py 中,Token 的注入方式为:
headers = {} if connection.token: headers["Authorization"] = f"Bearer {connection.token.get_secret_value()}" return requests.get(str(schema_conn.openAPISchemaURL), headers=headers, verify=verify)关键实现细节:
- Bearer 方案:Token 以
Authorization: Bearer <token>请求头携带,这是 OAuth2/OpenID 类保护下的常见做法。若你的 schema 服务使用其他认证(如 API Key 头、Basic Auth),则此参数不适用——该连接器目前仅实现 Bearer 方式。 - 敏感信息保护:
token在 JSON Schema 中声明为format: "password"(restConnection.json),因此 OpenMetadata 会将其作为密钥字段处理(Secret Manager 加密存储、API 返回时脱敏),读取时通过get_secret_value()还原。 - 可选性:仅当 schema 端点 401/403 时才需要;公开文档无需配置。
2.3 SSL 校验:一个容易被忽略的关联参数
虽然 UI 文档正文未展开,但verifySSL在 restConnection.json 中默认值为no-ssl。在 connection.py 中通过get_verify_ssl_fn解析,若配置了sslConfig(如自签名证书),会据此生成对应的 verify 参数;若解析结果为None则回退为True(即校验证书)。当你的 schema 托管在自签名 HTTPS 服务上时,应显式配置 SSL 校验策略,否则可能因证书不受信任导致拉取失败。
三、三种 OpenAPI Schema 来源:URL / 本地文件 / S3
UI 文档只展示了 URL 一种,但底层连接模型支持三种来源,这里一并给出完整配置语义(对应 JSON Schema 的 oneOf 约束,必须且只能选择其一):
3.1 远程 URL(推荐)
type: rest serviceConnection: config: type: Rest openAPISchemaConnection: openAPISchemaURL: https://petstore3.swagger.io/api/v3/openapi.json token: <可选,受保护时填写> docURL: https://petstore3.swagger.io/ verifySSL: no-ssl sourceConfig: config: type: ApiMetadata apiCollectionFilterPattern: excludes: [] apiEndpointFilterPattern: excludes: []openAPISchemaURL为必填且必须是 URI(format: "uri");- 拉取时使用
requests.get,支持content-type为 JSON 或 YAML 的响应。
3.2 本地文件路径
当网络不可达或 schema 文件位于执行 ingestion 的机器本地时,使用openAPISchemaFilePath:
openAPISchemaConnection: openAPISchemaFilePath: /opt/schemas/openapi.json解析逻辑见 parser.py:先检查文件存在且是普通文件,再根据扩展名(.json/.yaml/.yml)选择解析器,未知扩展名则先按 JSON 再按 YAML 兜底尝试。注意:这里的"本地"指运行 ingestion 工作流的容器/主机,而非 OpenMetadata 服务器。
3.3 S3 对象存储
schema 文件存放在 AWS S3 时,使用openAPISchemaS3URL+awsCredentials:
openAPISchemaConnection: openAPISchemaS3URL: https://bucket-name.s3.amazonaws.com/path/to/openapi_schema.json awsCredentials: awsAccessKeyId: <key> awsSecretAccessKey: <secret> awsRegion: us-east-1S3 URL 同时支持虚拟主机风格(https://bucket.s3.amazonaws.com/key)与路径风格(https://s3.amazonaws.com/bucket/key),解析与下载逻辑见 parser.py:通过AWSClient获取 S3 客户端,get_object拉取内容后按扩展名解析。openAPISchemaS3URL与awsCredentials均为必填。
四、连接测试:CheckURL 与 CheckSchema
在 OpenMetadata UI 中创建服务时执行的 "Test Connection",在 connection.py 中由两个步骤构成:
| 测试步骤 | 作用 | 失败行为 |
|---|---|---|
CheckURL | 校验 schema URL 可访问(HTTP 200) | 抛出SchemaURLError,提示检查 URL 与凭据 |
CheckSchema | 解析并校验内容是合法 OpenAPI 文档 | 抛出InvalidOpenAPISchemaError |
其中CheckSchema的校验规则(见 parser.py):
return schema.get("openapi") is not None or schema.get("swagger") is not None即:文档必须包含openapi(OpenAPI 3.x)或swagger(Swagger/OpenAPI 2.0)顶层字段,二者皆无则判定为非法 OpenAPI 规范。解析时若 JSON 与 YAML 均失败,会抛出OpenAPIParseError并给出明确错误信息。
边界说明:当使用本地文件(is_local_file=True)时,CheckURL步骤自动返回空(跳过),只执行 Schema 校验——因为本地文件没有"URL 可达性"可言。
五、元数据提取原理:从 OpenAPI 文档到 API 目录
REST 连接器的核心价值在于把 OpenAPI 契约"翻译"成 OpenMetadata 的两级 API 实体。入口类为 RestSource。
5.1 集合(API Collection)的派生
在_derive_collections(metadata.py)中,Collection 名称来源有三个:
- 文档根级
tags:OpenAPI 文档根部的tags数组(规范要求每个元素是带name的对象),直接映射为集合; default兜底集合:如果tags中不存在名为default的集合,会自动追加一个default集合,用于收纳没有任何 tag的端点;- 路径上的 tag 补全:遍历
paths下各 Operation 的tags字段,把只出现在操作中、未在根tags声明的名称补为集合。这里用sorted()保证每次重跑派生顺序一致(幂等)。
每个集合还会生成 URL:若配置了docURL,集合 URL 形如{docURL}/#/{collection_name};否则回退到openAPISchemaURL(见_generate_collection_url,metadata.py)。
5.2 端点(API Endpoint)的提取
yield_api_endpoint(metadata.py)针对每个集合,遍历其下所有 Path Item 中的 HTTP 操作(get/put/post/delete/options/head/patch/trace,见OPENAPI_OPERATION_METHODS),生成 API Endpoint 实体,包含:
name:{清理后的路径}/{HTTP方法},如pets/{petId}/get;requestMethod:映射到ApiRequestMethod枚举;requestSchema/responseSchema:从 Operation 中解析出的字段模型(见下节);apiCollection:归属集合的 FQN 引用。
5.3 请求/响应 Schema 的解析
这是最有技术含量的部分(metadata.py):
- 请求 Schema:优先读取 OpenAPI 3.0 的
requestBody.content["application/json"].schema;若无则回退 Swagger 2.0 的parameters中in: "body"参数;再回退提取query/path参数转换为字段模型(含$ref参数解析)。 - 响应 Schema:优先取
responses["200"],缺失时依次尝试201/202/203/204;支持四种形态——直接$ref、type: array且 items 含$ref、嵌套properties.data.$ref、以及内联properties(无$ref)。 - 类型映射:OpenAPI 的
integer→INT、number+float/double→FLOAT/DOUBLE,并处理数组子项递归;$ref递归解析时通过parent_refs记录祖先引用,避免循环引用导致无限递归。
由此可见,该连接器对 OpenAPI 3.x 与 Swagger 2.0 的兼容处理非常细致,即使 schema 文档"不那么标准",也能尽量提取出字段级元数据。
六、过滤与治理:用正则控制采集范围
连接器支持两级过滤,均来自 restConnection.json:
apiCollectionFilterPattern:按 Collection 名称正则过滤。在 metadata.py 中,被过滤的集合会记录为Collection filtered out状态,不会创建实体;apiEndpointFilterPattern:按 Endpoint 显示名过滤。在yield_api_endpoint(metadata.py)中,被过滤的端点记录为Endpoint filtered out。
用法示例:
apiCollectionFilterPattern: includes: ["(users|orders).*"] excludes: ["internal.*"] apiEndpointFilterPattern: includes: [".*"] excludes: ["admin/.*"]另外,即使某个集合构建失败,_derive_collections也会记录失败状态后继续处理其余集合(见 metadata.py),不会因单个畸形 tag 丢弃整份文档——这与早期版本"一个坏条目导致整个生成器中断"的行为相比,健壮性明显提升。
七、常见问题与排查思路
- Test Connection 报
SchemaURLError:URL 不可达或需要认证。检查网络、URL 拼写;若 schema 受保护,确认token已配置且服务接受 Bearer 方案;检查verifySSL与自签名证书场景。 - 报
InvalidOpenAPISchemaError:内容不是合法 OpenAPI 文档。确认响应是 JSON/YAML 对象且包含openapi或swagger顶层字段;注意某些服务返回 HTML 错误页,会被_ensure_mapping判定为非对象而拒绝(见 parser.py)。 - 采集到的集合/端点偏少:检查 schema 中是否使用了根级
tags;没有 tag 的端点会落入default集合;确认未命中过滤正则。 - Schema 字段为空:
$ref引用的 schema 必须在components.schemas(OpenAPI 3.x)或definitions(Swagger 2.0)中可解析;字段级提取对复杂嵌套(数组套对象、循环引用)做了递归保护,个别极端结构可能解析为UNKNOWN类型。
八、小结
OpenMetadata 的 REST API 连接器是一个"以契约驱动元数据"的通用型连接器:配置一个 OpenAPI Schema 来源(URL / 本地文件 / S3)加可选 Token,即可完成对任意 RESTful 服务的 API 目录化。其价值在于:
- 零厂商绑定:任何暴露 OAS 文档的服务都能接入;
- 两级实体建模:API Collection + API Endpoint,配合请求/响应字段模型,构建可检索的 API 数据字典;
- 兼容双规范:同时支持 OpenAPI 3.x 与 Swagger 2.0;
- 可治理:通过过滤模式控制采集范围,通过连接测试保障配置正确性。
相关源码入口:连接与测试见 connection.py,解析器见 parser.py,采集主逻辑见 metadata.py,配置模型见 restConnection.json。UI 配置文档本体位于 Rest.md。
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考