文章目录

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

原理图

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

skywalking源码分析第十六篇一agent端JVMService之度量上报_数据

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

skywalking源码分析第十六篇一agent端JVMService之度量上报_rpc_02

源码分析一JVMService

  • prepare 初始化队列和sender
  • boot启动定时任务
  • run方法通过MxBean获取指标信息
  • Sender.run发送队列中的指标到服务端
public class JVMService implements BootService, Runnable {
private LinkedBlockingQueue<JVMMetric> queue;
private Sender sender;

@Override
public void prepare() throws Throwable {
初始化队列和sender
queue = new LinkedBlockingQueue<JVMMetric>(Config.Jvm.BUFFER_SIZE);
sender = new Sender();
ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(sender);
}

@Override
public 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);
}

@Override
public 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;

@Override
public 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