【问题标题】:How to compact and optimize open policy agent, in a single rego policy如何在单个 rego 策略中压缩和优化开放策略代理
【发布时间】:2021-02-08 07:00:43
【问题描述】:

我是 rego 和 OPA(Open Policy Agent)的新手。

我正在尝试为允许策略覆盖但在正常情况下在简单 JSON 文件。

我使用输入作为“策略配置”,数据是策略要处理的数据。数据本身是经过预处理的,其中 "$error" 是已评估错误的 JSON 元素。

该政策似乎运作良好,但据我了解,它必须是在rego 中表达相同内容的一种更简单的方式,因此也更加优化(当前政策正在采取大约 1 毫秒来评估)。

playground 包含以下要在线评估的设置。

干杯, 马里奥:)

输入.json

{
  "range": {"IDT**": [-100, 100], "RHCS**": [20, 200]},
  "report": ["ODT", "IDT_*_O2"],
  "skip": ["IDT**"]
}

数据.json

{
  "target": {
    "IDT": 22,
    "IDT_C1_O1": 22.2,
    "IDT_C1_O2": 101,
    "IDT_C1_O3": "$error",
    "IDT_C1_O4": "$error",
    "ODT": "$error",
    "RHCS_C13_O44": "$error"
  }
}

评估 cbprovider rego 策略后的输出是

{
    "all_errors": [ "RHCS_C13_O44", "IDT_C1_O3", "IDT_C1_O4", "ODT", "IDT_C1_O2" ],
    "report": [ "ODT", "IDT_C1_O2" ],
    "skip": [ "IDT_C1_O3", "IDT_C1_O4" ]
}
package cbprovider

# Errors to be skipped
# If present in report as well it will not be skipped
# (report overrides skip)
skip[dp] {
    my := data.target[dp]
    my == "$error"   
    
    matchSkip(dp)
    
    not matchReport(dp)
}

# Errors to be skipped when out of range
skip[dp] {
    my := data.target[dp]
    my != "$error"   
    
    matchSkip(dp)
    
    not matchReport(dp)
    
    range := get_range(dp)
    not in_range(my, range[0], range[1])    
}


# Errors to be reported
# If matches both in skip and report -> report overrides skip
report[dp] {
    my := data.target[dp]
    my == "$error"   
    
    matchReport(dp)
}

# Errors to be reported when out of range
report[dp] {
    my := data.target[dp]
    my != "$error"   
    
    matchReport(dp)

    range := get_range(dp)
    not in_range(my, range[0], range[1])
}


all_errors[dp] {
    my := data.target[dp]
    my == "$error"     
}

all_errors[dp] {
    my := data.target[dp]
    my != "$error"
    
    range := get_range(dp)
    not in_range(my, range[0], range[1])
}

in_range(num, low, high) {
    num >= low
    num <= high
}

get_range(dp) = range {
    some key
    range := input.range[key]
    
    glob.match(key, ["_"], dp)
}

matchSkip(dp) {
    some i
    input.skip[i]
    glob.match(input.skip[i], ["_"], dp)
}

matchReport(dp) {
    some i
    input.report[i]
    glob.match(input.report[i], ["_"], dp)
}

【问题讨论】:

    标签: performance optimization open-policy-agent rego


    【解决方案1】:

    我认为您的政策看起来不错。如果您需要进一步调整它以提高性能,我建议您考虑调整您的数据,以便您的策略不需要依赖glob.match。从临时测试来看,目前大约有一半的评估时间都花在了上面。

    【讨论】:

    • 谢谢 devoops :) 我会检查一下,例如正则表达式更快,因为我需要某种形式的通配符才能使其“可行”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多