OAL 如何动态生成 Class

代码入口

org.apache.skywalking.oal.rt.OALRuntime#start 方法

    public void start(ClassLoader currentClassLoader) throws ModuleStartException, OALCompileException {if (!IS_RT_TEMP_FOLDER_INIT_COMPLETED) {prepareRTTempFolder();IS_RT_TEMP_FOLDER_INIT_COMPLETED = true;}this.currentClassLoader = currentClassLoader;Reader read;try {read = ResourceUtils.read(oalDefine.getConfigFile());} catch (FileNotFoundException e) {throw new ModuleStartException("Can't locate " + oalDefine.getConfigFile(), e);}OALScripts oalScripts;try {ScriptParser scriptParser = ScriptParser.createFromFile(read, oalDefine.getSourcePackage());// 解析oal脚本,生成OALScripts对象oalScripts = scriptParser.parse();} catch (IOException e) {throw new ModuleStartException("OAL script parse analysis failure.", e);}// OALScripts对象动态生成需要的类this.generateClassAtRuntime(oalScripts);}

时序图

OALRuntime-generate-class-at-runtime.sdt 该文件可以在 IDEASequence Diagram 插件中打开

案例

启动 OAP 配置中,配置下环境变量 SW_OAL_ENGINE_DEBUG=Y,这样能在工作目录下的 oal-rt 目录下找到生成的 Class 文件。

通过如下目录结构,可以看出有三种 Class

  • dispatcher :调度器,将指标对象发送 MetricsStreamProcessor (指标处理器)
  • metrics :指标类,存储指标数据
  • StorageBuilder :存储构造器,实现类 StorageBuilder 接口,提供 mapStorageData 之间互转的方法
oal-rt
├── dispatcher
│   ├── ServiceInstanceJVMClassDispatcher.class
│   └── ServiceInstanceJVMThreadDispatcher.class
└── metrics├── InstanceJvmClassLoadedClassCountMetrics.class├── InstanceJvmClassTotalLoadedClassCountMetrics.class├── InstanceJvmClassUnloadedClassCountMetrics.class├── InstanceJvmThreadDaemonCountMetrics.class├── InstanceJvmThreadDeadlockedMetrics.class├── InstanceJvmThreadLiveCountMetrics.class└── builder├── InstanceJvmClassLoadedClassCountMetricsBuilder.class├── InstanceJvmClassTotalLoadedClassCountMetricsBuilder.class├── InstanceJvmClassUnloadedClassCountMetricsBuilder.class├── InstanceJvmThreadDaemonCountMetricsBuilder.class├── InstanceJvmThreadDeadlockedMetricsBuilder.class└── InstanceJvmThreadLiveCountMetricsBuilder.class

指标类

package org.apache.skywalking.oap.server.core.source.oal.rt.metrics;import org.apache.skywalking.oap.server.core.analysis.Stream;
import org.apache.skywalking.oap.server.core.analysis.metrics.LongAvgMetrics;
import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
import org.apache.skywalking.oap.server.core.analysis.metrics.MetricsMetaInfo;
import org.apache.skywalking.oap.server.core.analysis.metrics.WithMetadata;
import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData.Builder;
import org.apache.skywalking.oap.server.core.source.oal.rt.metrics.builder.InstanceJvmClassLoadedClassCountMetricsBuilder;
import org.apache.skywalking.oap.server.core.storage.annotation.Column;@Stream(name = "instance_jvm_class_loaded_class_count",scopeId = 11000,builder = InstanceJvmClassLoadedClassCountMetricsBuilder.class,processor = MetricsStreamProcessor.class
)
public class InstanceJvmClassLoadedClassCountMetrics extends LongAvgMetrics implements WithMetadata {@Column(columnName = "entity_id",length = 512)private String entityId;@Column(columnName = "service_id",length = 256)private String serviceId;public InstanceJvmClassLoadedClassCountMetrics() {}public String getEntityId() {return this.entityId;}public void setEntityId(String var1) {this.entityId = var1;}public String getServiceId() {return this.serviceId;}public void setServiceId(String var1) {this.serviceId = var1;}public String id() {String var1 = String.valueOf(this.getTimeBucket());var1 = String.valueOf(var1).concat(String.valueOf("_" + this.entityId));return var1;}public int hashCode() {byte var1 = 17;int var2 = 31 * var1 + this.entityId.hashCode();var2 = 31 * var2 + (int)this.getTimeBucket();return var2;}public int remoteHashCode() {byte var1 = 17;int var2 = 31 * var1 + this.entityId.hashCode();return var2;}public boolean equals(Object var1) {if (this == var1) {return true;} else if (var1 == null) {return false;} else if (this.getClass() != var1.getClass()) {return false;} else {InstanceJvmClassLoadedClassCountMetrics var2 = (InstanceJvmClassLoadedClassCountMetrics)var1;if (!this.entityId.equals(var2.entityId)) {return false;} else {return this.getTimeBucket() == var2.getTimeBucket();}}}public Builder serialize() {Builder var1 = RemoteData.newBuilder();var1.addDataStrings(this.getEntityId());var1.addDataStrings(this.getServiceId());var1.addDataLongs(this.getSummation());var1.addDataLongs(this.getCount());var1.addDataLongs(this.getValue());var1.addDataLongs(this.getTimeBucket());return var1;}public void deserialize(RemoteData var1) {this.setEntityId(var1.getDataStrings(0));this.setServiceId(var1.getDataStrings(1));this.setSummation(var1.getDataLongs(0));this.setCount(var1.getDataLongs(1));this.setValue(var1.getDataLongs(2));this.setTimeBucket(var1.getDataLongs(3));}public MetricsMetaInfo getMeta() {return new MetricsMetaInfo("instance_jvm_class_loaded_class_count", 11000, this.entityId);}public Metrics toHour() {InstanceJvmClassLoadedClassCountMetrics var1 = new InstanceJvmClassLoadedClassCountMetrics();var1.setEntityId(this.getEntityId());var1.setServiceId(this.getServiceId());var1.setSummation(this.getSummation());var1.setCount(this.getCount());var1.setValue(this.getValue());var1.setTimeBucket(this.toTimeBucketInHour());return var1;}public Metrics toDay() {InstanceJvmClassLoadedClassCountMetrics var1 = new InstanceJvmClassLoadedClassCountMetrics();var1.setEntityId(this.getEntityId());var1.setServiceId(this.getServiceId());var1.setSummation(this.getSummation());var1.setCount(this.getCount());var1.setValue(this.getValue());var1.setTimeBucket(this.toTimeBucketInDay());return var1;}
}

存储构造器

package org.apache.skywalking.oap.server.core.source.oal.rt.metrics.builder;import java.util.HashMap;
import java.util.Map;
import org.apache.skywalking.oap.server.core.source.oal.rt.metrics.InstanceJvmClassLoadedClassCountMetrics;
import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
import org.apache.skywalking.oap.server.core.storage.StorageData;public class InstanceJvmClassLoadedClassCountMetricsBuilder implements StorageBuilder {public InstanceJvmClassLoadedClassCountMetricsBuilder() {}public Map data2Map(StorageData var1) {InstanceJvmClassLoadedClassCountMetrics var2 = (InstanceJvmClassLoadedClassCountMetrics)var1;HashMap var3 = new HashMap();var3.put((Object)"entity_id", var2.getEntityId());var3.put((Object)"service_id", var2.getServiceId());var3.put((Object)"summation", new Long(var2.getSummation()));var3.put((Object)"count", new Long(var2.getCount()));var3.put((Object)"value", new Long(var2.getValue()));var3.put((Object)"time_bucket", new Long(var2.getTimeBucket()));return var3;}public StorageData map2Data(Map var1) {InstanceJvmClassLoadedClassCountMetrics var2 = new InstanceJvmClassLoadedClassCountMetrics();var2.setEntityId((String)var1.get("entity_id"));var2.setServiceId((String)var1.get("service_id"));var2.setSummation(((Number)var1.get("summation")).longValue());var2.setCount(((Number)var1.get("count")).longValue());var2.setValue(((Number)var1.get("value")).longValue());var2.setTimeBucket(((Number)var1.get("time_bucket")).longValue());return var2;}
}

调度器

package org.apache.skywalking.oap.server.core.source.oal.rt.dispatcher;import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMClass;
import org.apache.skywalking.oap.server.core.source.Source;
import org.apache.skywalking.oap.server.core.source.oal.rt.metrics.InstanceJvmClassLoadedClassCountMetrics;
import org.apache.skywalking.oap.server.core.source.oal.rt.metrics.InstanceJvmClassTotalLoadedClassCountMetrics;
import org.apache.skywalking.oap.server.core.source.oal.rt.metrics.InstanceJvmClassUnloadedClassCountMetrics;public class ServiceInstanceJVMClassDispatcher implements SourceDispatcher<ServiceInstanceJVMClass> {private void doInstanceJvmClassLoadedClassCount(ServiceInstanceJVMClass var1) {InstanceJvmClassLoadedClassCountMetrics var2 = new InstanceJvmClassLoadedClassCountMetrics();var2.setTimeBucket(var1.getTimeBucket());var2.setEntityId(var1.getEntityId());var2.setServiceId(var1.getServiceId());var2.combine(var1.getLoadedClassCount(), (long)1);MetricsStreamProcessor.getInstance().in(var2);}private void doInstanceJvmClassUnloadedClassCount(ServiceInstanceJVMClass var1) {InstanceJvmClassUnloadedClassCountMetrics var2 = new InstanceJvmClassUnloadedClassCountMetrics();var2.setTimeBucket(var1.getTimeBucket());var2.setEntityId(var1.getEntityId());var2.setServiceId(var1.getServiceId());var2.combine(var1.getUnloadedClassCount(), (long)1);MetricsStreamProcessor.getInstance().in(var2);}private void doInstanceJvmClassTotalLoadedClassCount(ServiceInstanceJVMClass var1) {InstanceJvmClassTotalLoadedClassCountMetrics var2 = new InstanceJvmClassTotalLoadedClassCountMetrics();var2.setTimeBucket(var1.getTimeBucket());var2.setEntityId(var1.getEntityId());var2.setServiceId(var1.getServiceId());var2.combine(var1.getTotalLoadedClassCount(), (long)1);MetricsStreamProcessor.getInstance().in(var2);}public void dispatch(Source var1) {ServiceInstanceJVMClass var2 = (ServiceInstanceJVMClass)var1;this.doInstanceJvmClassLoadedClassCount(var2);this.doInstanceJvmClassUnloadedClassCount(var2);this.doInstanceJvmClassTotalLoadedClassCount(var2);}public ServiceInstanceJVMClassDispatcher() {}
}

Skywalking-08:OAL原理——如何动态生成Class类相关推荐

  1. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  2. 9.动态生成实体类,根据XML模板使用Emit生成动态类绑定到DataGrid

    在实际项目中,我们可能会遇到用户自定义XML模板字段,根据这个模板上的字段来显示相应的字段的值到DataGrid.在这种情况下,需要使用 XmlReader解析获取这个用户自定义的XML模板上有哪些字 ...

  3. 动态生成java类_Java 运行时动态生成class

    Java是一门静态语言,通常,我们需要的class在编译的时候就已经生成了,为什么有时候我们还想在运行时动态生成class呢? 因为在有些时候,我们还真得在运行时为一个类动态创建子类.比如,编写一个O ...

  4. python基础 -34- 面向对象(动态生成一个类)

    class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("小贵&qu ...

  5. xml动态生成java_从XML文档动态生成Java类

    考虑这种情况:我有一个名为person.xml的 XML文件,其中包含以下数据. MrFoo 28 如果我想将这个XML读入Java对象,我将创建一个名为PersonBean的Java bean(使用 ...

  6. Skywalking-09:OAL原理——如何通过动态生成的Class类保存数据

    OAL 如何通过动态生成的 Class 类,保存数据 前置工作 OAL 如何将动态生成的 SourceDispatcher 添加到 DispatcherManager // org.apache.sk ...

  7. SkyWalking Agent 实现原理

    微内核架构 SkyWalking Agent 采用了微内核架构(Microkernel Architecture),那什么是微内核架构呢?微内核架构也被称为插件化架构(Plug-in Architec ...

  8. ABP动态生成WebAPI

    ABP框架可以动态生成WebApi,开发人员无需创建APIController,直接继承IApplicationService接口,即可对外发布webApi. 创建动态Web Api 控制器 例如,在 ...

  9. Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c

    2019独角兽企业重金招聘Python工程师标准>>> 有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件. 那么技术实 ...

最新文章

  1. 农科院张西美组助研招聘(事业编、解决北京户口)
  2. EasyUI Pagination 分页的两种做法
  3. 每天一个JavaScript实例-apply和call的使用方法
  4. linux文件类型为ext4怎么扩展,如何扩展ext4分区和文件系统?
  5. 4.1.1 初识文件管理
  6. 分享 - 普通程序员如何转向AI方向
  7. 从一开始,说出事java匿名内部类
  8. Shell脚本学习-阶段十-Bash脚本实现每次登录Shell时可以查看Linux系统信息
  9. 使用$.getJSON解决ajax跨域访问 JQuery 的跨域方法(服务器端为wordpress程序)
  10. 【leetcode】1041. Robot Bounded In Circle
  11. 谈谈程序员的绩效考核
  12. 微服务网关选型,请收下我的膝盖!
  13. 不用安装界面器实现系统支持xvid编码器
  14. uva 10247 - Complete Tree Labeling
  15. 必须使用javadoc形式的注释
  16. 2010中国互联网哈哈榜:十大梁山好汉
  17. React.Children.only expected to receive a single React element child.【react-transition-group】
  18. 计算机辅助建筑设计英文全称是,“CAAD”是“Computer Aided Architectural Design”的缩写,意思是“计算机辅助建筑设计”...
  19. 【GNN】循序渐进认识SSL
  20. 湖南大学操作系统导论课程作业

热门文章

  1. 受检异常和非受检异常
  2. 使用 ramda 解析 .yarnrc/.npmrc 配置文件的例子
  3. 【网站】网站不能在QQ,微信中访问,申诉办法
  4. 漫画 |《程序员十二时辰》,内容过于真实 ...
  5. C#开发笔记之15-如何用C#获取某月最大天数?
  6. python标准库之参数解析库
  7. 使用Django Rest Framework和React构建Moodle / Blackboard克隆
  8. 工作回报如何影响人的生产力_如何在减少工作的同时提高生产力
  9. ux设计师薪水_我是如何从33岁的博物馆导游变成专业的Web开发人员和UX设计师的:我的…...
  10. python类定义中__init__(),在__init__中定义一个成员以在python中的类体中定义它的区别?...