文章目录

  • 原理图
  • 原理图一基于MXBean进行Metrics数据收集
  • 源码分析一JVMService
  • 总结

原理图

  • 通过prepare构建Metrics存储缓冲队列 初始化grpc客户端
  • 通过boot启动两个定时任务进行数据收集和发送

原理图一基于MXBean进行Metrics数据收集

源码分析一JVMService

  • prepare 初始化队列和sender
  • boot启动定时任务
  • run方法通过MxBean获取指标信息
  • Sender.run发送队列中的指标到服务端

public class JVMService implements BootService, Runnable {private LinkedBlockingQueue<JVMMetric> queue;private Sender sender;@Overridepublic void prepare() throws Throwable {初始化队列和senderqueue = new LinkedBlockingQueue<JVMMetric>(Config.Jvm.BUFFER_SIZE);sender = new Sender();ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(sender);}@Overridepublic void boot() throws Throwable {启动定时任务,period=1s,收集Metrics数据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);启动定时任务,period=1s,发送Metrics数据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);}@Overridepublic void run() {收集数据if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue()&& RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue()) {long currentTimeMillis = System.currentTimeMillis();MBean MxBean获取指标信息JVMMetric.Builder jvmBuilder = JVMMetric.newBuilder();通过Provider提取数据, Provider通过mxBean提取数据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);}}}private class Sender implements Runnable, GRPCChannelListener {private volatile GRPCChannelStatus status = GRPCChannelStatus.DISCONNECT;private volatile JVMMetricReportServiceGrpc.JVMMetricReportServiceBlockingStub stub = null;@Overridepublic void run() {...... 删除其他代码JVMMetricCollection.Builder builder = JVMMetricCollection.newBuilder();LinkedList<JVMMetric> buffer = new LinkedList<JVMMetric>();queue.drainTo(buffer);// 上报服务端度量信息if (buffer.size() > 0) {builder.addAllMetrics(buffer);builder.setServiceInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID);Commands commands = stub.withDeadlineAfter(GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS).collect(builder.build());// CommandService接收响应处理回调ServiceManager.INSTANCE.findService(CommandService.class).receiveCommand(commands);}}}
}

总结

  • JVMService的核心: 通过MXBean提取信息构建Metrics

skywalking源码分析第十六篇一agent端JVMService之度量上报相关推荐

  1. skywalking源码分析第十八篇一agent端Trace三部曲一Span栈桢机制

    文章目录 原理图 栈机制解说 名词含义 总结 原理图 图编号: 第一排序规则: 自左向右递增 第二排序规则: 自上向下递增 栈机制解说 详解一个Http请求经过APP-1(tomcat-> sp ...

  2. 【转】ABP源码分析二十六:核心框架中的一些其他功能

    本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...

  3. 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块

    通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...

  4. 【转】ABP源码分析三十六:ABP.Web.Api

    这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...

  5. ABP源码分析三十六:ABP.Web.Api

    这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...

  6. 第二人生的源码分析(二十六)底层网络协议

    为了理解第二人生的客户端与服务器的沟通,那么下面就来分析一下第二人生采用的网络协议.在目前的网络里,主要有两个协议:TCP和UDP,而第二人生里是采用UDP协议.TCP协议与UDP协议的主要区别,就是 ...

  7. adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级

    一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...

  8. linux xhci源码,第四十六篇:Linux中的USB XHCI HOST TRANSFER RING的相关数据结构 (1)

    记录相关数据结构之前,先上一张图,这样就基本一目了然了 USB XHCI HOST有三种RING 分别为COMMAND, EVENT 与TRANSFER 这里所说的是TRANSFER RING 一个R ...

  9. spark 源码分析之十八 -- Spark存储体系剖析

    本篇文章主要剖析BlockManager相关的类以及总结Spark底层存储体系. 总述 先看 BlockManager相关类之间的关系如下: 我们从NettyRpcEnv 开始,做一下简单说明. Ne ...

最新文章

  1. 数据库自动收缩带来的严重问题
  2. 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl
  3. psw和fr微型计算机,微型计算机技术及应用习题答案
  4. 面对非线性可分的情况怎么处理
  5. python random随机数 RUNOOB python练习题50
  6. [flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法
  7. [扩展中国剩余定理(EXCRT)]
  8. 天龙八部手游有网络显示网络或服务器异常,天龙八部手游微信登录不了_微信登录异常解决办法_玩游戏网...
  9. 開源搜索引擎爬蟲_六大開源搜索引擎工具 | 學步園
  10. vue个人学习(三)----组件
  11. 修复Mac上的“ Safari无法找到服务器”错误的解决方法
  12. 十二进制加计数器-20151112
  13. cpp读取分数并进行求和化简
  14. 如何打造自动驾驶的数据闭环?
  15. STM32CubeMX创建F429/L475 HAL库工程并移植UCOSIII (二)(文末附源码)
  16. ERNIE-Enhanced Language Representation with Informative Entities 阅读笔记
  17. Boboniu Plays Chess (模拟构造)
  18. 【MATLAB统计分析与应用100例】案例016:matlab读取Excel数据,进行样品系统聚类分析
  19. 2022电赛C题:小车跟踪(方案1+核心代码)
  20. php utf8生僻字,支持生僻字且自动识别utf-8编码的php汉字转拼音类_PHP

热门文章

  1. 将 mysql数据迁移到 达梦数据库(dm)上
  2. 在西雅图工作一年,口袋还剩多少钱?
  3. 对象数组去重——数组删除所有含有固定id的对象
  4. 如何辨别ipad真假?如何鉴定ipad是否翻新?
  5. 搜狗用这个骚技术,把百度气的吐血了!
  6. 让你的网站从http免费升级为https
  7. python遍历数组的两种方法
  8. postive psychology
  9. 罗技K380连接ubuntu失败的解决办法
  10. java:数组的冒泡排序