正则表达式:Grafana 变量将连字符分隔的 IP 转换为点分隔的 IP

我正在尝试使用自定义查询在 Grafana 中创建一个变量来扫描 EKS 集群中的节点。目前,节点变量存储为“连字符”分隔的字符串(例如 10-109-22-102);我打算将其报告为“点”分隔的字符串(例如 10.109.22.102)。这甚至可以通过正则表达式实现吗?

Grafana变量支持通过抓取给定指标然后使用正则表达式提取报告指标中的值来创建实时变量。我目前正在抓取一个指标:

kube_node_info{container_runtime_version=“docker://18.6.1”,端点=“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"}

我目前正在使用 regex:/.*node="ip-([^"]*).us-*/提取以“连字符”分隔的 IP。我还尝试过使用其他匹配组,例如:([\d]{2,3})-([\d]{2,3})-([\d]{2,3})-([\d]{2,3})但是,这仅返回 grafana 中的第一个匹配组(在本例中10)作为唯一选项。

预期输出应该是:

10.11.111.111


长风秋雁
浏览 414回答 3
3回答

森栏

在我看来,你设计的应该可以正常工作:测试package mainimport (    "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的右上角面板上进行了解释,如果您想探索/简化/修改它,并且在此链接中,如果您愿意,您可以观看它如何与某些示例输入匹配。

紫衣仙女

你的正则表达式必须工作正常。但是,字符集是多余的,因为每组仅使用数字。因此,可以将它们删除:(\d{2,3})-(\d{2,3})-(\d{2,3})-(\d{2,3})然后捕获的数据可以替换为:$1.$2.$3.$4演示

慕田峪9158850

实际目的是捕获实例的 IP,并通过查询将所有这些 IP 列为动态变量,然后通过 IP 启用所有节点指标。这是一个糟糕的方法,因为许多普罗米修斯节点指标都是用标签导出的node=ip-XX-XX-XXX-XXX-<region>-.compute.internal(其中 XX 是数字)。此外,grafana 变量仅报告第一个子组的匹配 - 理想情况下它应该是所有子组。但是,即使我要捕获 XX.XX.XXX.XXX 子组,这也意味着对于我需要捕获和绘制图表的每个指标,我需要解决 EKS 节点中所有 IP 的匹配问题 - 这不是特别是如果我们想要启用“全部”变量,其中 grafana 用所有变量匹配的正则表达式替换变量调用,这是可能的。前任。如果我的 k8s 节点有以下 IP: * 10.10.0.1 * 10.10.0.2 * 10.10.0.3 并且我将此变量称为 Node Grafana 将列出以下变量: * All * 10.10.0.1 * 10.10.0.2 * 10.10.0.3 在选择 grafanaAll时会将 $Node 替换为./*(10.10.0.1|10.10.0.2|10.10.0.3)*/但是,如果我有一个获取节点信息的查询:kube_pod_info{node=~"$Node"}-> 这会失败,因为节点名称采用不同的格式,我们可以尝试通过使用来解决它,label_replace但我们再次无法解决使用$Node如果All使用变量。结论:使用变量$Node(即* ip-10-10-0-1.us-sdlls-as.compute.internal * ip-10-10-0-2.us-sdlls-as.compute.internal * ip- 10-10-0-3.us-sdlls-as.compute.internal ) -按原样,这将使所有其他面板更加方便且易于配置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go