我有一个服务A,其中我使用Prometheus丢弃指标,A向另一个服务B发出一些出站请求.有没有方法可以获得从A到B的请求的指标?

例如,我想要A->B请求的度量计数和持续时间

推荐答案

可以使用prometheus.NewCounterVecprometheus.NewHistogramVec(或proemetheus.NewSummaryVec,取决于用例)来记录指标.

我们可以使用定制labels来识别谁是客户端,谁是服务器.通过这种方式,可以过滤出客户端的request countduration指标到特定的服务器.

以下是样例代码片段

client.go

package main

import (
    "net/http"
    "time"

    "github.com/labstack/echo/v4"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    requestCounter = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "client_request_count",
            Help: "Total number of requests from client",
        },
        []string{"client", "server", "method", "route", "status"},
    )

    durationHistorgram = prometheus.NewHistogramVec(
        prometheus.HistogramOpts{
            Name:    "client_request_duration_secs",
            Help:    "Duration of requests from Client",
            Buckets: []float64{0.1, 0.5, 1, 2, 5},
        },
        []string{"client", "server", "method", "route", "status"},
    )
)

func init() {
    prometheus.MustRegister(requestCounter)
    prometheus.MustRegister(durationHistorgram)
}

func main() {

    e := echo.New()
    e.GET("/", func(c echo.Context) error {

        // the request start time
        start := time.Now()
        req, err := http.NewRequest("GET", "http://localhost:8002", nil)
        if err != nil {
            return c.JSON(http.StatusInternalServerError, err.Error())
        }

        resp, err := http.DefaultClient.Do(req)
        if err != nil {
            return c.JSON(http.StatusInternalServerError, err.Error())
        }
        defer resp.Body.Close()

        labels := prometheus.Labels{
            "client": "Server A", // defines the client server
            "server": "Server B", // defines the outbound request server
            "method": "GET",// HTTP method
            "route":  "/", // Request route
            "status": resp.Status,// Response status
        }
        duration := time.Since(start).Seconds()

        // the duration
        durationHistorgram.With(labels).Observe(duration)

        // request api count
        requestCounter.With(labels).Inc()

        return c.String(http.StatusOK, "[Client -> Server] Request send and received")
    })

    e.GET("/metrics", echo.WrapHandler(promhttp.Handler()))

    if err := e.Start(":8001"); err != nil {
        panic(err)
    }
}

server.go

package main

import (
    "net/http"

    "github.com/labstack/echo/v4"
)

func main() {
    e := echo.New()

    e.GET("/", func(c echo.Context) error {
        return c.JSON(http.StatusOK, map[string]interface{}{
            "message": "response sending from server",
        })
    })

    if err := e.Start(":8002"); err != nil {
        panic(err)
    }
}

正如您在代码中看到的,这些是我们的定制标签.

 []string{"client", "server", "method", "route", "status"},

这些是标签值

labels := prometheus.Labels{
            "client": "Server A", // defines the client server
            "server": "Server B", // defines the outbound request server
            "method": "GET", // HTTP method
            "route":  "/", // Request route
            "status": resp.Status,// Response status
        }

最后,我们可以查询

client_request_count {client="Server A", server="Server B"}

The request Server A send to the Server B

image

References

Go相关问答推荐

Golang测试容器,无法使网络正常工作

使用GO从RDPMC获得价值

即使HTTP服务器正在使用GO和Protobuf、SQL Server启动,请求也不返回结果

CURL和Postman HTTP POST工作,但Golang请求失败,状态为400

为什么 mux.Vars() 返回空的 map[]

Go test "-run -" 标志执行测试更快

一个Go module可以和之前的非module模块发布在同一个路径下吗?

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

在两个单独的速率受限端点之间同步请求

Golang 中的泛型类型转换

在反向 GORM 中创建查询有一个关系

assert: mock: I don't know what to return because the method call was unexpected 在 Go 中编写单元测试时出错

如果 transaction.Commit 对带有 postgres 连接的 SQL 失败,您是否需要调用 transaction.RollBack

来自洪流公告的奇怪同行字段

我相信我正确地在 sRGB 和线性 RGB 之间进行了转换,那么为什么深色的结果看起来更糟呢?

在我的情况下,如何以正确的方式测试方法?

如何使用golang操作很长的字符串以避免内存不足

将 CSVExport 函数传递给处理程序 Gin

如何从字符串中删除多个换行符`\n`但只保留一个?

更改单个像素的 colored颜色 - Golang 图像