繁体   English   中英

使用 prometheus 监控 go application net/http 指标

[英]Monitoring go application net/http metrics using prometheus

我正在用 Go 开发一个应用程序,它使用 net/http 包发出许多外部 http 请求/调用,我想监控 http 调用的延迟、响应时间、状态代码等。

由于我的应用程序调用了许多端点,并且将来可能会添加更多端点,因此我想考虑一种解决方案,该解决方案将获取所有此类外部 http 调用的指标。

非常感谢您对此的任何建议、指导或示例。 我正在考虑将中间件/包装器添加到 net/http 包中的 Do/Raw 调用中的某种方式,我可以创建和修改其副本,但我不确定如何执行此操作。

这是一个非常(!)的基本示例,它使用 Prometheus Counter抽象http.ClientDo方法,该Inc Counter 位于每个Do上,并用主机名、请求方法和响应代码标记Counter

package main

import (
    "log"
    "net/http"
    "strconv"
    "time"

    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

type Client struct {
    Client  *http.Client
    Counter *prometheus.CounterVec
}

func NewClient(counter *prometheus.CounterVec) *Client {
    return &Client{
        Client:  &http.Client{},
        Counter: counter,
    }
}

func (c *Client) Do(rqst *http.Request) (*http.Response, error) {
    resp, err := c.Client.Do(rqst)

    host := rqst.URL.Host
    code := strconv.Itoa(resp.StatusCode)
    c.Counter.With(prometheus.Labels{
        "host":          host,
        "response_code": code,
    }).Inc()

    return resp, err
}
func main() {

    metric := prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "foo",
            Help: "Number of HTTP requests.",
        },
        []string{
            "host",
            "response_code",
        },
    )
    prometheus.MustRegister(metric)

    c := NewClient(metric)

    go func() {
        for {
            method := http.MethodPost
            url := "https://httpbin.org/post"
            rqst, _ := http.NewRequest(method, url, nil)
            _, _ = c.Do(rqst)
            time.Sleep(15 * time.Second)
        }
    }()

    log.Println("Starting server")
    http.Handle("/metrics", promhttp.Handler())
    log.Fatal(http.ListenAndServe(":8080", nil))
}

和:

# HELP foo Number of HTTP requests.
# TYPE foo counter
foo{host="httpbin.org",method="POST",response_code="200"} 6```

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM