진 프레임워크에서 동적 레이블로 사용자 정의 프로메테우스 메트릭 노출
19189 단어 goginprometheusmonitoring
즉시 사용 가능한 측정항목
/metrics 엔드포인트를 통해 기본적으로 제공되는 메트릭을 노출하는 gin go 애플리케이션을 가동합니다.
package main
import (
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus/promhttp"
"log"
)
func main() {
r := gin.Default()
r.GET("/metrics", func(c *gin.Context) {
handler := promhttp.Handler()
handler.ServeHTTP(c.Writer, c.Request)
})
err := r.Run(":8080")
if err != nil {
log.Fatalln(err)
}
}
명령
go run main.go
을 사용하여 애플리케이션을 실행하고/metrics
를 누르면 다음이 표시됩니다.$ curl http://localhost:8080/metrics
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
# HELP go_threads Number of OS threads created.
# TYPE go_threads gauge
go_threads 7
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1
(간단함을 위해 위의 내용을 잘랐습니다.)
맞춤 last_request_received_time 측정항목
이제 마지막 요청 타임 스탬프인 사용자 지정 메트릭을 노출하겠습니다.
이 사용 사례에서 gauge data type 값을 타임스탬프로 "설정"합니다.
package main
import (
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"log"
)
func main() {
r := gin.Default()
// Gauge registration
lastRequestReceivedTime := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "last_request_received_time",
Help: "Time when the last request was processed",
})
err := prometheus.Register(lastRequestReceivedTime)
handleErr(err)
// Middleware to set lastRequestReceivedTime for all requests
r.Use(func(context *gin.Context) {
lastRequestReceivedTime.SetToCurrentTime()
})
// Metrics handler
r.GET("/metrics", func(c *gin.Context) {
handler := promhttp.Handler()
handler.ServeHTTP(c.Writer, c.Request)
})
err = r.Run(":8080")
handleErr(err)
}
func handleErr(err error) {
if err != nil {
log.Fatalln(err)
}
}
이제 메트릭 엔드포인트에 도달하면 새로 생성된
last_request_received_time
메트릭을 관찰할 수 있습니다.$ curl http://localhost:8080/metrics
# HELP last_request_received_time Time when the last request was processed
# TYPE last_request_received_time gauge
last_request_received_time 1.63186694449664e+09
(간결함을 위해 다른 측정항목을 제거했습니다)
동적 라벨이 있는 맞춤 last_request_received_time
이제 이것을 HTTP 헤더(예: userId, 작업 유형)를 기반으로 분류한다고 가정해 보겠습니다. 이것이 의미하는 것은 레이블 이름은 일정하지만 값이 다르다는 것입니다.
이 경우 라이브러리에 GaugeVec 유형이 있습니다.
package main
import (
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"log"
"net/http"
)
var (
HeaderUserId = "user_id"
HeaderOperationType = "operation_type"
)
func main() {
r := gin.Default()
// Gauge registration
lastRequestReceivedTime := prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "last_request_received_time",
Help: "Time when the last request was processed",
}, []string{HeaderUserId, HeaderOperationType})
err := prometheus.Register(lastRequestReceivedTime)
handleErr(err)
// Metrics handler
r.GET("/metrics", func(c *gin.Context) {
handler := promhttp.Handler()
handler.ServeHTTP(c.Writer, c.Request)
})
// Middleware to set lastRequestReceivedTime for all requests
middleware := func(context *gin.Context) {
lastRequestReceivedTime.With(prometheus.Labels{
HeaderUserId: context.GetHeader(HeaderUserId),
HeaderOperationType: context.GetHeader(HeaderOperationType),
}).SetToCurrentTime()
}
// Request handler
r.GET("/data", middleware, func(c *gin.Context) {
c.JSON(http.StatusOK, map[string]string{"status": "success"})
})
err = r.Run(":8080")
handleErr(err)
}
func handleErr(err error) {
if err != nil {
log.Fatalln(err)
}
}
$ curl -H "user_id: user1" -H "operation_type: fetch" http://localhost:8080/data
{"status":"success"}
$ curl -H "user_id: user1" -H "operation_type: view" http://localhost:8080/data
{"status":"success"}
$ curl -H "user_id: user1" -H "operation_type: upload" http://localhost:8080/data
{"status":"success"}
$ curl http://localhost:8080/metrics
# HELP last_request_received_time Time when the last request was processed
# TYPE last_request_received_time gauge
last_request_received_time{operation_type="fetch",user_id="user1"} 1.6318757060797539e+09
last_request_received_time{operation_type="upload",user_id="user1"} 1.631875691071805e+09
last_request_received_time{operation_type="view",user_id="user1"} 1.631875931726781e+09
동일한 측정항목에 대해 위에서 볼 수 있듯이 서로 다른 값 레이블이 있습니다.
이에 대한 코드는 다음에서 사용할 수 있습니다.
https://github.com/kishaningithub/lastrequesttimemetrics
피드백 환영합니다 :-)
참고문헌
Reference
이 문제에 관하여(진 프레임워크에서 동적 레이블로 사용자 정의 프로메테우스 메트릭 노출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kishanbsh/capturing-custom-last-request-time-metrics-using-prometheus-in-gin-36d6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)