[英]Monitoring go application net/http metrics using prometheus
我正在用 Go 开发一个应用程序,它使用 net/http 包发出许多外部 http 请求/调用,我想监控 http 调用的延迟、响应时间、状态代码等。
由于我的应用程序调用了许多端点,并且将来可能会添加更多端点,因此我想考虑一种解决方案,该解决方案将获取所有此类外部 http 调用的指标。
非常感谢您对此的任何建议、指导或示例。 我正在考虑将中间件/包装器添加到 net/http 包中的 Do/Raw 调用中的某种方式,我可以创建和修改其副本,但我不确定如何执行此操作。
这是一个非常(!)的基本示例,它使用 Prometheus Counter
抽象http.Client
的Do
方法,该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.