go-kit 微服务 服务监控(prometheus 实现)

  • 实现对登录方法的请求次数,与请求耗时进行监控

prometheus

  • 相关介绍使用请看文章《docker安装prometheus(普罗米修斯)》
  • Prometheus 的四种数据类型
    • Counter(计数器) 它是一个只能递增的数值,重启进程后会被重置 (例如记录:请求次数、任务完成数、错误发生次数)
    • Gauge(测量器) 它表示一个既可以递增, 又可以递减的值,重启进程后,会被重置 (例如 温度变化、CPU,内存,网络使用变化)
    • Histogram(柱状图)
      • 每个采样点进行统计,打到各个分类值中(bucket)
      • 对每个采样点值累计和(sum)
      • 对采样点的次数累计和(count)
      • 例如:请求耗时、响应大小。
    • Summary 类似histogram柱状图,summary是采样点分位图统计
      • 有一个quantiles的功能,可以按%比划分跟踪的结果。例如:quantile取值0.85,表示取采样值里面的85%数据。
      • 例如:请求耗时、响应大小。
  • 具体区别可看文档histogram和summaries

定义统计服务中间件

  • 创建metricsMiddlewareServer结构体
type metricsMiddlewareServer struct {
	next      Service
	counter   metrics.Counter
	histogram metrics.Histogram
}
  • 创建NewMetricsMiddlewareServer把统计对象嵌入中间件(其实就是对Service添加了一层装饰)
func NewMetricsMiddlewareServer(counter metrics.Counter, histogram metrics.Histogram) NewMiddlewareServer {
	return func(service Service) Service {
		return metricsMiddlewareServer{
			next:      service,
			counter:   counter,
			histogram: histogram,
		}
	}
}
  • 让metricsMiddlewareServer实现Service中的全部方法
func (l metricsMiddlewareServer) Login(ctx context.Context, in *pb.Login) (out *pb.LoginAck, err error) {
	defer func(start time.Time) {
		method := []string{"method","login"}
		l.counter.With(method...).Add(1)//统计请求次数
		l.histogram.With(method...).Observe(time.Since(start).Seconds())//统计请求耗时
	}(time.Now())
	out, err = l.next.Login(ctx, in)
	return
}

定义prometheus (Counter 与 Histogram)

count := metricsprometheus.NewCounterFrom(prometheus.CounterOpts{
	Subsystem: "user_agent",
	Name:      "request_count",
	Help:      "Number of requests",
}, []string{"method"})
histogram := metricsprometheus.NewHistogramFrom(prometheus.HistogramOpts{
	Subsystem: "user_agent",
	Name:      "request_consume",
	Help:      "Request consumes time",
}, []string{"method"})

实现 prometheus http服务

utils.GetLogger().Info("[user_agent] prometheus run " + *prometheusAddr)
m := http.NewServeMux()
m.Handle("/metrics", promhttp.Handler())
quitChan <- http.ListenAndServe(*prometheusAddr, m)

编写prometheus配置文件

  • prometheus.yml
global:
scrape_interval:     15s 
external_labels:
 monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'user_agent'
 metrics_path: "/metrics"
 scrape_interval: 5s
 static_configs:
   - targets: ['192.168.2.28:10001']

运行

  • 运行 TestNewUserAgentClient 方法 (调用Login接口20次)
  • 我们登录 http://127.0.0.1:9090/ prometheus后台查询信息

结语

  • prometheus的用法还有很多,这里只展示简单的统计接口请求量和请求耗时,还有监控mysql,redis等
  • 欢迎添加QQ一起讨论

完整代码地址

联系 QQ: 3355168235