想必大家对于黑盒监控都不陌生,我们经常使用blackbox_exporter来进行黑盒监控,在K8s中进行黑盒监控可以参考这里。
既然已经有成熟的工具,为何自己还要再来尝试开发一个?
我说是为了学习,你信吗?
既然是为了学习,整体逻辑就不用太复杂,主要需要实现以下功能:
- 可以通过配置文件的方式增加监控项
- 吐出Prometheus可收集指标
- 支持tcp和http探测
- 支持配置检测频率
写在前面
在正式开始之前,先简单介绍一下Prometheus以及Prometheus Exporter。
Prometheus是CNCF的一个开源监控工具,是近几年非常受欢迎的开源项目之一。在云原生场景下,经常使用它来进行指标监控。
Prometheus支持4种指标类型:
- Counter(计数器):只增不减的指标,比如请求数,每来一个请求,该指标就会加1。
- Gauge(仪表盘):动态变化的指标,比如CPU,可以看到它的上下波动。
- Histogram(直方图):数据样本分布情况的指标,它将数据按Bucket进行划分,并计算每个Bucket内的样本的一些统计信息,比如样本总量、平均值等。
- Summary(摘要):类似于Histogram,也用于表示数据样本的分布情况,但同时展示更多的统计信息,如样本数量、总和、平均值、上分位数、下分位数等。
在实际使用中,常常会将这些指标组合起来使用,以便能更好的观测系统的运行状态和性能指标。
这些指标从何而来?
Prometheus Exporter就是用来收集和暴露指标的工具,通常情况下是Prometheus Exporter收集并暴露指标,然后Prometheus收集并存储指标,使用Grafana或者Promethues UI可以查询并展示指标。
Prometheus Exporter主要包含两个重要的组件:
- Collector:收集应用或者其他系统的指标,然后将其转化为Prometheus可识别收集的指标。
- Exporter:它会从Collector获取指标数据,并将其转成为Prometheus可读格式。
那Prometheus Exporter是如何生成Prometheus所支持的4种类型指标(Counter、Gauge、Histogram、Summary)的呢?
Prometheus提供了客户端包github.com/prometheus/client_golang,通过它可以声明不通类型的指标,比如:
上面的例子都是直接在创建指标的时候声明了指标描述,我们也可以先声明描述,再创建指标,比如:
通过上面的介绍,对于怎么创建一个Prometheus Exporter是不是有了初步的了解?主要可分为下面几步:
- 定义一个Exporter结构体,用于存放描述信息
- 实现Collector接口
- 实例化exporter
- 注册指标
- 暴露指标
现在开始
有了一定的基本知识后,我们开始开发自己的Exporter。
我们再来回顾一下需要实现的功能:
- 可以通过配置文件的方式增加监控项
- 吐出Prometheus可收集指标
- 支持tcp和http探测
- 支持配置检测频率
(1)我们的采集对象是通过配置文件加载的,所以我们可以先确定配置文件的格式,我希望的是如下格式:
其中check_interval是检测频率,如果不写,默认是1s。
我们需要解析配置文件里的内容,所以需要先定义配置文件的结构体,如下:
然后,我们使用的是yaml格式的配置文件,保存在config.yaml文件中,意味着我们需要解析config.yaml这个文件,然后再解析。
因为监控对象可以是多个,所以使用[]InterfaceConfig{}来保存多个对象。
(2)定义接口探测的Collector接口,实现Promethues Collector接口
这里将配置文件也放进去,期望在初始化HealthCollector的时候将配置文件一并加载了。
在这里定义了[]string{"name", "url", "protocol"}动态标签,方便使用PromQL查询指标和做监控告警。
(3)实现Prometheus Collector接口的Describe和Collect方法
在Collect方法中,我们通过checkInterfaceHealth来获取检测对象的监控状态,然后创建Prometheus对应的指标,这里规定1就是存活状态,0就是异常状态。
(4)实现http和tcp检测方法
http和tcp的检测方法这里比较粗暴,http的就请求一次查看状态码,tcp的就检查能不能建立连接。
(5)创建main方法,完成开发。
在这里增加了解析命令行参数,支持通过--config的方式来指定配置文件,如果不指定默认使用config.yaml。
到这里就开发完了,虽然没有严格在写在前面中梳理的开发步骤,但是整体大差不差。
应用部署
开发出来的东西如果不上线,那就等于没做,你的KPI是0,领导才不关心你做事的过程,只看结果。所以不论好或是不好,先让它跑起来才是真的好。
(1)编写Dockerfile,当然要用容器来运行应用了。
(2)编写docker-compose配置文件,这里直接使用docker-compose部署,相比K8s的yaml来说更简单快捷。
使用docker-compose up -d运行容器后,就可以使用curl http://127.0.0.1:2112/metrics查看指标。
收集展示
Prometheus的搭建这里不再演示,如果有不清楚的,可以移步这里。
在Prometheus里配置抓取指标的配置:
配置完重载prometheus,可以查看抓取的target是否存活。
最后,为了方便展示,可以创建一个Grafana面板,比如:
当然,可以根据需要创建告警规则,当interface_health_status==0表示接口异常。
最后
以上就完成了自己开发一个Prometheus Exporter,上面的例子写的比较简单粗暴,可以根据实际情况来进行调整。
前两天刷到冯唐的一句话:“越是底层的人,处理人际关系的能力就越差,你越往上走,你就会发现,你以为人家天天在研究事,其实他们在研究人。”
你怎么理解这句话?
链接
[1] https://www.yuque.com/coolops/kubernetes/dff1cg。
[2] https://www.yuque.com/coolops/kubernetes/wd2vts。
[3] https://github.com/prometheus/client_golang/blob/main/prometheus/examples_test.go。
[4] https://www.cnblogs.com/0x00000/p/17557743.html。