go-zero 内部集成了prometheus 来对服务的指标进行上报,其启动的时候也是实现了简单的初始化,
- 以一般的api /rpc 服务为例,一般在main函数里调用了 zrpc.MustNewServer/rest.MustNewServer 函数,进行grpc和第三方组件的初始化,所以当然prometheus 也在MustNewServer 这个函数里实现了初始化:
s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
proto.RegisterAssessServiceServer(grpcServer, svr)
if c.Mode == service.DevMode || c.Mode == service.TestMode {
reflection.Register(grpcServer)
}
})
- 在MustNewServer 函数内部,可以看到也是直接调用了NewServer , 这个函数 :
// MustNewServer returns a RpcSever, exits on any error.
func MustNewServer(c RpcServerConf, register internal.RegisterFn) RpcServer {
server, err := NewServer(c, register)
*if err != nil {
log.Fatal(err)
}
return server
}
- 在NewServer 这个函数里,调用了err = c.SetUp(); err != nil, SetUp()该函数即初始化了基本的第三方组件,
- setUp里,初始化了Prometheus 和 trace链路跟踪,初始化代码在这里:prometheus.StartAgent(sc.Prometheus)
初始化核心代码:
once.Do(func() {
enabled.Set(true)
threading.GoSafe(func() {
http.Handle(c.Path, promhttp.Handler())
addr := fmt.Sprintf(“%s:%d”, c.Host, c.Port)
logx.Infof(“Starting prometheus agent at %s”, addr)
if err := http.ListenAndServe(addr, nil); err != nil {
logx.Error(err)
}
})
})
其http.ListenAndServe(addr, nil),就是启动了一个http server, addr 为配置文件里Host和Port,所以Host就是Prometheus的启动地址, Port为监听端口,就是实现一个exporter功能
prometheus 本身实现了哪些指标上报?
抛开go-zero框架本身,我们也可以简单地实现一个go程序 的指标上报:
package main
import (
“github.com/prometheus/client_golang/prometheus/promhttp”
“net/http”
)
func main() {
http.Handle(“/metrics”, promhttp.Handler())
http.ListenAndServe(“:2080”, nil)
}
直接编译启动该服务,可以在Prometheus下面能看到上报的指标了:
http://192.168.1.82:2080/metrics
promhttp客户端本身实现了两个收集器,一个是 进程 基本信息,如CPU,内存,文件描述符等; 二是golang 程序本身的信息,如 GC, gouroutine 协程数等,这些指标就是我们在开发过程中需要关注的
process_cpu_seconds_total -CPU使用率,一般用来监听每隔一段时间的CPU使用率,一般是五分钟,可以设置指标为: sum(increase(process_cpu_seconds_total{job=”myprom-exporter”}[5m])),
就可以监听到每五分钟CPU使用情况
process_resident_memory_bytes - 常驻内存,是服务实际使用的内存,一般设置指标为:
process_resident_memory_bytes{job=”myprom-exporter”}/(10241024)
以M为单位,监听内存使用情况
*go_goroutines - 通过runtime.NumGoroutine()调用获取,可以看到监控,一个promhttp客户端启动,什么也不做,就已经开了6到 7个协程了
上面的几个指标是需要在项目中关注的, 更多的指标监控细节可以参考下面这篇文章:
https://juejin.cn/post/7027660874856792095