美文网首页
golang获取prometheus数据(prometheus/

golang获取prometheus数据(prometheus/

作者: 玄德公笔记 | 来源:发表于2023-09-04 22:06 被阅读0次

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)
        return 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().Add(-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",
    })
    if 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)
}

【附官方示例】

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/

      本文链接:https://www.haomeiwen.com/subject/ppvcvdtx.html