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

标签 regex go grafana prometheus re2

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

格拉法纳 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-*/ 来提取“连字符”分隔的 IP。我也尝试过使用其他匹配组,例如: ([\d]{2,3})-([\d]{2,3})-([\d]{2,3})-( [\d]{2,3}) 但是,这仅返回 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 = "$1.$2.$3.$4"
    
    fmt.Println(re.ReplaceAllString(str, substitution))
}

表达式在 regex101.com 的右上面板中进行了解释, 如果你想探索/简化/修改它,在this link ,如果愿意,您可以观察它如何与一些样本输入相匹配。

关于正则表达式:Grafana 变量将连字符分隔的 IP 转换为点分隔的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57138246/

相关文章:

prometheus - PromQL 查询以选择其值包含在给定多选变量中的指标

ruby - 正则表达式从电子邮件地址中查找名称

regex - 如何在 linux shell 中使用 sed 选择内容

javascript - 接受正数和负数的正则表达式

go - 复合类型和指针方法

mysql - 如何将Grafana的Docker容器连接到MySql的Docker容器?

python - 返回与 python 重复出现的正则表达式匹配

go - 显示无盲点的功能测试覆盖率

linux - 在 Go 中,为什么 "File.Readdirnames"会进行 "clock_gettime"系统调用?

docker - 如何将 Mysql docker 容器连接到 Grafana