go-zero 内部集成了prometheus 来对服务的指标进行上报,其启动的时候也是实现了简单的初始化,

    1. 以一般的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)
    }
    })

    1. 在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
    }

    1. 在NewServer 这个函数里,调用了err = c.SetUp(); err != nil, SetUp()该函数即初始化了基本的第三方组件,
    2. setUp里,初始化了Prometheus 和 trace链路跟踪,初始化代码在这里:prometheus.StartAgent(sc.Prometheus)
    3. 初始化核心代码:

      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个协程了
    image.png
    上面的几个指标是需要在项目中关注的, 更多的指标监控细节可以参考下面这篇文章:
    https://juejin.cn/post/7027660874856792095