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

Regex: Grafana Variables convert hyphen separated IPs to Dot separated IPs

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

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

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"}

我目前正在使用正则表达式:/.*node="ip-([^"]*).us-*/ 来提取 "hyphen" 分隔的 IP。我也尝试过使用其他匹配组,例如:([\d]{2,3})-([\d]{2,3})-([\d]{2,3})-([\d]{2,3}) 但是这个 returns 只是 grafana 中的第一个匹配组(在这种情况下 10)作为唯一的选择。

预期输出应为:

10.11.111.111

在我看来,你设计的那个应该可以正常工作:

测试

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 = "..."
    
    fmt.Println(re.ReplaceAllString(str, substitution))
}

表达式在 regex101.com, if you wish to explore/simplify/modify it, and in this link 的右上面板进行了解释,如果您愿意,可以观察它如何与一些示例输入匹配。

您的正则表达式必须工作正常。但是,字符集是多余的,因为您每组只使用数字。因此,它们可以被删除:

(\d{2,3})-(\d{2,3})-(\d{2,3})-(\d{2,3})

捕获的数据可以替换为:

...

Demo

实际目的是捕获实例的 IP 并通过查询将所有 IP 列为动态变量,然后通过 IP 启用所有节点指标。这是一个糟糕的方法,因为很多 prometheus node-metrics 是用标签 node=ip-XX-XX-XXX-XXX-<region>-.compute.internal 导出的(其中 XX 是数字)。 grafana 变量还报告仅匹配第一个 sub-group - 理想情况下它应该是所有子组。

但是,即使我要捕获子组说 XX.XX.XXX.XXX,这也意味着对于我需要捕获的每个指标和图表,我需要解决 EKS 节点中所有 IP 的匹配项 -这是不可能的,特别是如果我们想要启用 "All" 变量,其中 grafana 将变量调用替换为所有变量匹配的正则表达式。前任。如果我的 k8s 节点有以下 IP: * 10.10.0.1 * 10.10.0.2 * 10.10.0.3 我称这个变量为 Node Grafana 将列出以下变量: * 全部 * 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.compute.internal * ip-10-10-0-2.us-sdlls-as.compute.internal * ip-10-10-0-3.us-sdlls-as.compute.internal ) - as-is 这将使所有其他面板更加方便和易于配置。