作者:安琪儿 | 来源:互联网 | 2024-12-20 12:34
我正在使用tstanisl的答案在Grafana中配置面板。这是我第一次使用它,感觉非常棒。然而,在理解某些细节方面遇到了一些困难。
我的代码如下:
.addTemplate(
template.new(
microservices, datasource='', query=std.join(',', std.map(function(x) x.text, service['microservices'])), label=services))
我想做的是根据给定的微服务名称找到它在数组中的位置,以便可以将其分配给一个可变的服务变量(然后通过query = std.join(‘,’, std.map(function(x) x.text, service['microservices']))获得自定义值)。
变量 services
的结构如下:
[{
"key": "asd",
"microservices": [
{"key": "I HAVE THIS VALUE", "text": "ads"},
{"key": "asd", "text": "asd"}
],
"name": "bca",
"services": [{"key": "bca", "name": "bca"}]
}, {
"key": "bca",
"microservices": [
{"key": "bca", "text": "bca"},
{"key": "bca", "text": "bca"}
]
}, {
"key": "abc",
"name": "abc",
"services": [{"key": "ccc", "name": "ccc"}]
}]
在其他编程语言中,这是一个基本操作,但在JSONNet中实现这一点可能需要一些技巧。
例如,在Go语言中,可以通过以下方式实现:
var srv type
for x, service := range services {
for _, microservice := range service.microservices {
if microservice.key == "my value" {
srv = services[x]
}
}
}
那么,在JSONNet中应该如何实现呢?
实际上,在JSONNet中这也是一项相对简单的任务。最自然的方法是使用数组推导,它可以方便地进行过滤:
local service2 = [
s for s in services
if [ms for ms in s.microservices if ms.key == "I HAVE THIS VALUE"] != []
][0];
请注意,索引 [0]
假设只有一个匹配项或您只关心第一个匹配项。如果有多个匹配项或没有匹配项,您需要明确处理这些情况。
如果需要实际索引,可以稍微复杂一点:
local serviceIndex = [
x for x in std.range(0, std.length(services) - 1)
if [ms for ms in services[x].microservices if ms.key == "I HAVE THIS VALUE"] != []
][0];
此外,您可以使用 std.filter
函数来实现相同的效果,但这种方式会更冗长。
为了提高代码的可读性,建议提取一个函数 hasMicroservice(service, msKey)
来简化过滤逻辑。