Prometheus HTTP SD 框架

Prometheus 是现在比较流行的监控系统,它的工作模式是拉的模式:要监控的目标要负责把 metris 数据暴露出来,格式是普通的文本格式,协议是 HTTP,就像开放了一个普通的 HTTP 服务一样,然后 Prometheus 定时来这些 HTTP 接口收集 metrics,保存起来。

那么如何告诉 Prometheus 应该去哪里抓取这些 metrics 呢?

你可以直接把要抓取的目标写在 Prometheus 的配置文件里面去。但是这样一些经常变动的目标就不是很友好。

Prometheus 本身支持很多服务发现,比如 consul_sd, 配置一个 consul 的地址,Prometheus 会通过 Consul 发现抓取的目标。还有其他的一些支持云上的发现方式,比如 aws 的 ec2_sd 等。

但是也有很多是不支持的,比如 Etcd,Redis 等就不支持。

更重要的是,很多公司都会有自己内部的一些 cmdb 管理系统,机器资源管理系统,服务治理等,如果要让 Prometheus 自动根据这些信息去抓取 metrics,一种方法是定期向 Prometheus 支持的一种 sd 去同步数据。另一种方法是使用 Prometheus 的 file_sd 或者 http_sd, 即将自己的信息转换成某种 Prometheus 能够直接使用的格式。

prometheus-http-sd 就是这样一个框架,它支持用户自定义编程,通过实现一个 generate_targets() 函数,来返回 Prometheus 的 targets 格式。

然后,启动 prometheus-http-sd,它会 listen 一个端口,通过 HTTP 的服务暴露出来抓取的目标,给 Prometheus 做服务发现。每次 Prometheus 发送来 HTTP 请求的时候,会向后端去调用用户定义的 generate_targets() 函数,然后将函数的返回结果通过 HTTP Response 返回给 Prometheus。

这个项目的想法和 prometheus 的本职一样,所有的东西都通过 http 暴露出来 (metrics),如果你有一个接口,那么你就可以将其转换成 http 格式的 metrics;如果你有一个数据源,那么你就可以将其转换成 HTTP 格式的 targets。

https://github.com/laixintao/prometheus-http-sd

它以树状的目录组织 targets,即你可以将同一级不同目录的 targets 分配给不同的 Prometheus 实例来抓取。这样,也支持同一组目标用两个 job 来抓不同的 metrics 路径。

支持热加载,如果修改了 target generator 不需要重启应用。推荐用户使用 git 维护 target generator,然后只要更新这个文件夹就可以了。

支持 Dry run 模式,这样就可以将 prometheus-http-sd 集成到 CI 里面,每次修改 target generator 就可以在 CI 里面自动检查目标生成是否符合 Prometheus 的规范,Python 代码是否有问题。

除了支持用 Python 文件定义抓取目标,还支持静态的文件定义目标,支持 json,和 Yaml(Prometheus 原生的 file_sd 不支持 Yaml,不知道为啥)。

另外 prometheus-http-sd 本身也支持暴露 metrics,可以监控自身,比如 latency,generator 被调用的次数,生成的目标数量等等。

支持 admin 页面,可以用来 debug。

……

其他的一些功能大家可以直接看 Github 的项目主页,一些新加的 feature 都会写在 readme 上面。

目前使用下来,就是我们内部的一些系统比较慢,Prometheus 每 60s 一次来做服务发现的话,会导致有的时候会超时,虽然这大部分时候不是因为一个问题,因为 Prometheus 在 http_sd 失败的时候,会继续使用上一次的结果,但是为了保护后端的系统,我打算给 http_sd 加一个 cache 的功能。



Leave a comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注