prometheus遇到的大坑
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了prometheus遇到的大坑相关的知识,希望对你有一定的参考价值。
参考技术A 因为项目需要对一大堆机器的流量做抓取, 但是作为中转站的exporter都是一样的, 也就是说targets中的ip:port是一样的只是url param不同:所以只能每个主机为一个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即可):
prometheus在很短的时间把内存搞到了20个G(之前多个job的做法内存也就在4个G左右)!
解决方案:
第二个坑当你的job变多的时候加载配置会变得特别的慢, 两万多个job将近7分钟才加载完配置, 查看了下prometheus的源码发现是该函数导致的
在删除prometheus_sd_discovered_targets的指标导致如此之慢, 解决方案目前只有减少job
引用队列使用时遇到的一个大坑
当我使用弱引用时希望通过引用队列来回收弱引用对象发现引用队列怎么都获取不到回收的弱引用对象,如下:
/**
* @author: @zyz
*/
public class ReferenceTest6
private static final int _4MB = 4 * 1024 * 1024;
public static void main(String[] args) throws InterruptedException
// 引用队列
ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
WeakReference <byte[]> ref = new WeakReference<>(new byte[_4MB], queue);
WeakReference <byte[]> ref1 = new WeakReference<>(new byte[_4MB], queue);
WeakReference <byte[]> ref2 = new WeakReference<>(new byte[_4MB], queue);
System.gc ();
Reference<? extends byte[]> poll = queue.poll();
while( poll != null)
System.out.println ("回收");
poll = queue.poll();
// 结果为什么都不输出
经过各种查资料最终发现,当你调用System.gc()时, 只是告诉gc进行一次回收动作,但是回收什么还是由gc自己决定的,通过以下代码证明:
/**
* @author: @zyz
*/
public class ReferenceTest6
private static final int _4MB = 4 * 1024 * 1024;
public static void main(String[] args) throws InterruptedException
// -Xmx10m -XX:+DisableExplicitGC
// 引用队列
ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
WeakReference <byte[]> ref = new WeakReference<>(new byte[_4MB], queue);
WeakReference <byte[]> ref1 = new WeakReference<>(new byte[_4MB], queue);
WeakReference <byte[]> ref2 = new WeakReference<>(new byte[_4MB], queue);
System.gc ();
// 从队列中获取无用的 软引用对象,并移除
Reference<? extends byte[]> poll = queue.poll();
while( poll != null)
System.out.println ("回收");
poll = queue.poll();
System.out.println ("等待GC");
Thread.sleep (2000);
poll = queue.poll();
while( poll != null)
System.out.println ("回收");
poll = queue.poll();
//结果:
// 等待GC
// 回收
// 回收
// 回收
以上是关于prometheus遇到的大坑的主要内容,如果未能解决你的问题,请参考以下文章
开发自己的分布式监控Prometheus Exporter时遇到的坑