开源我的项目地址:

我的项目地址: https://github.com/ning1875/prome-route
PS: 这是一个仅用时半天就写完的我的项目

架构图

prometheus HA

prometheus本地tsdb性能杰出,然而碍于其没有集群版本导致

实现伎俩

留神这些伎俩都是要数据的对立存储

  • 能够通过remote_write 到一个提供HA的tsdb存储中
  • 通过联邦收集到一个prometheus里

问题来了,搞不定集中式的tsdb集群,或者集群挂了咋办

本我的项目介绍

原理介绍

  • 必定有一组prometheus 服务器和pod用来采集各式各样的数据
  • 那么采集器上本地的数据就是一个个分片,采集器自身也能够充当查问的角色
  • 而且每个采集器下面的指标通过一个特色标签比方cluster/app等辨别
  • 通常是定义global.external_labels中的

    global:  external_labels:    cluster: a
  • 如果能有一个路由组件,晓得所有特色标签对应的采集器地址
shard_addr_map = {   "cluster_a": "1.1.1.1:9090",   "cluster_b": "2.2.2.2:9090",   "cluster_c": "3.3.3.3:9090",  }
  • 而后依据申请中的expr获取到特色标签,将其替换掉
  • 因为在采集器本地存储的时候没有特色标签
  • 转发到指定的采集器申请数据后再返回给grafana即可

须要适配的接口

prometheus 3大查问接口

  • instance_query : /api/v1/query 报警应用和以后点查问
  • range_query : /api/v1/query_range 查问一段时间的曲线
  • series : /api/v1/series 应用label_values查问变量

对应在代码中实现

func Routes(r *gin.Engine) {       qApi := r.Group("/")     qApi.GET("/api/v1/query_range", promeRangequery)     qApi.GET("/api/v1/query", promeInstancequery)     qApi.GET("/api/v1/series", promeSeriesQuery)    }

查问状态码不同时返回数据结构不同

这个很好解决,用interface即可

respBytes, err := ioutil.ReadAll(resp.Body)  if err != nil {     log.Error(err.Error())     c.String(http.StatusInternalServerError, fmt.Sprintf(`target prome %s error by %s=%s `, targetProme, keyName, labelName))     return  }  var respInterface interface{}  _ = json.Unmarshal(respBytes, &respInterface)    c.JSON(resp.StatusCode, respInterface)

优缺点

长处

  • 查问在各自采集器实现,不必受限于集中tsdb的可用性,挂了,也能够查到,查问相互不受影响
  • 数据保留工夫不受限于对立的tsdb配置,能够各自配置业务采集器
  • 查问limit参数也不再首先于对立的tsdb配置,放飞。。。
  • 组件无状态,只做转发,可横向扩容

毛病

  • 受限于对立的label特色

使用指南

适用范围

  • 不想保护tsdb集群
  • 给tsdb集群挂了时做备份查问
  • 查问时含有特色标签,采集器上数据没有特色标签

留神

  • 如果自身每个采集器下面的数据曾经有特色标签区别好了,那么须要改下本我的项目的代码间接转发即可
# build  git clone https://github.com/ning1875/prome-route.git  go build -o prome-route main.go     #批改配置文件  补充prome-route.yml中的信息:  replace_label_name: cluster # 特色标签,即grafana查问时用来辨别不同shard的label name   # 比方特色标签为cluster :node_memory_MemFree_bytes{cluster="a",node=~".+"}   # 代表查问分片a上的node_memory_MemFree_bytes数据  prome_servers:     a: 1.1.1.1:9090 # 各个分片采集器的value及其地址   b: 2.2.2.2:9090      http:   listen_addr: :9097   #启动服务  ./prome-route --config.file=prome-route.ymlsystemctl start prome-route# 在grafana中增加数据源地址填 $prome-route:9097 如1.1.1.1:9097