关于custom exporter的开发方法,前面两篇文章已经讲得很清楚了,今天结合实际应用场景,开发一个开箱即用的port exporter.
前言
开始阅读这篇文章之前,需要你对linux系统有一定的理解,并且理解以下几个文件/目录的用途。
- /proc/net/tcp
- /proc/pid/fd
这部分内容篇幅过长,需要读者自己去学习理解。本篇文章主要讲述port exporter的开发。
代码
目录结构
1 | exporter/ |
main.go
1 | package main |
根据前两篇讲的exporter开发套路,这里的main函数非常简单,只需要暴露一个固定的url给prometheus访问即可。另外,目前该custom exporter只有一个port exporter功能,所以不需要做其他的过度、超前设计,重点在于port exporter的功能实现和性能上。
核心代码
代码地址–custom exporter
采集:
1 | func (p PortCollector) Collect(c chan<- prometheus.Metric) { |
这个方法的核心是port.TCPSockets
,经过层层穿透,port.TCPSockets
主要实现是依赖metrics/port/port_linux.go
的netstat(path string, fn filterFunc) ([]SocketEntry, error)
:
1 | func netstat(path string, fn filterFunc) ([]SocketEntry, error) { |
其中,readSocket
主要是实现对/proc/net/tcp
的读取和解析。内容结构参考这边分析文章,具体的解析过程代码如下:
1 | func readSocket(r io.Reader, accept filterFunc) ([]SocketEntry, error) { |
getPidAndExec
主要是实现对/proc/pid/fd
的读取和解析。内容结构参考这边分析文章,具体的解析过程代码如下:
1 | func (p *procFd) readFdDir() { |
使用
查看数据,访问ip:8088/metrics
,如果能看类似以下的数据,则正常:
1 | custom_port_exporter{app="docker-proxy",host="ip",pid="1814",port="tcp 0.0.0.0:8080",state="10"} 1814 |
把port exporter的信息加入到prometheus的配置文件:
1 | scrape_configs: |
以后如果有其他好玩的需求,会持续更新到custom exporter
(完)