其他
编写 Prometheus Exporter: 以阿里云 Exporter 为例
作者:吴叶磊
来源:https://aleiwu.com/post/aliyun-exporter-bp/
何为 Prometheus Exporter?
Prometheus 监控基于一个很简单的模型: 主动抓取目标的指标接口(HTTP 协议)获取监控指标, 再存储到本地或远端的时序数据库. Prometheus 对于指标接口有一套固定的格式要求, 格式大致如下:
# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="post",code="200"} 1027
http_requests_total{method="post",code="400"} 3
Linux 的很多指标信息以文件形式记录在 /proc/ 下的各个目录中, 如 /proc/meminfo 里记录内存信息, /proc/stat 里记录 CPU 信息; Redis 的监控信息需要通过 INFO 命令获取; 路由器等硬件的监控信息需要通过 `SNMP** 协议获取; …
编写一个代理服务, 将其它监控信息转化为 Prometheus 格式的指标
为什么要写 Exporter?
嗯, 写 exporter 可以把监控信息接进 Prometheus, 那为什么非要接进 Prometheus 呢?
Adhoc TopN 查询: 比如”找到当前对公网带宽消耗最大的 10 台服务器”; 容量规划: 比如”分析过去一个月某类型服务的资源用量”; 高级报警: 比如”对比过去一周的指标值, 根据标准差进行报警”; 整合业务监控: 业务的监控信息存在于另一套监控系统中, 两套系统的看板, 警报都很难联动;
写一个好用的 Exporte
类似 “阿里云 Exporter” 这种形式的 Exporter 是非常好写的, 逻辑就是一句话:
写一个 Web 服务, 每当 Prometheus 请求我们这个服务问我们要指标的时候, 我们就请求云监控的 API 获得监控信息, 再转化为 Prometheus 的格式返回出去;
1、从文档开始
Prometheus 官方文档中 Writing Exporter 这篇写得非常全面, 假如你要写 exporter 推荐先通读一遍, 限于篇幅, 这里只概括一下:
做到开箱即用(默认配置就可以直接开始用) 推荐使用 YAML 作为配置格式 指标使用下划线命名 为指标提供 HELP String (指标上的 # HELP 注释, 事实上这点大部分 exporter 都没做好) 为 Exporter 本身的运行状态提供指标 可以提供一个落地页
2、可配置化
官方文档里讲了 Exporter 需要开箱即用, 但其实这只是基本需求, 在开箱即用的基础上, 一个良好的 Exporter 需要做到高度可配置化. 这是因为大部分 Exporter 暴露的指标中, 真正会用到的大概只有 20%, 冗余的 80% 指标不仅会消耗不必要的资源还会拖累整体的性能. 对于一般的 Exporter 而言, BP 是默认只提供必要的指标, 并且提供 extra 和 filter 配置, 允许用户配置额外的指标抓取和禁用一部分的默认指标. 而对于阿里云 Exporter 而言, 由于阿里云有数十种类型的资源(RDS, ECS, SLB…), 因此我们无法推测用户到底希望抓哪些监控信息, 因此只能全部交给用户配置. 当然, 项目还是提供了包含 SLB, RDS, ECS 和 Redis 的默认配置文件, 尽力做到开箱即用.
3、Info 指标
针对指标标签(Label), 我们考虑两点: “唯一性” 和 “可读性”:
序列B {id="foo", name="新名字"} .................
ecs_info{id="foo", name="DIO", os="linux", region="hangzhou", cpu="4", memory="16GB", ip="188.188.188.188"} 1
# 这条 PromQL 将 aliyun_meta_rds_info 中记录的描述和状态从添加到了 aliyun_acs_rds_dashboard_MemoryUsage 中
aliyun_acs_rds_dashboard_MemoryUsage
* on (instanceId) group_left(DBInstanceDescription,DBInstanceStatus)
aliyun_meta_rds_info
4、记录 Exporter 本身的信息
任何时候元监控(或者说自监控)都是首要的, 我们不可能依赖一个不被监控的系统去做监控. 因此了解怎么监控 exporter 并在编写时考虑到这点尤为重要.
aliyun_acs_rds_dashboard_MemoryUsage{id="foo"} 1233456
aliyun_acs_rds_dashboard_MemoryUsage{id="bar"} 3215123
aliyun_acs_rds_dashboard_MemoryUsage_up 1
5、设计落地页
用过 node_exporter 的会知道, 当访问它的主页, 也就是根路径 / 时, 它会返回一个简单的页面, 这就是 exporter 的落地页(Landing Page).
6、可选: 一键起监控
这一点超出了 exporter 本身的范畴, 但确确实实是 exporter “好用” 的一个极大助力. exporter 本身是无法单独使用的, 而现实情况是 Prometheus, Grafana, Alertmanager 再对接 Slack, 钉钉啥的, 这一套假如需要从头搭建, 还是有一定的门槛(用 k8s 的话至少得看一下 helm chart 吧), 甚至于有些时候想搭建监控的是全栈(gan)工程师, 作为全公司的独苗, 很可能更多的精力需要花在跟进前端的新技术上(不我没有黑前端…). 这时候, 一个一键拉起整套监控系统的命令诱惑力是非常大的.
结语
你可能已经看出来了, 这篇文章的本意是打广告(当然, 我已经非常努力地写了我所认为的”干货”!). aliyun-exporter 这个项目其实最开始只是我练习 Python 用的, 但在前几天碰到一位用户告诉我他们在生产中使用了这个项目, 这给了莫大的鼓舞, 正好我还没有在公开场合 Promote 过这个项目, 因此这周就捞一把, 希望项目本身或这些衍生出来的经验中有一样能帮到大家吧.
- END -
往期推荐:
Docker 网络 host、bridge、macvlan 工作原理
Kubernetes + Jenkins + Helm + Springboot 实践
Kubeadm 部署高可用 Kubernetes 集群
在 Kubernetes 中部署 Jenkins
Kubernetes 污点与容忍详解
构建和管理容器的 10 个技巧
🔥 1万位K8S爱好者都在这里,您值得关注!