如何在单个 rego 策略中压缩和优化开放策略代理
How to compact and optimize open policy agent, in a single rego policy
我是 rego and OPA (Open Policy Agent) 的新手。
我正在尝试为允许策略覆盖但在正常情况下使用“策略配置”的实现创建一个默认策略在一个简单的 JSON 文档中。
我将输入作为“策略配置”,数据是策略要处理的数据。数据本身经过预处理,其中 "$error" 是 JSON 被评估为错误的元素。
该政策似乎工作正常,但据我了解,它必须是一种更简单的方式来表达 rego
中的相同内容,因此也更 优化(当前策略需要大约 1 毫秒的时间来评估)。
playground 包含以下要在线评估的设置。
干杯,
马里奥 :)
input.json
{
"range": {"IDT**": [-100, 100], "RHCS**": [20, 200]},
"report": ["ODT", "IDT_*_O2"],
"skip": ["IDT**"]
}
data.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)
}
我觉得你的保单看起来不错。如果您需要进一步调整它以提高性能,我建议您考虑调整您的数据,以便您的策略不需要依赖 glob.match
。从临时测试来看,目前大约一半的评估时间都花在了那里。
我是 rego and OPA (Open Policy Agent) 的新手。
我正在尝试为允许策略覆盖但在正常情况下使用“策略配置”的实现创建一个默认策略在一个简单的 JSON 文档中。
我将输入作为“策略配置”,数据是策略要处理的数据。数据本身经过预处理,其中 "$error" 是 JSON 被评估为错误的元素。
该政策似乎工作正常,但据我了解,它必须是一种更简单的方式来表达 rego
中的相同内容,因此也更 优化(当前策略需要大约 1 毫秒的时间来评估)。
playground 包含以下要在线评估的设置。
干杯, 马里奥 :)
input.json
{
"range": {"IDT**": [-100, 100], "RHCS**": [20, 200]},
"report": ["ODT", "IDT_*_O2"],
"skip": ["IDT**"]
}
data.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)
}
我觉得你的保单看起来不错。如果您需要进一步调整它以提高性能,我建议您考虑调整您的数据,以便您的策略不需要依赖 glob.match
。从临时测试来看,目前大约一半的评估时间都花在了那里。