使用JQ聚合计数 筛选同操作同原因重复失败的资产记录
原有代码问题
你的代码跑不出正确结果,核心是三个错误:
- 多次独立写
.executions[]展开数组会产生笛卡尔积,相当于把同个资产下所有执行记录的字段交叉拼接,成功记录的字段会混到失败条目里,后续再过滤state也没用,很多拼接出来的条目是SUCCESS和非SUCCESS状态乱凑的 - 筛选层级不对:你先在资产整体层面判断有没有失败执行、有没有LINUX组件,没有先把单个执行记录拆开过滤,后面取字段的时候会把资产下所有执行(包括成功的)全拉出来
- 分组维度错了:只按
assetId分组,没把操作名、错误类型算进分组key,没法统计「同个资产+同个操作+同个错误」的重复失败次数,另外你还把字段名componentId拼错成了conponentId
可用JQ代码
命令行版本
.waves[].assets[] # 可选:如果不需要筛选LINUX资产,删掉下面这行即可 | select(any(.executions[]; .componentId | contains("LINUX"))) | .assetId as $aid | .executions[] # 过滤掉成功的执行记录 | select(.operationStatus.state != "SUCCESS") # 提取统一的失败条目结构 | { assetId: $aid, operationName: .operationName, error: .operationStatus.error } # 按资产、操作、错误三个维度分组,三个字段完全一致才算同一种重复失败 | group_by([.assetId, .operationName, .error])[] # 只保留失败次数大于1的分组 | select(length > 1) # 组装成你要求的输出格式 | { assetId: .[0].assetId, error: .[0].error, operationName: .[0].operationName, failure_count: length }
Python jq库适配版本
直接把下面代码替换你原来的jq.compile部分即可:
import jq result = jq.compile(""".waves[].assets[] | select(any(.executions[]; .componentId | contains("LINUX"))) | .assetId as $aid | .executions[] | select(.operationStatus.state != "SUCCESS") | {assetId: $aid, operationName: .operationName, error: .operationStatus.error} | group_by([.assetId, .operationName, .error])[] | select(length > 1) | {assetId: .[0].assetId, error: .[0].error, operationName: .[0].operationName, failure_count: length} """).input(job_resp).all()
补充说明
- 用
any(.executions[]; 条件)判断资产属性,不会触发笛卡尔积,避免数据错乱 - 过滤非SUCCESS状态的逻辑直接放在单个执行记录层级,从根源上排除成功记录,不会出现漏过滤的问题
- 如果不需要统计error为空的失败,在过滤执行的
select里加个and (.operationStatus.error != null)条件即可 - 输出的
failure_count默认是数字类型,如果你需要字符串类型,把最后一行的length改成tostring就行
内容的提问来源于stack exchange,提问作者josseossa
相关产品推荐
相关产品推荐

