本文主要是介绍golang获取prometheus数据(prometheus/client_golang包),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu...
1. 创建链接
1.1 语法
- 语法
func NewClient(cfg Config) (Client, error)
- 结构体
type Config struct { Address string Client *http.Client RoundTripper http.RoundTripper }
- 示例
client, err = api.NewClient(api.Config{ Address: "http://10.10.182.112:9090", })
1.2 完整示例
package main import ( "fmt" "github.com/prometheus/client_golang/api" ) func CreatClient() (client api.Client, err error) { client, err = api.NewClient(api.Config{ Address: "http://10.10.182.112:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) retChina编程urn nil, err } return client, nil } func main() { client, err := CreatClient() if err != nil { fmt.Errorf("%+v", err) } if client != nil { fmt.Println("client创建成功") } }
2. 简单查询
2.1 语法
- 创建API实例
func NewAPI(c Client) API
- 查询
func (API) Query(ctx context.Context, query string, ts time.Time, opts ...Option) (Value, Warnings, error)
- 在context中设置超时
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
- 语法示例
v1api := proV1.NewAPI(Client) ctx := context.Background() result, warnings, err := v1api.Query(ctx, "up", time.Now(), proV1.WithTimeout(5*time.Second))
2.2 完整示例
package main import ( "context" "fmt" "github.com/prometheus/client_golang/api" proV1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/common/model" "time" ) var Client api.Client func init() { Client, _ = CreatClient() } func CreatClient() (client api.Client, err error) { client, err = api.NewClient(api.Config{ Address: "http://10.10.181.112:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) return nil, err } return client, nil } func Query() (result model.Value, err error) { v1api := proV1.NewAPI(Client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() result, warnings, err := v1api.Query(ctx, "up", time.Now(), proV1.WithTimeout(5*time.Second)) if err != nil { return nil, err } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } return result, nil } func main() { result, err := Query() if err != nil { fmt.Errorf("%q", err) } fmt.Printf("Result:\n%v\n", result) }
3. 范围值查询
3.1 语法
- 范围设置
type Range struct { Start, End time.Time Step time.Duration }
语法示例
r := proV1.Range{ Start: time.Now().Apythondd(-time.Hour), End: time.Now(), Step: time.Minute, }
- 范围查询
func (API) QueryRange(ctx context.Context, query string, r Range, opts ...Option) (Value, Warnings, error)
语法示例
result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r, proV1.WithTimeout(5*time.Second))
3.2 完整示例
package main import ( "context" "fmt" "github.com/prometheus/client_golang/api" proV1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/common/model" "time" ) var Client api.Client func init() { Client, _ = CreatClient() } func CreatClient() (client api.Client, err error) { client, err = api.NewClient(api.Config{ Address: "http://10.10.181.112:9090", }) ifjs err != nil { fmt.Printf("Error creating client: %v\n", err) return nil, err } return client, nil } func QueryRange() (result model.Value, err error) { v1api := proV1.NewAPI(Client) //ctx := context.Background() ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) r := proV1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } defer cancel() result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r, proV1.WithTimeout(5*time.Second)) if err != nil { return nil, err } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } return result, nil } func main() { result, err := QueryRange() if err != nil { fmt.Errorf("%q", err) } fmt.Printf("Result:\n%v\n", result) }
4. 获取指标名称和标签
4.1 语法
- 语法
func (API) Series(ctx context.Context, matches []string, startTime time.Time, endTime time.Time) ([]model.LabelSet, Warnings, error)
- 语法示例
lbls, warnings, err := v1api.Series(ctx, []string{ "{__name__=~\".+\",job=\"prometheus\"}", }, time.Now().Add(-time.Hour), time.Now())
说明:
- 数组里可以写多条
__name__
表示指标名,等号后边支持正则匹配。- 后边可以接一些label,同样支持正则。
比如示例中的job=\"prometheus\"
,是我们在prometheus配置文件里写的job名。
- LabelSet
type LabelSet map[LabelName]LabelValue
可以看到LabelSet实际是一个map,因此我们可以只打印示例中的指标名:
for _, lbl := range lbls { fmt.Println(lbl["__name__"]) }
4.1 完整示例(获取所有数据条目)
package main import ( "context" "fmt" "os" "time" "github.com/prometheus/client_golang/api" proV1 "github.com/prometheus/client_golang/api/prometheus/v1" ) var Client api.Client func init() { Client, _ = CreatClient() } func CreatClient() (client api.Client, err error) { client, err = api.NewClient(api.Config{ Address: "http://10.10.181.112:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) return nil, err } return client, nil } func ExampleAPI_series() { v1api := proV1.NewAPI(Client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() lbls, warnings, err := v1api.Series(ctx, []string{ //"{__name__=~\"scrape_.+\",job=\"node\"}", "{__name__=~\".+\"}", }, time.Now().Add(-time.Hour), time.Now()) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Println("Result:", len(lbls)) for _, lbl := range lbls { //fmt.Println(lbl["__name__"]) fmt.Println(lbl) } } func main() { ExampleAPI_series() }
【附官方示例】
https://github.com/prometheus/client_golang/blob/main/api/prometheus/v1/example_test.go
package v1_test import ( "context" "fmt" "net/http" "os" "time" "github.com/prometheus/common/config" "github.com/prometheus/client_golang/api" v1 "github.com/prometheus/client_golang/api/prometheus/v1" ) func ExampleAPI_query() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() result, warnings, err := v1api.Query(ctx, "up", time.Now(), v1.WithTimeout(5*time.Second)) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_queryRange() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", }) if err != nil { fmt编程.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r, v1.WithTimeout(5*time.Second)) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } type userAgentRoundTripper struct { name string rt http.RoundTripper } // RoundTrip implements the http.RoundTripper interface. func (u userAgentRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { if r.UserAgent() == "" { // The specification of http.RoundTripper says that it shouldn't mutate // the request so make a copy of req.Header since this is all that is // modified. r2 := new(http.Request) *r2 = *r r2.Header = make(http.Header) for k, s := range r.Header { r2.Header[k] = s } r2.Header.Set("User-Agent", u.name) r = r2 } return u.rt.RoundTrip(r) } func ExampleAPI_queryRangeWithUserAgent() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", RoundTripper: userAgentRoundTripper{name: "Client-Golang", rt: api.DefaultRoundTripper}, }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_queryRangeWithBasicAuth() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", // We can use amazing github.com/prometheus/common/config helper! RoundTripper: config.NewBasicAuthRoundTripper("me", "defintely_me", "", api.DefaultRoundTripper), }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_queryRangeWithAuthBearerToken() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", // We can use amazing github.com/prometheus/common/config helper! RoundTripper: config.NewAuthorizationCredentialsRoundTripper("Bearer", "secret_token", api.DefaultRoundTripper), }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() r := v1.Range{ Start: time.Now().Add(-time.Hour), End: time.Now(), Step: time.Minute, } result, warnings, err := v1api.QueryRange(ctx, "rate(prometheus_tsdb_head_samples_appended_total[5m])", r) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Printf("Result:\n%v\n", result) } func ExampleAPI_series() { client, err := api.NewClient(api.Config{ Address: "http://demo.robustperception.io:9090", }) if err != nil { fmt.Printf("Error creating client: %v\n", err) os.Exit(1) } v1api := v1.NewAPI(client) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() lbls, warnings, err := v1api.Series(ctx, []string{ "{__name__=~\"scrape_.+\",job=\"node\"}", "{__name__=~\"scrape_.+\",job=\"prometheus\"}", }, time.Now().Add(-time.Hour), time.Now()) if err != nil { fmt.Printf("Error querying Prometheus: %v\n", err) os.Exit(1) } if len(warnings) > 0 { fmt.Printf("Warnings: %v\n", warnings) } fmt.Println("Result:") for _, lbl := range lbls { fmt.Println(lbl) } }
到此这篇关于golang获取prometheus数据(prometheus/client_golang包)的文章就介绍到这了,更多相关golang获取prometheus内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于golang获取prometheus数据(prometheus/client_golang包)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!