Skywalking-08:OAL原理——如何动态生成Class类
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 该文件可以在 IDEA
的 Sequence Diagram
插件中打开
案例
启动 OAP
配置中,配置下环境变量 SW_OAL_ENGINE_DEBUG=Y
,这样能在工作目录下的 oal-rt
目录下找到生成的 Class
文件。
通过如下目录结构,可以看出有三种 Class
:
dispatcher
:调度器,将指标对象发送MetricsStreamProcessor
(指标处理器)metrics
:指标类,存储指标数据StorageBuilder
:存储构造器,实现类StorageBuilder
接口,提供map
与StorageData
之间互转的方法
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类相关推荐
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- 9.动态生成实体类,根据XML模板使用Emit生成动态类绑定到DataGrid
在实际项目中,我们可能会遇到用户自定义XML模板字段,根据这个模板上的字段来显示相应的字段的值到DataGrid.在这种情况下,需要使用 XmlReader解析获取这个用户自定义的XML模板上有哪些字 ...
- 动态生成java类_Java 运行时动态生成class
Java是一门静态语言,通常,我们需要的class在编译的时候就已经生成了,为什么有时候我们还想在运行时动态生成class呢? 因为在有些时候,我们还真得在运行时为一个类动态创建子类.比如,编写一个O ...
- python基础 -34- 面向对象(动态生成一个类)
class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("小贵&qu ...
- xml动态生成java_从XML文档动态生成Java类
考虑这种情况:我有一个名为person.xml的 XML文件,其中包含以下数据. MrFoo 28 如果我想将这个XML读入Java对象,我将创建一个名为PersonBean的Java bean(使用 ...
- Skywalking-09:OAL原理——如何通过动态生成的Class类保存数据
OAL 如何通过动态生成的 Class 类,保存数据 前置工作 OAL 如何将动态生成的 SourceDispatcher 添加到 DispatcherManager // org.apache.sk ...
- SkyWalking Agent 实现原理
微内核架构 SkyWalking Agent 采用了微内核架构(Microkernel Architecture),那什么是微内核架构呢?微内核架构也被称为插件化架构(Plug-in Architec ...
- ABP动态生成WebAPI
ABP框架可以动态生成WebApi,开发人员无需创建APIController,直接继承IApplicationService接口,即可对外发布webApi. 创建动态Web Api 控制器 例如,在 ...
- Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c
2019独角兽企业重金招聘Python工程师标准>>> 有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件. 那么技术实 ...
最新文章
- 农科院张西美组助研招聘(事业编、解决北京户口)
- EasyUI Pagination 分页的两种做法
- 每天一个JavaScript实例-apply和call的使用方法
- linux文件类型为ext4怎么扩展,如何扩展ext4分区和文件系统?
- 4.1.1 初识文件管理
- 分享 - 普通程序员如何转向AI方向
- 从一开始,说出事java匿名内部类
- Shell脚本学习-阶段十-Bash脚本实现每次登录Shell时可以查看Linux系统信息
- 使用$.getJSON解决ajax跨域访问 JQuery 的跨域方法(服务器端为wordpress程序)
- 【leetcode】1041. Robot Bounded In Circle
- 谈谈程序员的绩效考核
- 微服务网关选型,请收下我的膝盖!
- 不用安装界面器实现系统支持xvid编码器
- uva 10247 - Complete Tree Labeling
- 必须使用javadoc形式的注释
- 2010中国互联网哈哈榜:十大梁山好汉
- React.Children.only expected to receive a single React element child.【react-transition-group】
- 计算机辅助建筑设计英文全称是,“CAAD”是“Computer Aided Architectural Design”的缩写,意思是“计算机辅助建筑设计”...
- 【GNN】循序渐进认识SSL
- 湖南大学操作系统导论课程作业
热门文章
- 受检异常和非受检异常
- 使用 ramda 解析 .yarnrc/.npmrc 配置文件的例子
- 【网站】网站不能在QQ,微信中访问,申诉办法
- 漫画 |《程序员十二时辰》,内容过于真实 ...
- C#开发笔记之15-如何用C#获取某月最大天数?
- python标准库之参数解析库
- 使用Django Rest Framework和React构建Moodle / Blackboard克隆
- 工作回报如何影响人的生产力_如何在减少工作的同时提高生产力
- ux设计师薪水_我是如何从33岁的博物馆导游变成专业的Web开发人员和UX设计师的:我的…...
- python类定义中__init__(),在__init__中定义一个成员以在python中的类体中定义它的区别?...