golang服务如何使用普罗米修斯进行监控

  介绍

golang服务如何使用普罗米修斯进行监控?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、普罗米修斯基本原理介绍

普罗米修斯是基度规于采样的监控,可以自定义监控指标,如:服务每秒请求数,请求失败数,请求执行时间等,每经过一个时间间隔,数据都会从运行的服务中流出,存储到一个时间序列数据库中,之后可通过PromQL语法查询。

主要特点:

多维数据模型,时间序列数据通过指标名以键,值的形式标识;

使用PromQL语法灵活地查询数据;

不需要依赖分布式存储,各服务器节点是独立自治的;

时间序列的收集,通过HTTP调用,基于拉模型进行拉取;

通过将网关推送时间序列;

通过服务发现或者静态配置,来发现目标服务对象,

多种绘图和仪表盘的可视化支持,

二,普罗米修斯使用码头工人部署

查看是否有镜像

 sudo码头工人搜索普罗米修斯

新建普罗米修斯。yaml

全球:   scrape_interval: 10年代   evaluation_interval: 60年代         scrape_configs:   - job_name:普罗米修斯   static_configs:   ——目标:[& # 39;localhost: 9090 & # 39;】   - job_name:积分   static_configs:   ——目标:[& # 39;10.20.xx.xx: 8001 & # 39;]

执行:

码头工人运行——名称普罗米修斯- p 9090:9090 - v ~/prometheus.yaml:/etc/普罗米修斯/普罗米修斯。yml舞会/普罗米修斯

进入容器中可以看到配置文件已映射到容器指定目录:

 golang服务如何使用普罗米修斯进行监控

踩坑:普罗米修斯官方镜像指定的配置文件是普罗米修斯。yml所以映射到容器内的文件名一定要保持一致否则会出现指定的配置文件不生效

三,普罗米修斯整体架构及各组件

 golang服务如何使用普罗米修斯进行监控

普罗米修斯服务器:主程序,负责抓取和存储时序数据;

客户端库:客户端库,负责检测应用程序代码;

推网关:推网关,接收短生命周期的工作主动推送的时序数据;

出口商:为不同服务定制的出口国(如:HAProxy StatsD、石墨等),从而抓取它们的metri指标数据;

预警管理:告警管理器,处理不同的告警;

四,普罗米修斯客户端调用示例

自定义普罗米修斯的杜松子酒中间件

包ginprometheus
  
  导入(
  “strconv"
  “sync"
  “time"
  
  “;github.com/gin-gonic/gin"
  “;github.com/prometheus/client_golang/prometheus"
  )
  
  常量(
  metricsPath=?metrics"
  faviconPath=?favicon.ico"
  )
  
  var (//httpHistogram普罗米修斯模型
  httpHistogram=prometheus.NewHistogramVec (prometheus.HistogramOpts {
  名称空间:“http_server"
  子系统:““,
  名称:“requests_seconds",
  帮助:“直方图的响应延迟(秒)干净自己的http处理程序,
  ConstLabels: nil,
  桶:nil,
  {},[]字符串“method",“code",“uri"})
  )//初始化初始化普罗米修斯模型
  func init () {
  prometheus.MustRegister (httpHistogram)
  }//handlerPath定义采样路由结构体
  handlerPath struct类型{
  sync.Map
  }//获得获取路径
  func(惠普* handlerPath)得到字符串(字符串处理程序){
  v, ok:=hp.Load(处理器)
  如果!好{
  返回“;“
  }
  返回诉(字符串)
  }//设置保存路径到sync.Map
  func(惠普* handlerPath)组(ri gin.RouteInfo) {
  hp.Store (ri。处理程序,ri.Path)
  }//GinPrometheus杜松子酒调用普罗米修斯的结构
  GinPrometheus struct类型{
  引擎* gin.Engine
  忽略了map [string] bool
  路径映射* handlerPath
  bool更新
  }
  
  类型选择func (* GinPrometheus)//忽略添加忽略的路径
  函数忽略(路径…字符串)选项{
  返回func (gp * GinPrometheus) {
  _,p:={范围路径
  全科医生。忽略了[p]=true
  }
  }
  }//新杜松子酒普罗米修斯
  func (e *杜松子酒。引擎,选项…选项)* GinPrometheus {
  如果e==nil {
  返回nil
  }
  
  医生:=,GinPrometheus {
  引擎:e,
  忽略:map [string] bool {
  metricsPath:没错,
  faviconPath:没错,
  },
  路径映射:,handlerPath {},
  }
  
  _,o:={范围选择
  o (gp)
  }
  返回的全科医生
  }//updatePath更新路径
  func (gp * GinPrometheus) updatePath () {
  全科医生。更新=true
  _,ri:=gp.engine.Routes范围(){
  gp.pathMap.set (ri)
  }
  }//中间件杜松子酒的中间件
  func (gp * GinPrometheus)中间件()杜松子酒。HandlerFunc {
  返回func (c * gin.Context) {
  如果!医生。{更新
  gp.updatePath ()
  }//过滤请求
  如果gp.ignored c.Request.URL.String ()) {
  c.Next ()
  返回
  }
  
  开始:=time.Now ()
  c.Next ()
  
  httpHistogram.WithLabelValues (
  c.Request.Method,
  strconv.Itoa (c.Writer.Status ()),
  gp.pathMap.get (c.HandlerName ()),
  ).Observe (time.Since(开始),接着())
  }
  }

golang服务如何使用普罗米修斯进行监控