in trace-etl/trace-etl-server/src/main/java/org/apache/ozhera/trace/etl/consumer/MetricsParseService.java [150:316]
public MetricsParseResult metricsParse(TSpanData tSpanData) {
String serviceName = tSpanData.getExtra().getServiceName();
if (StringUtils.isEmpty(serviceName) || exclude(excludeServiceName, serviceName)) {
return new MetricsParseResult(true);
}
HeraTraceEtlConfig config = defaultConfig(traceConfig.getConfig(serviceName));
String operationName = tSpanData.getName();
if (StringUtils.isEmpty(operationName) || exclude(config == null ? excludeMethod : config.getExcludeMethod(), operationName)) {
return new MetricsParseResult(true);
}
DriverDomain driverDomain = null;
if (operationName.equals(DB_DRIVER)) {
driverDomain = new DriverDomain();
driverDomain.setTimeStamp(String.valueOf(System.currentTimeMillis()));
driverDomain.setAppName(formatServiceName(serviceName));
}
JaegerTracerDomain jtd = new JaegerTracerDomain();
jtd.setServiceName(serviceName);
jtd.setTraceId(tSpanData.getTraceId());
long startTime = tSpanData.getStartEpochNanos();
if (startTime > 0) {
// ns to ms
jtd.setStartTime(startTime / (1000 * 1000));
}
long duration = tSpanData.getEndEpochNanos() - startTime;
// Nanoseconds to microseconds, microseconds to milliseconds need to keep decimal
long durationUs = duration / 1000;
if (duration > 0) {
jtd.setDuration(durationUs);
}
jtd.setEndTime(jtd.getStartTime() + durationUs / 1000);
jtd.setMethod(operationName);
if(excludeServerIp){
jtd.setServerIp(DEFAULT_SERVER_IP);
}else{
jtd.setServerIp(tSpanData.getExtra().getIp());
}
TAttributes attributes = tSpanData.getAttributes();
List<TAttributeKey> tagsKeys = attributes.getKeys();
List<TValue> tagsValues = attributes.getValues();
boolean isValidate = true;
if (tagsKeys != null && tagsValues != null && tagsKeys.size() > 0 && tagsKeys.size() == tagsValues.size()) {
for (int i = 0; i < tagsKeys.size(); i++) {
String key = tagsKeys.get(i).getValue();
String value = ThriftUtil.getStringValue(tagsValues.get(i), tagsKeys.get(i).getType());
if ("thread.name".equals(key) && exclude(config == null ? excludeThread : config.getExcludeThread(), value)) {
isValidate = false;
break;
}
if ("http.url".equals(key) && exclude(config == null ? excludeHttpurl : config.getExcludeHttpUrl(), value)) {
isValidate = false;
break;
}
if ("http.user_agent".equals(key) && exclude(config == null ? excludeUA : config.getExcludeUa(), value)) {
isValidate = false;
break;
}
if ("db.statement".equals(key) && exclude(config == null ? excludeDB : config.getExcludeSql(), value)) {
isValidate = false;
break;
}
if ("http.status_code".equals(key)) {
jtd.setHttpCode(value);
}
if ("rpc.system".equals(key)) {
jtd.setType(value);
}
if ("rpc.method".equals(key)) {
if(excludeDubboMethod){
jtd.setMethod(DEFAULT_DUBBO_METHOD);
}else {
jtd.setMethod(value);
}
}
if ("rpc.service".equals(key)) {
jtd.setRpcServiceName(value);
}
if ("span.kind".equals(key)) {
jtd.setKind(value);
}
if ("db.system".equals(key)) {
jtd.setType(value);
}
if ("db.statement".equals(key)) {
jtd.setStatement(value);
}
if ("http.method".equals(key)) {
jtd.setType("aop");
}
if ("net.peer.name".equals(key) || "net.peer.ip".equals(key)) {
jtd.setDbHost(value);
}
if ("net.peer.port".equals(key)) {
jtd.setDbPort(value);
}
if ("error".equals(key) && Boolean.valueOf(value)) {
jtd.setSuccess(false);
}
if ("db.connection_string".equals(key)) {
jtd.setDataSource(value);
}
if ("db.operation".equals(key)) {
jtd.setSqlMethod(value);
}
if ("db.name".equals(key)) {
jtd.setDbName(value);
}
if ("messaging.system".equals(key)) {
jtd.setType(value);
}
if ("messaging.destination".equals(key)) {
jtd.setTopic(value);
}
if ("hera.annotations".equals(key) && Boolean.valueOf(value)) {
jtd.setType(SpanType.CUSTOMIZE_MTTHOD);
}
//deal db driver
if (driverDomain != null && "db.driver.domainPort".equals(key)) {
driverDomain.setDomainPort(value);
}
if (driverDomain != null && "db.driver.userName".equals(key)) {
driverDomain.setUserName(value);
}
if (driverDomain != null && "db.driver.password".equals(key)) {
driverDomain.setPassword(value);
}
if (driverDomain != null && "db.driver.type".equals(key)) {
driverDomain.setType(value);
}
if (driverDomain != null && "db.driver.dbName".equals(key)) {
driverDomain.setDataBaseName(value);
}
}
}
// Gets the properties in process
TResource resource = tSpanData.getResouce();
if (resource != null) {
TAttributes resourceAttributes = resource.getAttributes();
List<TAttributeKey> resourceKeys = resourceAttributes.getKeys();
List<TValue> resourceValues = resourceAttributes.getValues();
if (resourceKeys != null && resourceValues != null && resourceKeys.size() > 0) {
for (int i = 0; i < resourceKeys.size(); i++) {
String key = resourceKeys.get(i).getValue();
String value = ThriftUtil.getStringValue(resourceValues.get(i), resourceKeys.get(i).getType());
if ("service.env".equals(key)) {
jtd.setServiceEnv(value);
}
if ("service.function.module".equals(key)) {
jtd.setFunctionModule(value);
}
if ("service.function.name".equals(key)) {
jtd.setFunctionName(value);
}
if ("service.function.id".equals(key)) {
jtd.setFunctionId(value);
}
if ("service.env.id".equals(key)) {
jtd.setServiceEnvId(value);
}
}
}
}
if (StringUtils.isEmpty(jtd.getServiceEnv())) {
jtd.setServiceEnv("default_env");
}
return new MetricsParseResult(jtd, driverDomain, false, isValidate, config);
}