• Kubernetes
  • 调用thanos的/api/v1/rules接口,match[]这个参数到底怎么传?

调用thanos的/api/v1/rules接口,match[]这个参数到底怎么传?

我是一个JAVA coder不会go语言,但是我现在有一个需求就是调用这个thanos接口获取所有的rules拿到所有的关于alerts的报警规则,然后需要根据labels中的key为namespace,value为前端传进去的任意值做筛选条件,返回匹配所有属于该namespace下的所有告警规则。

于是我仿照kubesphere里面的代码,写了一个简单的go程序

func main() {
	// 创建 Prometheus API 客户端
	client, err := api.NewClient(api.Config{
		Address: "http://thanos-ruler-operated.kubesphere-monitoring-system:10902",
	})
	u := client.URL("/api/v1/rules", nil)
	q := u.Query()
	q.Add("type", "alert")
	if err != nil {
		log.Fatalf("Error creating Prometheus client: %v", err)
	}

	matchers := []*promlabels.Matcher{{
		Type:  promlabels.MatchEqual,
		Name:  "rule_level",
		Value: "namespace",
	}, {
		Type:  promlabels.MatchEqual,
		Name:  "namespace",
		Value: "dec",
	}}
	vs := parser.VectorSelector{
		LabelMatchers: matchers,
	}
	q.Add("match[]", vs.String())

	fmt.Printf("Result:\n%v\n", q.Encode())

	u.RawQuery = q.Encode()

	// 打印结果
	fmt.Printf("Result:\n%v\n", u.String())
}

最终得到的了URL,但是这个URL生成之后,直接丢到浏览器上返回的结果是空的,求大神指导!

7 天 后

package main

import (
    "fmt"
    "log"
    "net/http"
    "io/ioutil"
    "github.com/prometheus/client_golang/api"
)

func main() {
    // 创建 Prometheus API 客户端
    client, err := api.NewClient(api.Config{
        Address: "http://thanos-ruler-operated.kubesphere-monitoring-system:10902",
    })
    if err != nil {
        log.Fatalf("Error creating Prometheus client: %v", err)
    }

    // 构造 URL
    u := client.URL("/api/v1/rules", nil)
    q := u.Query()
    q.Add("type", "alert")
    q.Add("match[]", `{rule_level="namespace", namespace="dec"}`)
    u.RawQuery = q.Encode()

    // 打印生成的 URL
    fmt.Printf("Generated URL:\n%v\n", u.String())

    // 发起 HTTP 请求
    resp, err := http.Get(u.String())
    if err != nil {
        log.Fatalf("Error fetching rules: %v", err)
    }
    defer resp.Body.Close()

    // 读取响应体
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Error reading response body: %v", err)
    }

    // 打印响应结果
    fmt.Printf("Response:\n%v\n", string(body))
}