☰
蓝鲸配置平台 bk-cmdb 模型实例关联关系数量查询接口全解析
2026/10/12 4:36:33 网站建设 项目流程
  • 后端
  • 企业应用
  • 运维

【免费下载链接】bk-cmdb

蓝鲸智云配置平台(BlueKing CMDB)

项目地址:https://gitcode.com/gh_mirrors/bk/bk-cmdb
点击查看免费下载

count_instance_associations是蓝鲸配置平台(bk-cmdb)对外开放 API 中用于统计模型实例关联关系数量的接口,自 v3.10.1 起提供,适用于需要在不拉取明细的情况下快速获取关联规模、进行容量评估或触发阈值判断的场景。阅读本文后,你将完整掌握该接口的请求参数、conditions条件组装规则、响应结构,以及从 API 网关到 Mongo 底层计数的完整调用链路与校验逻辑。


接口概览

项目内容
接口名称(operationId)count_instance_associations
HTTP 方法与路径POST /api/v3/count/instance_associations/object/{bk_obj_id}
功能说明查询模型实例关系数量
版本要求v3.10.1 及以上

该接口在 API 网关资源配置文件 中登记,网关后端直连拓扑服务的/api/v3/count/instance_associations/object/{bk_obj_id},并默认带有bk-rate-limit(默认每周期 100 token)限流插件,isPublic: false表示该资源不对外公开,需申请 API 权限后方可调用。

从调用链定位看,该路径属于拓扑(topo)系列接口,与查询实例关联明细的search_instance_associations互为姊妹接口:一个返回info明细列表,一个仅返回count数量。


请求参数详解

接口请求体为 JSON,包含三个字段:

字段名类型必填说明
bk_biz_idint否业务 ID,查询主线模型时必填
bk_obj_idstring是模型 ID(对象模型标识)
conditionsobject否组合查询条件,支持 AND / OR,可嵌套,最多嵌套 3 层,每层最多 20 个 OR 条件;不传表示匹配全部(即conditions为 null)

注意:bk_obj_id同时也会出现在 URL 路径参数{bk_obj_id}中,两者含义一致。主链路模型(如业务、集群、模块等组织架构主线模型)的实例关联统计必须携带bk_biz_id,否则无法限定业务范围。

conditions 结构

conditions由condition与rules两个字段构成:

字段名类型必填说明
conditionstring是规则操作符,取值为AND或OR
rulesarray是所选业务规则的范围条件集合

conditions.rules 字段说明

rules数组中的每个元素既可以是原子规则(原子过滤规则),也可以再次嵌套condition+rules形成组合规则:

字段名类型必填说明
fieldstring是条件字段,可选值:id、bk_inst_id、bk_obj_id、bk_asst_inst_id、bk_asst_obj_id、bk_obj_asst_id、bk_asst_id
operatorstring是操作符,可选值:equal、not_equal、in、not_in、less、less_or_equal、greater、greater_or_equal、between、not_between等
value-否条件字段的期望值;不同操作符对应不同 value 格式,数组类型 value 的元素个数上限为 500

各字段的实际含义与仓库中的字段常量一一对应(定义于 definitions.go):

字段名语义源码常量
bk_obj_id源模型 IDBKObjIDField(definitions.go)
bk_inst_id源实例 IDBKInstIDField(definitions.go)
bk_asst_obj_id目标模型 IDBKAsstObjIDField(definitions.go)
bk_asst_inst_id目标实例 IDBKAsstInstIDField(definitions.go)
bk_obj_asst_id模型关联关系 IDAssociationObjAsstIDField(definitions.go)
bk_asst_id关联类型(关联种类)IDAssociationKindIDField(definitions.go)
id实例关联记录自身的唯一 ID对应关联记录表主键

这些字段在实例关联记录表上均建有索引,见 src/common/index/association.go,因此按上述字段过滤可以命中 Mongo 索引。

操作符与 value 格式

conditions底层由src/common/querybuilder模块解析(模块说明见 src/common/querybuilder/README.md)。操作符常量定义在 src/common/querybuilder/types.go 的SupportOperators集合中,包括:

类别操作符value 格式
通用比较equal、not_equal基本数据类型(数值 / bool / 字符串)
集合匹配in、not_in元素类型一致的数组
数字比较less、less_or_equal、greater、greater_or_equal数值
时间比较datetime_less、datetime_less_or_equal、datetime_greater、datetime_greater_or_equalRFC3339 格式字符串
字符串begins_with、not_begins_with、contains、not_contains、ends_with、not_ends_with非空字符串
数组判空is_empty、is_not_empty不接受参数
空值判断is_null、is_not_null不接受参数
字段存在性exist、not_exist不接受参数

说明:接口文档操作符一栏示例中列出的between、not_between,在当前仓库的 querybuilder 实现中并未列入SupportOperators集合(README 明确注明"不支持 between 和 not_between 运算符,这类运算符可基于基本比较运算符组合实现")。实际可用操作符以 types.go 中SupportOperators为准,区间过滤可改用greater_or_equal与less_or_equal组合表达。

限制边界(源码级校验)

conditions的合法性由CommonCountFilter.Validate把关(src/common/metadata/common.go),规则常量定义于 src/common/querybuilder/types.go:

限制项上限常量
嵌套层数3 层MaxDeep = 3
数组类型 value 元素个数500DefaultMaxSliceElementsCount = 500
单层 OR 组合规则数20DefaultMaxConditionOrRulesCount = 20
数组元素类型要求一致RuleOption.NeedSameSliceElementType

若conditions为空(null或不传),校验直接通过,语义为"匹配全部关联记录"(见 common.go)。


请求示例

以下示例统计交换机模型(bk_switch)的实例关联数量:要求关联关系为bk_switch_connect_host,且满足"源实例 ID 属于 [2,4,6]或关联类型 ID 等于 3":

{ "bk_obj_id": "bk_switch", "conditions": { "condition": "AND", "rules": [ { "field": "bk_obj_asst_id", "operator": "equal", "value": "bk_switch_connect_host" }, { "condition": "OR", "rules": [ { "field": "bk_inst_id", "operator": "in", "value": [2, 4, 6] }, { "field": "bk_asst_id", "operator": "equal", "value": 3 } ] } ] } }

外层condition为AND,连接"关联关系 ID 等于指定值"与内层OR组合;内层OR连接"源实例 ID 属于集合"与"关联类型等于 3"。整体语义等价于:

bk_obj_asst_id = 'bk_switch_connect_host' AND (bk_inst_id IN [2,4,6] OR bk_asst_id = 3)

查询主线模型(如biz、set、module)时,需在上述 JSON 中补充"bk_biz_id": <业务ID>字段。


响应示例与参数说明

{ "result": true, "code": 0, "message": "success", "permission": null, "data": { "count": 1 } }

响应参数:

字段名类型说明
resultbool请求是否成功,true成功,false失败
codeint错误码,0表示成功,>0表示失败错误码
messagestring请求失败时返回的错误信息
permissionobject权限信息
dataobject请求返回的数据

data.count为 int 类型,即满足条件的实例关联记录数量。响应外层结构与CommonCountResp定义对应(src/common/metadata/common.go),data部分实际由metadata.CommonCountResult承载。


源码级调用链路剖析

从一次 HTTP 请求到最终计数,完整调用链如下:

① API 网关层:POST /api/v3/count/instance_associations/object/{bk_obj_id}在 apiserver 中按拓扑系列路径转发,该路径被列入topoPrefixes白名单(src/apiserver/service/url.go)。

② 权限解析层:apiserver 将请求转发到拓扑服务前,权限解析器会匹配正则^/api/v3/count/instance_associations/object/[^\s/]+/?$(src/ac/parser/topolatest.go),命中后标记为SkipAction跳过实例级鉴权(topolatest.go)。

③ 拓扑服务路由注册:拓扑服务通过utility.AddHandler注册该 POST 路由到CountInstanceAssociationshandler(service_business_initfunc.go)。

④ 拓扑服务 handler 处理:从路径取bk_obj_id,将请求体反序列化为metadata.CommonCountFilter,执行参数校验,并将读偏好设为SecondaryPreferredMode(从库优先读取,降低主库压力)(src/scene_server/topo_server/service/association.go)。

⑤ 逻辑层组装条件:CountInstanceAssociations逻辑将conditions通过GetConditions()转换为 Mongo 过滤条件,并强制注入bk_obj_id字段(src/scene_server/topo_server/logics/inst/association.go):

cond, err := input.GetConditions() cond[common.BKObjIDField] = objID conditions := &metadata.Condition{Condition: cond}

⑥ coreservice 底层计数:拓扑服务调用 coreservice 的CountInstanceAssociations(src/source_controller/coreservice/core/association/instance.go),最终落到countInstanceAssociation:

asstTableName := common.GetObjectInstAsstTableName(objID, kit.SupplierAccount) return mongodb.Client().Table(asstTableName).Find(cond).Count(kit.Ctx)

即对实例关联记录表(表名由模型 ID 与租户标识动态生成)执行 MongoFind(...).Count(...)完成统计(instance.go)。由于关联记录表对bk_obj_id、bk_inst_id、bk_asst_obj_id、bk_asst_inst_id等字段建有复合索引(src/common/index/association.go),按这些字段过滤时计数查询效率有保障。

⑦ 条件转换细节:CommonCountFilter.GetConditions()将 QueryBuilder 的规则树通过ToMgo()转换为 Mongo 查询条件(src/common/metadata/common.go),原子规则与组合规则的定义可参见 src/common/querybuilder/types.go。


常见问题与注意事项

  • 查询主线模型必须传bk_biz_id:不传时无法限定业务范围,结果可能与预期不符。
  • conditions不传等于匹配全部:若希望统计某模型下所有关联记录,直接省略conditions即可,无需构造空对象。
  • 数组 value 上限 500:in/not_in等操作符的数组元素个数超过 500 会校验失败,需拆分多次调用后自行汇总。
  • 嵌套与 OR 规则数限制:嵌套超过 3 层、单层 OR 超过 20 条会被CommonCountFilter.Validate拒绝,报参数错误(对应错误码CCErrCommParamsInvalid)。
  • between/not_between不可用:当前 querybuilder 实现不支持这两个操作符,区间场景请组合greater_or_equal与less_or_equal。
  • 只返回数量、不返回明细:需要关联明细列表时,请使用姊妹接口search_instance_associations(POST /api/v3/search/instance_associations/object/{bk_obj_id})。

延伸阅读

  • 实例关联查询接口 search_instance_associations
  • QueryBuilder 查询规则组装详细说明
  • CommonCountFilter 定义与校验实现
  • 拓扑服务关联计数实现
  • coreservice 关联计数实现
  • 后端
  • 企业应用
  • 运维

【免费下载链接】bk-cmdb

蓝鲸智云配置平台(BlueKing CMDB)

项目地址:https://gitcode.com/gh_mirrors/bk/bk-cmdb
点击查看免费下载

相关推荐

上一篇:Illustrator自动化脚本终极指南:8个免费工具彻底改变你的设计工作流
下一篇:OmenSuperHub:惠普游戏本硬件控制的技术实现与性能优化解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询