ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Azure SDK for Go 自动生成实战:深入解析 azlogs 日志查询模块的 AutoRest 配置 autorest.md

Azure SDK for Go 自动生成实战:深入解析 azlogs 日志查询模块的 AutoRest 配置 autorest.md 测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载本文围绕 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/go4.0.0-preview.61 inject-spans: true version: ^3.0.0 slice-elements-byval: true rawjson-as-bytes: true配置项值含义与影响titleLogs Query Client生成代码的标题标识会出现在生成文件头的描述中。clear-output-folderfalse不清理输出目录。若设为true每次生成前会先清空output-folder这里保留为false以便手写文件如custom_client.go与生成文件共存于同一包。gotrue启用 Go 语言代码生成器配合use指定生成器版本。input-fileOperationalInsights.jsonstable/2022-10-27指定 OpenAPI/Swagger 规范文件的来源与版本快照。固定的 commit hash 保证了同一配置、同一输入、同一产物的可复现性。license-headerMICROSOFT_MIT_NO_VERSION生成文件的许可证头模板生成代码顶部因此带有 MIT License 声明。modulegithub.com/Azure/azure-sdk-for-go/sdk/monitor/query/azlogsGo module 路径即当前包的导入路径同时被写入 version.go 的moduleName常量。openapi-typedata-plane声明这是数据面data-planeAPI 而非管理面management-plane影响认证与代码结构。output-folder../azlogs生成文件的输出目录相对该配置文件所在目录的上一级azlogs包。securityAADToken鉴权方式为 Azure Active DirectoryAAD令牌生成代码会配合azcore的 Bearer Token 认证策略使用。useautorest/go4.0.0-preview.61锁定 Go 生成器Autorest.go的精确预览版本保证生成行为稳定。inject-spanstrue为每个生成方法注入分布式追踪 Span。在 client.go 中可见runtime.StartSpan(ctx, Client.QueryWorkspace, ...)与defer func() { endSpan(err) }()正是该开关的产物。version^3.0.0AutoRest 核心工具的版本范围约束。slice-elements-byvaltrue切片元素按值传递生成模型中的切片字段不再使用指针元素如Rows []Row而非[]*Row。rawjson-as-bytestrue原始 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 *boolColumnType对应 constants.go 中定义的type ColumnType string及ColumnTypeBool、ColumnTypeDatetime、ColumnTypeString等十个枚举值WorkspaceID对应 models.go 中BatchQueryRequest.WorkspaceID *stringOptionsPrefer 头对应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-statisticstrue,include-rendertrue,wait600这样的标准 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)拼接完整 URLTable.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 头OptionsQueryWorkspaceOptions.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.mdAutoRest 按use指定的autorest/go4.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 的裁剪边界与扩展点——这也是本仓库中该配置文件最大的学习价值所在。赞分享测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载相关推荐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 目录云原生集群管理虚拟化多集群上一篇Roundcube Webmail 自建邮箱避坑指南6 个新手坑与一次跑通的部署路线下一篇Mesa3D Windows 安装终极指南一招解决 OpenGL 兼容性问题与 DLL 缺失报错创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表