【问题标题】:Regex: Grafana Variables convert hyphen separated IPs to Dot separated IPs正则表达式:Grafana 变量将连字符分隔的 IP 转换为点分隔的 IP
【发布时间】:2019-07-22 01:33:53
【问题描述】:

我正在尝试使用自定义查询在 Grafana 中创建一个变量,以扫描 EKS 集群中的节点。目前,节点变量存储为“连字符”分隔的字符串(例如 10-109-22-102);我打算将其报告为“点”分隔的字符串(例如 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="亚马逊 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

【问题讨论】:

    标签: regex go grafana prometheus re2


    【解决方案1】:

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

    测试

    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 中,您可以查看它如何与一些示例输入进行匹配,如果您愿意的话。

    【讨论】:

      【解决方案2】:

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

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

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

      $1.$2.$3.$4

      Demo

      【讨论】:

        【解决方案3】:

        实际意图是捕获实例的 IP,并通过查询将所有这些作为动态变量列出,然后通过 IP 启用所有节点指标。这是一种不好的方法,因为许多 prometheus 节点指标都是使用标签 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 我把这个变量称为节点 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 ) - 原样这将使所有其他面板更加方便和易于配置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多