源码角度了解Skywalking之Skywalking是如何进行JVM监控的

源码角度了解Skywalking之Skywalking是如何进行JVM监控的

源码角度了解Skywalking之Skywalking是如何进行JVM监控的

大家都知道Skywalking可以监控Java的JVM情况,包括垃圾回收情况等等,那么它是怎么实现的呢?今天就带大家一探究竟。

通过前几篇的文章我们知道,Skywalking启动的时候,会加载各种BootService实现类,而有关JVM的BootService实现类就是JVMService

JVMService

JVMService可以看做一个定时器,它收集JVM cpu、内存、内存池和gc 信息等等参数,并将收集到的信息通过GRPCChannelManager提供的通道发送给Collector,GRPCChannelManager这个类我们在上篇文章我们就进行了介绍,主要是用来建立连接管理通道的

JVMService实现BootService接口和Runnable接口

我们按照调用方法的顺序分析一下吧

prepare()方法

JVMService的prepare()方法:

public static int BUFFER_SIZE = 60 * 10;public void prepare() throws Throwable { queue = new LinkedBlockingQueue(Config.Jvm.BUFFER_SIZE); sender = new Sender(); ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(sender); }复制代码

准备阶段就是创建一个LinkedBlockingQueue类型的阻塞队列,队列大小为600,这个队列保存的是JVMMetric对象,然后创建了一个Sender对象,找到GRPCChannelManager对象,并把Sender对象加入监听类中。

boot()方法

JVMService的boot()方法:

public void boot() throws Throwable { collectMetricFuture = Executors .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory(“JVMService-produce”)) .scheduleAtFixedRate(new RunnableWithExceptionProtection(this, new RunnableWithExceptionProtection.CallbackWhenException() { @Override public void handle(Throwable t) { logger.error(“JVMService produces metrics failure.”, t); } }), 0, 1, TimeUnit.SECONDS); sendMetricFuture = Executors .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory(“JVMService-consume”)) .scheduleAtFixedRate(new RunnableWithExceptionProtection(sender, new RunnableWithExceptionProtection.CallbackWhenException() { @Override public void handle(Throwable t) { logger.error(“JVMService consumes and upload failure.”, t); } } ), 0, 1, TimeUnit.SECONDS); }复制代码

boot()方法中定义两个定时线程池每隔一秒创建一个线程,一个是生产线程,一个是消费线程,生产者逻辑对应JVMService的run()方法,而消费者的逻辑在Sender的run()方法中

run()方法

JVMService的run()方法:

public void run() { if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue() && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue() ) { long currentTimeMillis = System.currentTimeMillis(); try { JVMMetric.Builder jvmBuilder = JVMMetric.newBuilder(); jvmBuilder.setTime(currentTimeMillis); jvmBuilder.setCpu(CPUProvider.INSTANCE.getCpuMetric()); jvmBuilder.addAllMemory(MemoryProvider.INSTANCE.getMemoryMetricList()); jvmBuilder.addAllMemoryPool(MemoryPoolProvider.INSTANCE.getMemoryPoolMetricsList()); jvmBuilder.addAllGc(GCProvider.INSTANCE.getGCList()); JVMMetric jvmMetric = jvmBuilder.build(); if (!queue.offer(jvmMetric)) { queue.poll(); queue.offer(jvmMetric); } } catch (Exception e) { logger.error(e, “Collect JVM info fail.”); } } }复制代码

run()中的逻辑主要是创建JVMMetric对象,创建完成后放入队列中,从准备方法中我们知道队列大小设置是600,当队列满的时候,会取出最久的那个淘汰掉,然后放入新的JVMMetric对象到队尾。

从组装JVMMetric对象的过程我们可以看到,JVMMetric对象中包含了当前时间,CPU指标、内存指标还有垃圾回收指标。这三个指标的获取都是 利用枚举实现的单例模式 ,然后getGCList()方法中调用了GCModule抽象类的getGCList()方法,在获取新生代和老年代垃圾回收器名称的时候定义了抽象方法,具体逻辑每个垃圾回收器重写各自的抽象方法, 这是模板方法的体现

Sender

run()方法:

Sender对象作为消费者,它的功能就是通过drainTo()方法来把队列中的数据转移到buffer集合中,然后发送到Collector中。

总结

这篇文章我们讲了Skywalking是怎么进行JVM参数收集的,主要涉及到的类是JVMService,它的类定义了一个LinkedBlockingQueue类型的阻塞队列,长度是600,然后启动方法中启动了两个定时线程池创建了生产者JVMService线程和消费者Sender线程,JVMService作为生产者收集CPU、内存、垃圾回收信息等放入队列,Sender作为消费者从队列获取到所有JVM信息发送给Collector

:heart: 感谢大家

如果你觉得这篇内容对你挺有有帮助的话帮忙点点关注!

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月20日
下一篇 2022年6月20日

相关推荐

  • 产业体系完备,江苏企业逐浪全球的新机遇在哪里?

    来源:【交汇点新闻客户端】 2022江苏产业带跨境出海峰会7日在线上召开,来自各个产业带的资深外贸企业给新卖家们传授“出海”经验。江苏产业体系完备,企业逐浪全球的新机遇在哪里? 产…

    2022年6月14日
  • 坏情绪的十种化解方法

    人生不如意事十之八九,自己做事难以完美,视线里的人和事也很难高大全,所以人会经常产生一点悔恨、恼怒、沮丧等非乐观情绪,而这些情绪影响健康,故要学会化解之法。 一、顺应法。对事物要顺…

    2022年8月22日
  • 牛奶:网红“塌房”,行业深思

    网红牛奶的流量盛宴,进行到了“中场休息”阶段。 小红书上,关于“牛奶”的笔记有796万+篇。百万量级的“安利帖”似乎达成了一个共识,避开蒙牛、伊利“双子星”,“小众”转而成为“匠心…

    2022年8月23日
  • 沙雕文案短句子

    1.我的摆烂一生:上学《我不念了》,上班《我不干了》,老了《我不活了》。 2.我做决定:反复纠结、草率决定、迅速后悔。 3.我的优点:勇于认错。我的缺点:坚决不改。 4.这世界上唯…

    2022年9月8日
  • 热点前瞻:数字货币+操作系统+无人驾驶+水利建设

    热点前瞻 热点一:数字货币 逻辑概述:今年以来,数字人民币在金融应用场景实现多领域“破冰”。近日,全国首张数字人民币车险保单正式诞生,这标志着数字人民币在保险应用场景成功落地。同时…

    2022年6月17日
  • 意甲0斯佩齐亚取得两连胜 劳塔罗破门 恰球王建功

    北京时间8月21日凌晨2点45分,2022-23赛季意甲联赛第2轮迎来一场焦点战,国际米兰坐镇主场梅阿查迎战斯佩齐亚。上半场,劳塔罗进球打破僵局;下半场,恰尔汗奥卢打进一球,科雷亚…

    2022年8月21日
  • 馒头保存是有技巧的,要学会这么 馒头几个月后会保持柔软香甜

    面食是北方人的最爱,馒头就是其中之一。馒头是北方人餐桌上必不可少的存在。北方人以馒头为主食,吃不腻。虽然我们不在“纯正”的北方,但很多文化都深受北方影响,包括饮食文化。小时候,我们…

    2022年8月21日
  • 中国六大“垃圾”国货曝光!超市这六大钉子户终于被扒出来了

    作为几乎每个超市都能看到的钉子户,这几个国货虽然包装有点“垃圾” 但使用效果确实杠杠滴,而且价格也不贵 不过我还是要劝你一句最好还是别用,因为一旦用了你就会发现手里的大牌不香了 上…

    2022年6月19日
  • 总结下SpringData JPA 的常用语法

    SpringData JPA常用有两种写法,一个是用Jpa自带方法进行CRUD,适合简单查询场景、例如查询全部数据、根据某个字段查询,根据某字段排序等等。另一种是使用注解方式,@Q…

    2022年6月18日
  • 原单是正品吗(工厂原单属于什么品质)

    李琪是北京某高校一名大三学生,在她宿舍的桌子上摆满了一线大牌化妆品:SK-II神仙水、雅诗兰黛小棕瓶、莱珀妮鱼子酱反重力精华、兰蔻菁纯系列化妆品……这些“宝贝”都是她在某直播间抢购…

    2022年4月14日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息