一、分析node_exporter
-
前面的 scrape describe Collect 是struct类型的成员函数,这⼏个函数并没有直接在这个go里被调用,而是MustRegister注册进去了它们。
-
http.Handle里的prometheus.Handler 将上⼀部2个Mustregister的注册 关联进⼊http.handle. 也就进⼀步注册进入了httpserver-listerner
-
http.lister是组赛程序,只有启动后被curl的时候 才会执行。并且由于之前经过2步的注册,跟exporter的成员函数简历了关联(其实是指针关联) 所以,每次被curl的时候所有上面的成员函数都会被调用//例如上⾯的up.set(1) 就是只有被curl的时候才会被调用,成员函数是作为生成metrics的入口
二、 自定义exporter
需要有这三个部分:
1)自身是HTTP 服务器,可以响应 从外发过来的 HTTP GET 请求
2)自身需要运行在后台,并可以定期触发 抓取本地的监控数据
3)返回给prometheus_server 的内容是需要符合prometheus规定的metrics类型(Key-Value)
注:key-value -> prometheus(TS) 需要接受 values( float int ) 不可以 return string * 否则会是空值
exporter-prometheus 5s GET => exporter Handler-> handler-lister
开发的过程中 要特别注意 :
各种文件句柄等等资源的 完整回收,因为⼀个非常被频繁调用的后台程序中 ⼀旦循环中出现资源泄漏那么后果是很严重的(之前其实就遇到过⼀次 资源没有正确回收 导致每⼀次promethue_server访问过来 都造成僵尸进程 最终服务器被拖垮的窘境 …囧
所以 如果企业中运维开发的实力不够过硬,还是尽量建议大家 使用现成的社区exporters, 配合自行开发pushgateway脚本 。