skywalking源码分析第十六篇一agent端JVMService之度量上报
文章目录
- 原理图
- 原理图一基于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之度量上报相关推荐
- skywalking源码分析第十八篇一agent端Trace三部曲一Span栈桢机制
文章目录 原理图 栈机制解说 名词含义 总结 原理图 图编号: 第一排序规则: 自左向右递增 第二排序规则: 自上向下递增 栈机制解说 详解一个Http请求经过APP-1(tomcat-> sp ...
- 【转】ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...
- 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块
通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...
- 【转】ABP源码分析三十六:ABP.Web.Api
这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...
- ABP源码分析三十六:ABP.Web.Api
这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...
- 第二人生的源码分析(二十六)底层网络协议
为了理解第二人生的客户端与服务器的沟通,那么下面就来分析一下第二人生采用的网络协议.在目前的网络里,主要有两个协议:TCP和UDP,而第二人生里是采用UDP协议.TCP协议与UDP协议的主要区别,就是 ...
- adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级
一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...
- linux xhci源码,第四十六篇:Linux中的USB XHCI HOST TRANSFER RING的相关数据结构 (1)
记录相关数据结构之前,先上一张图,这样就基本一目了然了 USB XHCI HOST有三种RING 分别为COMMAND, EVENT 与TRANSFER 这里所说的是TRANSFER RING 一个R ...
- spark 源码分析之十八 -- Spark存储体系剖析
本篇文章主要剖析BlockManager相关的类以及总结Spark底层存储体系. 总述 先看 BlockManager相关类之间的关系如下: 我们从NettyRpcEnv 开始,做一下简单说明. Ne ...
最新文章
- 数据库自动收缩带来的严重问题
- 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl
- psw和fr微型计算机,微型计算机技术及应用习题答案
- 面对非线性可分的情况怎么处理
- python random随机数 RUNOOB python练习题50
- [flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法
- [扩展中国剩余定理(EXCRT)]
- 天龙八部手游有网络显示网络或服务器异常,天龙八部手游微信登录不了_微信登录异常解决办法_玩游戏网...
- 開源搜索引擎爬蟲_六大開源搜索引擎工具 | 學步園
- vue个人学习(三)----组件
- 修复Mac上的“ Safari无法找到服务器”错误的解决方法
- 十二进制加计数器-20151112
- cpp读取分数并进行求和化简
- 如何打造自动驾驶的数据闭环?
- STM32CubeMX创建F429/L475 HAL库工程并移植UCOSIII (二)(文末附源码)
- ERNIE-Enhanced Language Representation with Informative Entities 阅读笔记
- Boboniu Plays Chess (模拟构造)
- 【MATLAB统计分析与应用100例】案例016:matlab读取Excel数据,进行样品系统聚类分析
- 2022电赛C题:小车跟踪(方案1+核心代码)
- php utf8生僻字,支持生僻字且自动识别utf-8编码的php汉字转拼音类_PHP