- 测试
- 云原生
- 质量保障
【免费下载链接】origin
Conformance test suite for OpenShift
本文围绕 OpenShift Conformance 测试套件仓库所引入的 Azure SDK for Go 依赖中的vendor/github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azlogs/autorest.md配置文件展开,系统讲解如何通过 AutoRest 从 Azure 官方 OpenAPI 规范(OperationalInsights>title: Logs Query Client clear-output-folder: false go: true input-file: https://github.com/Azure/azure-rest-api-specs/blob/0b64ca7cbe3af8cd13228dfb783a16b8272b8be2/specification/operationalinsights/data-plane/Microsoft.OperationalInsights/stable/2022-10-27/OperationalInsights.json license-header: MICROSOFT_MIT_NO_VERSION module: github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azlogs openapi-type: "data-plane" output-folder: ../azlogs security: "AADToken" use: "@autorest/go@4.0.0-preview.61" inject-spans: true version: "^3.0.0" slice-elements-byval: true rawjson-as-bytes: true
| 配置项 | 值 | 含义与影响 |
|---|---|---|
title | Logs Query Client | 生成代码的标题标识,会出现在生成文件头的描述中。 |
clear-output-folder | false | 不清理输出目录。若设为true,每次生成前会先清空output-folder,这里保留为false以便手写文件(如custom_client.go)与生成文件共存于同一包。 |
go | true | 启用 Go 语言代码生成器(配合use指定生成器版本)。 |
input-file | OperationalInsights.json(stable/2022-10-27) | 指定 OpenAPI/Swagger 规范文件的来源与版本快照。固定的 commit hash 保证了"同一配置、同一输入、同一产物"的可复现性。 |
license-header | MICROSOFT_MIT_NO_VERSION | 生成文件的许可证头模板,生成代码顶部因此带有 MIT License 声明。 |
module | github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azlogs | Go module 路径,即当前包的导入路径,同时被写入 version.go 的moduleName常量。 |
openapi-type | "data-plane" | 声明这是数据面(data-plane)API 而非管理面(management-plane),影响认证与代码结构。 |
output-folder | ../azlogs | 生成文件的输出目录,相对该配置文件所在目录的上一级azlogs包。 |
security | "AADToken" | 鉴权方式为 Azure Active Directory(AAD)令牌,生成代码会配合azcore的 Bearer Token 认证策略使用。 |
use | @autorest/go@4.0.0-preview.61 | 锁定 Go 生成器(Autorest.go)的精确预览版本,保证生成行为稳定。 |
inject-spans | true | 为每个生成方法注入分布式追踪 Span。在 client.go 中可见runtime.StartSpan(ctx, "Client.QueryWorkspace", ...)与defer func() { endSpan(err) }(),正是该开关的产物。 |
version | ^3.0.0 | AutoRest 核心工具的版本范围约束。 |
slice-elements-byval | true | 切片元素按值传递,生成模型中的切片字段不再使用指针元素(如Rows []Row而非[]*Row)。 |
rawjson-as-bytes | true | 原始 JSON 字段以[]byte承载,体现在 models.go 中Statistics []byte、Visualization []byte等字段。 |
其中security: "AADToken"的落地由手写构造函数完成:在 custom_client.go 的NewClient中,通过runtime.NewBearerTokenPolicy(credential, []string{c.Audience + "/.default"}, nil)构造 Bearer Token 认证策略,并依据cloud.AzurePublic等云配置解析出host端点与 Audience。这与配置中AADToken声明相互印证。
三、directive 体系:从规范到定制化客户端的四类操作
directive是 AutoRest 最强大的定制手段,本文件按功能分为四类,每类都有明确注释。
3.1 裁剪端点与操作(删除多余内容)
首先通过 JSONPath 从规范中删除多余端点:
directive: # delete extra endpoints - from: swagger-document where: $["paths"] transform: > delete $["/workspaces/{workspaceId}/metadata"]; - from: swagger-document where: $["x-ms-paths"] transform: > delete $["/{resourceId}/query?disambiguation_dummy"];from: swagger-document表示修改源对象是原始 Swagger 文档;where用 JSONPath 定位到paths与x-ms-paths两个端点集合;transform是一段 JavaScript 表达式,delete掉元数据端点和用于消除歧义的占位端点。
随后用专门的指令删除不需要的操作:
# delete extra operations - remove-operation: Query_Get - remove-operation: Query_ResourceGetQuery_Get与Query_ResourceGet是 Swagger 中定义的 GET 版本查询操作。删除它们之后,生成的Client只保留 POST 形态的三个查询方法,即 client.go 中的QueryWorkspace、QueryResource、QueryBatch。
3.2 删除模型(精简类型面)
元数据与批处理相关的一组模型被整体移除:
# delete metadata and batch models - remove-model: metadataResults - remove-model: metadataCategory - remove-model: metadataSolution - remove-model: metadataResourceType - remove-model: metadataTable - remove-model: metadataFunction - remove-model: metadataQuery - remove-model: metadataApplication - remove-model: metadataWorkspace - remove-model: metadataResource - remove-model: metadataPermissions这些metadata*模型对应工作区元数据查询(已在上一步删除端点),全部从生成代码中剔除,最终models.go只保留查询真正需要的QueryBody、QueryResults、Table、Column、BatchRequest等类型,显著收敛了公开 API 面。
3.3 重命名操作与字段(重塑公开 API)
为了让生成的客户端语义更贴合"Logs Query Client"定位,操作被统一重命名:
# rename log operations to generate into a separate logs client - rename-operation: from: Query_Execute to: Logs_QueryWorkspace - rename-operation: from: Query_ResourceExecute to: Logs_QueryResource - rename-operation: from: Query_Batch to: Logs_QueryBatch随后通过 JSONPath 加x-ms-client-name的方式改写字段名,让公开 API 名称更可读:
# rename Body.Workspaces to Body.AdditionalWorkspaces - from: swagger-document where: $.definitions.queryBody.properties.workspaces transform: $["x-ms-client-name"] = "AdditionalWorkspaces" # rename Render to Visualization - from: swagger-document where: $.definitions..render transform: $["x-ms-client-name"] = "Visualization" # rename LogsColumnType to ColumnType - from: swagger-document where: $.definitions.logsColumnType.x-ms-enum transform: $["name"] = "ColumnType" # rename BatchQueryRequest.Workspace to BatchQueryRequest.WorkspaceID - from: swagger-document where: $.definitions.batchQueryRequest.properties.workspace transform: $["x-ms-client-name"] = "WorkspaceID" # rename Prefer to Options - from: swagger-document where: $.parameters.PreferHeaderParameter transform: $["x-ms-client-name"] = "Options"这些重命名的效果全部可以对照生成源码验证:
AdditionalWorkspaces:出现在 models.go 的QueryBody.AdditionalWorkspaces []string,用于多工作区联合查询;Visualization:对应QueryResults.Visualization []byte与QueryOptions.Visualization *bool;ColumnType:对应 constants.go 中定义的type ColumnType string及ColumnTypeBool、ColumnTypeDatetime、ColumnTypeString等十个枚举值;WorkspaceID:对应 models.go 中BatchQueryRequest.WorkspaceID *string;Options(Prefer 头):对应QueryWorkspaceOptions.Options *QueryOptions。
3.4 对生成文件做正则替换(文本级后处理)
除了对 Swagger 文档的修改,AutoRest 还允许直接对已生成的 Go 文件做正则替换,本配置大量使用这一手段完成"生成后整形":
- from: options.go where: $ transform: return $.replace(/Options \*string/g, "Options *QueryOptions"); - from: client.go where: $ transform: return $.replace(/\*options\.Options/g, "options.Options.preferHeader()");这两条将Prefer参数从裸*string升级为强类型*QueryOptions,并在请求构造处调用手写的preferHeader()方法把它序列化成Prefer请求头。在 custom_client.go 中可以看到该方法将Statistics、Visualization、Wait三个字段拼接为include-statistics=true,include-render=true,wait=600这样的标准 Prefer 头格式。
错误模型同样被正则删除,缩小了类型面:
# delete unused error models - from: models.go where: $ transform: return $.replace(/(?:\/\/.*\s)+type (?:ErrorResponse|ErrorResponseAutoGenerated|ErrorInfo|ErrorDetail).+\{(?:\s.+\s)+\}\s/g, ""); - from: models_serde.go where: $ transform: return $.replace(/(?:\/\/.*\s)+func \(\w \*?(?:ErrorResponse|ErrorResponseAutoGenerated|ErrorInfo|ErrorDetail)\).*\{\s(?:.+\s)+\}\s/g, "");有趣的是ErrorInfo在生成后又被 custom_client.go 以手写方式重新实现——它只保留Code字段并把完整错误体保存在data []byte中,作为批处理查询中节流(ThrottledError)等错误码的载体。
3.5 结构级修正:host 字段、Rows 类型与 TimeInterval
本配置还通过替换语句改变了客户端与模型的结构:
# add host as field in client struct - from: client.go where: $ transform: return $.replace(/host/g, "client.host"); - from: client.go where: $ transform: return $.replace(/internal \*azcore.Client/g, "host string\n internal *azcore.Client"); - from: constants.go where: $ transform: return $.replace(/const host = "(.*?)"/, ""); # change Table.Rows from type [][]byte to type []Row - from: models.go where: $ transform: return $.replace(/Rows \[\]\[\]\[\]byte/g, "Rows []Row"); # change type of timespan from *string to *TimeInterval - from: - models.go - options.go where: $ transform: return $.replace(/Timespan \*string/g, "Timespan *TimeInterval"); # delete client name prefix from method options and response types - from: - client.go - options.go - response_types.go where: $ transform: return $.replace(/Client(\w+)((?:Options|Response))/g, "$1$2");这四组替换的最终效果清晰可见:
- client.go 中
Client结构体包含host string与internal *azcore.Client两个字段,host由NewClient依据云配置注入,请求构造时通过runtime.JoinPaths(client.host, urlPath)拼接完整 URL; Table.Rows类型为[]Row,其中Row是 custom_client.go 定义的type Row []any,让每一行成为可直接索引的任意类型切片;QueryBody.Timespan *TimeInterval使用手写的TimeInterval类型(见 custom_client.go),遵循 ISO8601 时间区间标准,支持startISOTime/endISOTime格式与PT2H这类时长简写,并配套NewTimeInterval便捷构造函数与Values()解析方法;- 最后一组正则把
ClientQueryWorkspaceOptions这类名字压缩为QueryWorkspaceOptions,使 options.go 与 response_types.go 中的公开类型名干净利落。
四、配置与运行时行为的对应关系
autorest.md中每一项定制都有明确的运行时意义,以下是配置到行为的关键映射:
Prefer 头(Options):QueryWorkspaceOptions.Options *QueryOptions经preferHeader()序列化为 Prefer 请求头,最终由 client.go 写入req.Raw().Header["Prefer"]。其中Wait控制服务端超时(默认约 3 分钟,最大 600 秒),Statistics与Visualization分别请求执行统计与可视化数据,对应响应中的Statistics []byte、Visualization []byte字段。
TimeInterval 与 Timespan:建议始终显式携带查询时间区间,避免扫描全量数据。NewTimeInterval(start, end)生成RFC3339时间/时间字符串;若 Kusto 查询字符串与Timespan字段同时指定时间范围,服务端取两者交集。
多工作区查询:在QueryBody.AdditionalWorkspaces中追加工作区 ID 即可对多个工作区执行同一查询;需要注意的是,跨工作区返回的结果表不会按来源工作区分组。
批处理与节流:QueryBatch走/$batch端点(见 client.go),批量场景下若请求被节流,返回的ErrorInfo.Code为ThrottledError。
认证与云环境:security: "AADToken"对应的NewClient(credential, options)通过azcore.TokenCredential构建 Bearer Token 策略;客户端默认指向 Azure 公有云,可通过ClientOptions.Cloud切换到其他云环境,NewClient会校验该云配置是否包含 Azure Monitor Logs 的 Endpoint 与 Audience。
五、代码生成工作流与可复现性
完整的生成流程可归纳为:
go generate触发 build.go 中的autorest ./autorest.md;- AutoRest 按
use指定的@autorest/go@4.0.0-preview.61生成器读取input-file指定的 2022-10-27 OperationalInsights 规范; - 依次执行全部
directive:裁剪端点/操作/模型 → 重命名操作与字段 → 对生成的client.go、options.go、models.go、response_types.go、models_serde.go、constants.go做正则替换; - 输出到
output-folder: ../azlogs,随后由gofmt -w .统一格式化; - 手写的 custom_client.go 与生成文件共存,补充构造函数、
TimeInterval、QueryOptions、Row、ErrorInfo等定制能力。
input-file固定 commit hash、use固定生成器版本、version限定 AutoRest 核心版本,三者共同保证"同一配置在任何时间生成的结果一致"。仓库当前锁定的模块版本为v1.1.0(见 version.go),使用方可通过go get github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azlogs安装,配合azidentity提供的DefaultAzureCredential完成认证后即可对 Log Analytics 工作区或任意 Azure 资源执行只读日志查询,详见同目录下的 README.md。
六、总结:从配置到客户端的完整链路
autorest.md是理解azlogs模块设计意图的最佳入口:它先以顶层参数锁定输入规范、输出位置、Go module 与认证模型,再用四类 directive 完成"瘦身"(删除元数据端点、操作与模型)、"正名"(重命名操作与字段)、"塑形"(host 字段、Rows []Row、TimeInterval)与"精修"(错误模型清理、Options 类型升级)。读者在阅读任何 AutoRest 生成的 SDK 时,都可以先找同名autorest.md,再结合生成代码逐一核对,从而快速掌握该 SDK 的裁剪边界与扩展点——这也是本仓库中该配置文件最大的学习价值所在。
- 测试
- 云原生
- 质量保障
【免费下载链接】origin
Conformance test suite for OpenShift
相关推荐
AutoRest 配置驱动的 Azure Container Registry Go 客户端生成:autorest.md 深度解析
AutoRest 配置驱动的 Azure Container Registry Go 客户端生成:autorest.md 深度解析 本文以 vendor/git
云原生CI/CDDevOps后端深度解析 Azure Blob SDK for Go 的 autorest 代码生成配置:以 buildkit 仓库 vendor 依赖为例
深度解析 Azure Blob SDK for Go 的 autorest 代码生成配置:以 buildkit 仓库 vendor 依赖为例 本文聚焦于 ven
构建工具云原生后端vCluster 仓库内嵌的 Azure Blob Go SDK 代码生成配置文件 autorest.md 深度解析
vCluster 仓库内嵌的 Azure Blob Go SDK 代码生成配置文件 autorest.md 深度解析 导读 本文围绕当前仓库 vendor 目录
云原生集群管理虚拟化多集群
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考