• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:开源项目-promeshard-consulwatch动态分片实现Prometheus采集端高可用

python 搞代码 4年前 (2022-02-20) 30次浏览 已收录 0个评论
文章目录[隐藏]

开源我的项目地址: 我的项目地址: https://github.com/ning1875/prome_shard

我的项目阐明

prometheus采集端单点问题

采集类型

  • 采集机器级别的指标
  • 采集k8s根底监控指标
  • 采集部署在lb前面的vm业务指标
  • 采集部署在pod里的业务指标
  • 采集各种中间件的指标 如kafka zk clickhouse等

面对如此简单的采集类型,个别会应用一批采集Prometheus各司其职

sd发现问题

面对不同的采集起源,有对应的服务发现类型,如k8s_sd,咱们批改Prometheus代码适配不同的服务发现类型,

  • 比方有一些指标挂在lb的前面,须要通过lb的服务发现来感知后端server的变动
  • 然而问题是每个采集器都是单点的,而且批改适配不同的发现源
  • 当然也可能够无脑启动多个雷同的采集器采集同一组jobs,配合remote_write等补足单点问题,但带来额定的老本开销

各自适配不同发现源毛病总结

  • prometheus版本无奈对立
  • 配置文件形形色色
  • 须要定义各种采集源或者sd办法

本我的项目介绍

应用一组采集器注册server到consul中,通过python反射运行定时工作,通过服务树等内部接口拿到targets池,一致性哈希分发给后端,对立通过file_sd失效,consul会对各组采集器实例做探活,当节点变动(宕机或扩容)会触发targets rebalance达到HA目标

架构阐明

  • 解析配置文件
  • 同步注册服务到consul中
  • 开启监听watch后果变动的消费者
  • 异步watch各服务
  • 触发/get_service生成哈希环
  • 定时获取指标列依据哈希环生成各个节点的专属文件
  • 通过ansible下发 sd_result文件并reload prometheus

现有形式

  • 配置文件定义方法名称和对应的实例列表,在get_targets中反射定义对应的办法
  • sd实质阐明:均能转换成file_sd,只须要给出对应的 target构造体就能够

consul watch问题

  • golang 中


在golang中能够轻松做到,代码地址 [开源我的项目 : dynamic-sharding: 解决pushgateway HA问题(https://segmentfault.com/a/11…

  • 本我的项目 python中略微简单,须要改为blocking query
 def block_get_health(self, service_name, service_hash_map, dq):
 index = None while True: try: index, d = self.consul.health.service(service_name, passing=True, index=index)
 if d: data = d new_nodes = [] for x in data: address = x.get("Service").get("Address") if address: new_nodes.append(address)
 old_nodes = service_hash_map[service_name].nodes
 if set(old_nodes) != set(new_nodes): logging.info("[new_num:{} old_num:{}][new_nodes:{} old_nodes:{}]".format( len(new_nodes), len(old_nodes), ",".join(new_nodes), ",".join(old_nodes),
 )) new_ring = ConsistentHashRing(100, new_nodes) service_hash_map[service_name] = new_ring dq.appendleft(str(service_name)) # dq.put(str(service_name)) M_SERVICE_CHANGES.labels(service_name=service_name, old_nodes=len(old_nodes),
 new_nodes=len(new_nodes)).set(len(new_nodes))
 except Exception as e: logging.error("[watch_error,service:{},error:{}]".format(service_name, e)) time.sleep(5) continue

采集器单点/固定分片问题

  • 无论是单点还是固定分片,都不是ha的,只有某一个分片的采集器挂了,那么损失对应的数据
  • 采纳consul_watch_service形式,依据返回的衰弱实例生成一致性哈希环
  • 将target做分片调配给衰弱的节点采集即可

应用办法

<code class="c">git clone https://github.com/ning1875/prome_shard

增加配置

填写config.yaml中的consul地址等

填写job 须要跟get_targets.py同步

  • get_targets.py 是prome_shard发现采集targets pool的办法
  • 应用时须要实现 GetTarget的办法,办法名须要和config.yaml中雷同
  • 比方 在config.yaml中 有个job名为scrape_prome_ecs_inf
  • 那么须要在 GetTarget中定义方法
 @classmethod
    def scrape_prome_ecs_inf(cls):
  • 这个办法返回值是发现到的target列表,形如
[{
 "labels": { "group": "SGT", "env": "prod", "service": "scrape_prome", "region": "ap-southeast-3", "scrape_type": "vm", }, "targets": [ "1.1.1.1:9090" ]}]
  • prome_shard依据返回的targets池做一致性哈希调配给配置中定义好的nodes

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:开源项目-promeshard-consulwatch动态分片实现Prometheus采集端高可用
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址