You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OPA Rego包时如何统计已评估的规则数量与名称

解决OPA Rego评估规则数量与名称统计问题

问题原因

你查询的是整个data.dockerfile_validation包,OPA会将整个包的评估结果封装为单个ResultSet条目返回,而非每个规则对应一条结果。所以len(rs)返回1,这是正常的ResultSet条目数,不是实际评估的规则数量。

解决方案

方法1:明确查询单个规则(需提前知晓规则名)

修改查询语句,用分号分隔多个规则,让每个规则的评估结果单独出现在ResultSet中:

regoQuery := rego.New(
    rego.Query("data.dockerfile_validation.untrusted_base_image; data.dockerfile_validation.latest_base_image"),
    rego.Module("./policy/security.rego", string(regoPolicyCode)),
    rego.Input(inputData),
)

此时len(rs)会返回规则的数量(这里是2),每个ResultSet条目对应一条规则的评估结果。

方法2:遍历包结果提取所有规则(无需提前知晓规则名)

如果不知道包内所有规则名称,可通过遍历ResultSet中的表达式结果,提取包下的规则键值对:

rs, err := regoQuery.Eval(context.Background())
if err != nil {
    // 处理错误逻辑
}

// 统计规则数量并收集名称
ruleCount := 0
var ruleNames []string

if len(rs) > 0 && rs[0].Expressions[0].Value != nil {
    packageResults, ok := rs[0].Expressions[0].Value.(map[string]interface{})
    if ok {
        for ruleName := range packageResults {
            ruleCount++
            ruleNames = append(ruleNames, ruleName)
        }
    }
}

fmt.Printf("评估的规则数量:%d\n", ruleCount)
fmt.Printf("规则名称:%v\n", ruleNames)

这段代码会从包的结果中解析出所有规则的名称和数量,适配包内任意数量的规则。

额外提示

你的Rego规则中第二个规则的split(input[i].Value[0], ":")存在潜在风险(若input[i].Value不是数组会报错),既然你确认策略能正常评估,说明输入结构匹配,但建议后续验证输入格式避免异常。

内容的提问来源于stack exchange,提问作者santoshdts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:56:17