因为项目需要对一大堆机器的流量做抓取, 但是作为中转站的exporter都是一样的, 也就是说targets中的ip:port是一样的只是url param不同:
# 所有要抓取的exporter的链接都是
http://ip:port/metrics?module=xxx&target=xxx
#即只有target(要抓取的目标机器IP)不同
所以只能每个主机为一个Job去抓取,将近有一万多个job
后面想着说有没有办法把这些都放在一个job中, 但因为targets只能放ip:port, 经过调研发现了relabel_configs可以做到我的需求, 于是我写下了以下的relabel_configs:
当有relabel_configs的时候配置就会在relabel_configs计算后再去判断你的targets是否合法, 所以此时targets中可以放任何的数据, 而我把target和module到时候exporter需要的两个param参数, 以target:module放入target中如下图(这里面的targets里面的数据可以随便乱写, 只需要后面relabel_configs中转换为正常的ip:port即可):
此时targets中也是将近一万个, 原本以为解决将同一种指标的job放到一个Job中而不是多个job中结果程序一起动直接崩溃, 后面top看了下:
prometheus在很短的时间把内存搞到了20个G(之前多个job的做法内存也就在4个G左右)!
解决方案:
- 根据某个指标在做细分成多个job
- 把所有抓取放在同一个指标只适合抓取频率较低的(比如一个小时一次, 经测试一个小时一次内存大概在2G左右,上面的方案都是一分钟的频率)
第二个坑当你的job变多的时候加载配置会变得特别的慢, 两万多个job将近7分钟才加载完配置, 查看了下prometheus的源码发现是该函数导致的
在删除prometheus_sd_discovered_targets的指标导致如此之慢, 解决方案目前只有减少job