首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex: Grafana变量将连字符分隔的IP转换为Dot分离的IP

问Regex: Grafana变量将连字符分隔的IP转换为Dot分离的IP
EN

Stack Overflow用户
提问于 2019-07-22 01:33:53
回答 3查看 2.7K关注 0票数 0

我正在尝试使用自定义查询在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)作为唯一选项。

预期产出应是:

代码语言:javascript
复制
10.11.111.111
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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-这将使所有其他面板更加方便和易于配置。

票数 -1
EN

Stack Overflow用户

发布于 2019-07-22 03:25:28

在我看来,你设计的那个应该很好:

测试

代码语言:javascript
复制
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的右上面板上解释,如果您希望探索/简化/修改它,那么在此链接中,您可以观察它如何与某些示例输入相匹配(如果您愿意)。

票数 0
EN

Stack Overflow用户

发布于 2019-07-22 04:12:52

你的行刑一定很好。但是,字符集是多余的,因为您只使用每组数字。因此,它们可以被移除:

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

然后,可以将捕获的数据替换为:

$1.$2.$3.$4

演示

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57138246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档