共计 9122 个字符,预计需要花费 23 分钟才能阅读完成。
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() {}
}
分享并记录所学所见
正文完