mirror of
https://github.com/zhufuyi/sponge.git
synced 2025-10-12 20:20:08 +08:00
78 lines
2.0 KiB
Go
78 lines
2.0 KiB
Go
package metrics
|
|
|
|
import (
|
|
"net/http"
|
|
"sync"
|
|
|
|
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
// https://github.com/grpc-ecosystem/go-grpc-prometheus/tree/master/examples/grpc-server-with-prometheus
|
|
|
|
var (
|
|
// client side default router
|
|
clientPattern = "/rpc_client/metrics"
|
|
|
|
// create a Registry
|
|
cliReg = prometheus.NewRegistry()
|
|
|
|
// initialize the client's default metrics
|
|
grpcClientMetrics = grpc_prometheus.NewClientMetrics()
|
|
|
|
cliOnce sync.Once
|
|
)
|
|
|
|
func cliRegisterMetrics() {
|
|
cliOnce.Do(func() {
|
|
// register metrics, including custom metrics
|
|
cliReg.MustRegister(grpcClientMetrics)
|
|
})
|
|
}
|
|
|
|
// SetClientPattern set the client pattern
|
|
func SetClientPattern(pattern string) {
|
|
if pattern != "" {
|
|
clientPattern = pattern
|
|
}
|
|
}
|
|
|
|
// ClientRegister for http routing and grpc methods
|
|
func ClientRegister(mux *http.ServeMux) {
|
|
// register for http routing
|
|
mux.Handle(clientPattern, promhttp.HandlerFor(cliReg, promhttp.HandlerOpts{}))
|
|
}
|
|
|
|
// ClientHTTPService initialize the client's prometheus exporter service and use http://ip:port/metrics to fetch data
|
|
func ClientHTTPService(addr string) *http.Server {
|
|
httpServer := &http.Server{
|
|
Addr: addr,
|
|
Handler: promhttp.HandlerFor(cliReg, promhttp.HandlerOpts{}),
|
|
}
|
|
|
|
// run http server
|
|
go func() {
|
|
if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
panic("listen and serve error: " + err.Error())
|
|
}
|
|
}()
|
|
|
|
return httpServer
|
|
}
|
|
|
|
// ---------------------------------- client interceptor ----------------------------------
|
|
|
|
// UnaryClientMetrics metrics unary interceptor
|
|
func UnaryClientMetrics() grpc.UnaryClientInterceptor {
|
|
cliRegisterMetrics()
|
|
return grpcClientMetrics.UnaryClientInterceptor()
|
|
}
|
|
|
|
// StreamClientMetrics metrics stream interceptor
|
|
func StreamClientMetrics() grpc.StreamClientInterceptor {
|
|
cliRegisterMetrics()
|
|
return grpcClientMetrics.StreamClientInterceptor()
|
|
}
|