我正在尝试使用自定义查询在Grafana中创建一个变量,以扫描EKS集群中的节点。当前,节点变量存储为“连字符”分隔的字符串(ex )。10-109-22-102);我打算把它报告为“点”分隔字符串(例如。10.109.22.102)。这能用regex吗?
Grafana 变量支持创建活动变量,方法是抓取给定的度量,然后使用regex在报告的度量中提取值。我目前正在收集一个指标:
kube_node_info{container_runtime_version="docker://18.6.1",endpoint="http",instance="10.11.111.111:8080",job=“kube-state-#en2#”,kernel_version="xxxxx",kubelet_version="xxxx",kubeproxy_version="xxxx",namespace="infra",node="ip-10-11-111-111.us-sdlls-as.compute.internal",os_image="Amazon 2",pod="prometheus-operator-kube-state-metrics-sdfgsjdkgl-saldjl",service="prometheus-operator-kube-state-metrics"}
我目前正在使用regex:/.*node="ip-([^"]*).us-*/来提取“连字符”分离的IP。我还尝试使用其他匹配组ex:([\d]{2,3})-([\d]{2,3})-([\d]{2,3})-([\d]{2,3}),但是这只返回grafana中的第一个匹配组(在本例中为10)作为唯一选项。
预期产出应是:
10.11.111.111发布于 2019-07-23 06:50:28
实际目的是通过查询捕获实例的IP,并将它们作为动态变量列出,然后通过IP启用所有节点度量。这是一种糟糕的方法,因为很多prometheus节点度量都是用标签node=ip-XX-XX-XXX-XXX-<region>-.compute.internal (其中XX是数字)导出的。另外,grafana变量报告只匹配第一个子组-理想情况下,它应该是所有的子组。
然而,即使我要捕获子组,比如XX.XX.XXX.XXX,这意味着对于我需要捕获的每一个度量,以及我需要为EKS节点中的所有is进行匹配的图表--这是不可能的,尤其是如果我们希望启用“所有”变量,其中grafana用所有变量匹配的正则表达式替换变量调用。例如。如果我的k8s节点有以下in:* 10.10.0.1 * 10.10.0.2 * 10.10.0.3,我调用这个变量,因为node将列出以下变量:* All * 10.10.0.1 * 10.10.0.2 * 10.10.0.3选择All Grafana将代替$Node到./*(10.10.0.1|10.10.0.2|10.10.0.3)*/,但是如果我查询到获取节点信息:kube_pod_info{node=~"$Node"} ->,这将失败,因为节点名称采用不同的格式。通过使用label_replace来解决这个问题,但是在使用All变量的情况下,我们同样不能使用$Node来解决这个问题。
结论:使用变量$Node (即*ip-10-10-0-1.us-sdlls-as.计算.ip-10-10-0-2 use sdlls-as.计算-10-0-3.use 10-0-3 use as.Compute.inside)-as-这将使所有其他面板更加方便和易于配置。
发布于 2019-07-22 03:25:28
在我看来,你设计的那个应该很好:
测试
package main
import (
"regexp"
"fmt"
)
func main() {
var re = regexp.MustCompile(`(?m)([0-9]{2,3})-([0-9]{2,3})-([0-9]{2,3})-([0-9]{2,3})`)
var str = `kube_node_info{container_runtime_version="docker://18.6.1",endpoint="http",instance="10.11.111.111:8080",job="kube-state-metrics",kernel_version="xxxxx",kubelet_version="xxxx",kubeproxy_version="xxxx",namespace="infra",node="ip-10-11-111-111.us-sdlls-as.compute.internal",os_image="Amazon Linux 2",pod="prometheus-operator-kube-state-metrics-sdfgsjdkgl-saldjl",service="prometheus-operator-kube-state-metrics"
kube_node_info{container_runtime_version="docker://18.6.1",endpoint="http",instance="10.11.111.111:8080",job="kube-state-metrics",kernel_version="xxxxx",kubelet_version="xxxx",kubeproxy_version="xxxx",namespace="infra",node="ip-10-11-111-111.us-sdlls-as.compute.internal",os_image="Amazon Linux 2",pod="prometheus-operator-kube-state-metrics-sdfgsjdkgl-saldjl",service="prometheus-operator-kube-state-metrics"
`
var substitution = "$1.$2.$3.$4"
fmt.Println(re.ReplaceAllString(str, substitution))
}该表达式将在regex101.com的右上面板上解释,如果您希望探索/简化/修改它,那么在此链接中,您可以观察它如何与某些示例输入相匹配(如果您愿意)。
发布于 2019-07-22 04:12:52
你的行刑一定很好。但是,字符集是多余的,因为您只使用每组数字。因此,它们可以被移除:
(\d{2,3})-(\d{2,3})-(\d{2,3})-(\d{2,3})
然后,可以将捕获的数据替换为:
$1.$2.$3.$4
https://stackoverflow.com/questions/57138246
复制相似问题