分享
  1. 首页
  2. 文章

开源项目 : prome-route: 使用反向代理实现prometheus分片

ning1875 · · 1036 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

开源项目地址:

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

架构图

image

prometheus HA

prometheus本地tsdb性能出色,但是碍于其没有集群版本导致HA较差

实现手段

注意这些手段都是要数据的统一存储

  • 可以通过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.yml
systemctl start prome-route
# 在grafana中添加数据源地址填 $prome-route:9097 如1.1.1.1:9097

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1036 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏