提交 b5eb9e30 编写于 作者: wu-sheng's avatar wu-sheng 提交者: Jared Tan

Support Service Instance Inventory properties and bug fixed (#2156)

* Refactor service instance inventory to properties based entity.

* Fix a bug and refactor properties update.
上级 98ad680c
......@@ -100,11 +100,11 @@ public class OSUtil {
String osName = getOsName();
if (osName != null) {
osInfo.add(KeyStringValuePair.newBuilder().setKey("OSName").setValue(osName).build());
osInfo.add(KeyStringValuePair.newBuilder().setKey("os_name").setValue(osName).build());
}
String hostName = getHostName();
if (hostName != null) {
osInfo.add(KeyStringValuePair.newBuilder().setKey("hostname").setValue(hostName).build());
osInfo.add(KeyStringValuePair.newBuilder().setKey("host_name").setValue(hostName).build());
}
List<String> allIPV4 = getAllIPV4();
if (allIPV4.size() > 0) {
......@@ -112,7 +112,8 @@ public class OSUtil {
osInfo.add(KeyStringValuePair.newBuilder().setKey("ipv4").setValue(ipv4).build());
}
}
osInfo.add(KeyStringValuePair.newBuilder().setKey("ProcessNo").setValue(getProcessNo() + "").build());
osInfo.add(KeyStringValuePair.newBuilder().setKey("process_no").setValue(getProcessNo() + "").build());
osInfo.add(KeyStringValuePair.newBuilder().setKey("language").setValue("java").build());
return osInfo;
}
}
......@@ -24,38 +24,17 @@ package org.apache.skywalking.oap.server.core.query.entity;
public enum LanguageTrans {
INSTANCE;
public int id(Language language) {
public Language value(String language) {
switch (language) {
case UNKNOWN:
return 1;
case JAVA:
return 2;
case DOTNET:
return 3;
case NODEJS:
return 4;
case PYTHON:
return 5;
case RUBY:
return 6;
default:
return 1;
}
}
public Language value(int id) {
switch (id) {
case 1:
return Language.UNKNOWN;
case 2:
case "java":
return Language.JAVA;
case 3:
case ".net":
return Language.DOTNET;
case 4:
case "nodejs":
return Language.NODEJS;
case 5:
case "python":
return Language.PYTHON;
case 6:
case "ruby":
return Language.RUBY;
default:
return Language.UNKNOWN;
......
......@@ -18,7 +18,7 @@
package org.apache.skywalking.oap.server.core.register;
import com.google.gson.Gson;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import java.util.*;
import lombok.*;
......@@ -47,23 +47,17 @@ public class ServiceInstanceInventory extends RegisterSource {
public static final String SERVICE_ID = "service_id";
private static final String IS_ADDRESS = "is_address";
private static final String ADDRESS_ID = "address_id";
public static final String OS_NAME = "os_name";
public static final String HOST_NAME = "host_name";
public static final String PROCESS_NO = "process_no";
public static final String IPV4S = "ipv4s";
public static final String LANGUAGE = "language";
public static final String PROPERTIES = "properties";
private static final Gson GSON = new Gson();
@Setter @Getter @Column(columnName = INSTANCE_UUID, matchQuery = true)
private String instanceUUID = Const.EMPTY_STRING;
@Setter @Getter @Column(columnName = NAME) private String name = Const.EMPTY_STRING;
@Setter @Getter @Column(columnName = SERVICE_ID) private int serviceId;
@Setter @Getter @Column(columnName = LANGUAGE) private int language;
@Setter @Getter @Column(columnName = IS_ADDRESS) private int isAddress;
@Setter @Getter @Column(columnName = ADDRESS_ID) private int addressId;
@Setter @Getter @Column(columnName = OS_NAME) private String osName;
@Setter @Getter @Column(columnName = HOST_NAME) private String hostName;
@Setter @Getter @Column(columnName = PROCESS_NO) private int processNo;
@Setter @Getter @Column(columnName = IPV4S) private String ipv4s;
@Getter(AccessLevel.PRIVATE) @Column(columnName = PROPERTIES) private String prop;
@Getter private JsonObject properties;
public static String buildId(int serviceId, String uuid) {
return serviceId + Const.ID_SPLIT + uuid + Const.ID_SPLIT + BooleanUtils.FALSE + Const.ID_SPLIT + Const.NONE;
......@@ -90,6 +84,25 @@ public class ServiceInstanceInventory extends RegisterSource {
return result;
}
public void setProperties(JsonObject properties) {
this.properties = properties;
if (properties != null && properties.keySet().size() > 0) {
this.prop = properties.toString();
}
}
private void setProp(String prop) {
this.prop = prop;
if (!Strings.isNullOrEmpty(prop)) {
this.properties = GSON.fromJson(prop, JsonObject.class);
}
}
public boolean hasProperties() {
return prop != null && prop.length() > 0;
}
@Override public boolean equals(Object obj) {
if (this == obj)
return true;
......@@ -115,38 +128,30 @@ public class ServiceInstanceInventory extends RegisterSource {
RemoteData.Builder remoteBuilder = RemoteData.newBuilder();
remoteBuilder.addDataIntegers(getSequence());
remoteBuilder.addDataIntegers(serviceId);
remoteBuilder.addDataIntegers(language);
remoteBuilder.addDataIntegers(isAddress);
remoteBuilder.addDataIntegers(addressId);
remoteBuilder.addDataIntegers(processNo);
remoteBuilder.addDataLongs(getRegisterTime());
remoteBuilder.addDataLongs(getHeartbeatTime());
remoteBuilder.addDataStrings(Strings.isNullOrEmpty(name) ? Const.EMPTY_STRING : name);
remoteBuilder.addDataStrings(Strings.isNullOrEmpty(osName) ? Const.EMPTY_STRING : osName);
remoteBuilder.addDataStrings(Strings.isNullOrEmpty(hostName) ? Const.EMPTY_STRING : hostName);
remoteBuilder.addDataStrings(Strings.isNullOrEmpty(ipv4s) ? Const.EMPTY_STRING : ipv4s);
remoteBuilder.addDataStrings(Strings.isNullOrEmpty(instanceUUID) ? Const.EMPTY_STRING : instanceUUID);
remoteBuilder.addDataStrings(Strings.isNullOrEmpty(prop) ? Const.EMPTY_STRING : prop);
return remoteBuilder;
}
@Override public void deserialize(RemoteData remoteData) {
setSequence(remoteData.getDataIntegers(0));
setServiceId(remoteData.getDataIntegers(1));
setLanguage(remoteData.getDataIntegers(2));
setIsAddress(remoteData.getDataIntegers(3));
setAddressId(remoteData.getDataIntegers(4));
setProcessNo(remoteData.getDataIntegers(5));
setIsAddress(remoteData.getDataIntegers(2));
setAddressId(remoteData.getDataIntegers(3));
setRegisterTime(remoteData.getDataLongs(0));
setHeartbeatTime(remoteData.getDataLongs(1));
setName(remoteData.getDataStrings(0));
setOsName(remoteData.getDataStrings(1));
setHostName(remoteData.getDataStrings(2));
setIpv4s(remoteData.getDataStrings(3));
setInstanceUUID(remoteData.getDataStrings(4));
setInstanceUUID(remoteData.getDataStrings(1));
setProp(remoteData.getDataStrings(2));
}
@Override public int remoteHashCode() {
......@@ -159,19 +164,15 @@ public class ServiceInstanceInventory extends RegisterSource {
ServiceInstanceInventory inventory = new ServiceInstanceInventory();
inventory.setSequence((Integer)dbMap.get(SEQUENCE));
inventory.setServiceId((Integer)dbMap.get(SERVICE_ID));
inventory.setLanguage((Integer)dbMap.get(LANGUAGE));
inventory.setIsAddress((Integer)dbMap.get(IS_ADDRESS));
inventory.setAddressId((Integer)dbMap.get(ADDRESS_ID));
inventory.setProcessNo((Integer)dbMap.get(PROCESS_NO));
inventory.setRegisterTime((Long)dbMap.get(REGISTER_TIME));
inventory.setHeartbeatTime((Long)dbMap.get(HEARTBEAT_TIME));
inventory.setName((String)dbMap.get(NAME));
inventory.setOsName((String)dbMap.get(OS_NAME));
inventory.setHostName((String)dbMap.get(HOST_NAME));
inventory.setIpv4s((String)dbMap.get(IPV4S));
inventory.setInstanceUUID((String)dbMap.get(INSTANCE_UUID));
inventory.setProp((String)dbMap.get(PROPERTIES));
return inventory;
}
......@@ -179,32 +180,25 @@ public class ServiceInstanceInventory extends RegisterSource {
Map<String, Object> map = new HashMap<>();
map.put(SEQUENCE, storageData.getSequence());
map.put(SERVICE_ID, storageData.getServiceId());
map.put(LANGUAGE, storageData.getLanguage());
map.put(IS_ADDRESS, storageData.getIsAddress());
map.put(ADDRESS_ID, storageData.getAddressId());
map.put(PROCESS_NO, storageData.getProcessNo());
map.put(REGISTER_TIME, storageData.getRegisterTime());
map.put(HEARTBEAT_TIME, storageData.getHeartbeatTime());
map.put(NAME, storageData.getName());
map.put(OS_NAME, storageData.getOsName());
map.put(HOST_NAME, storageData.getHostName());
map.put(IPV4S, storageData.getIpv4s());
map.put(INSTANCE_UUID, storageData.getInstanceUUID());
map.put(PROPERTIES, storageData.getProp());
return map;
}
}
public static class AgentOsInfo {
@Setter @Getter private String osName;
@Setter @Getter private String hostname;
@Setter @Getter private int processNo;
@Getter private List<String> ipv4s;
public AgentOsInfo() {
this.ipv4s = new ArrayList<>();
}
public static class PropertyUtil {
public static final String OS_NAME = "os_name";
public static final String HOST_NAME = "host_name";
public static final String PROCESS_NO = "process_no";
public static final String IPV4S = "ipv4s";
public static final String LANGUAGE = "language";
public static String ipv4sSerialize(List<String> ipv4) {
Gson gson = new Gson();
......
......@@ -18,7 +18,7 @@
package org.apache.skywalking.oap.server.core.register.service;
import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
import com.google.gson.JsonObject;
import org.apache.skywalking.oap.server.library.module.Service;
/**
......@@ -27,7 +27,7 @@ import org.apache.skywalking.oap.server.library.module.Service;
public interface IServiceInstanceInventoryRegister extends Service {
int getOrCreate(int serviceId, String serviceInstanceName, String uuid, long registerTime,
ServiceInstanceInventory.AgentOsInfo osInfo);
JsonObject properties);
int getOrCreate(int serviceId, int addressId, long registerTime);
......
......@@ -19,6 +19,7 @@
package org.apache.skywalking.oap.server.core.register.service;
import com.google.gson.JsonObject;
import org.apache.skywalking.oap.server.core.register.NodeType;
import org.apache.skywalking.oap.server.library.module.Service;
/**
......@@ -30,7 +31,7 @@ public interface IServiceInventoryRegister extends Service {
int getOrCreate(int addressId, String serviceName, JsonObject properties);
void updateProperties(int serviceId, JsonObject properties);
void update(int serviceId, NodeType nodeType, JsonObject properties);
void heartbeat(int serviceId, long heartBeatTime);
......
......@@ -127,27 +127,11 @@ public class NetworkAddressInventoryRegister implements INetworkAddressInventory
InventoryProcess.INSTANCE.in(newNetworkAddress);
}
ServiceInventory newServiceInventory = getServiceInventoryCache().get(getServiceInventoryCache().getServiceId(networkAddress.getSequence()));
if (!this.compare(newServiceInventory, nodeType)) {
newServiceInventory = newServiceInventory.getClone();
newServiceInventory.setServiceNodeType(nodeType);
newServiceInventory.setHeartbeatTime(System.currentTimeMillis());
InventoryProcess.INSTANCE.in(newServiceInventory);
}
}
private boolean compare(NetworkAddressInventory newNetworkAddress, NodeType nodeType) {
if (Objects.nonNull(newNetworkAddress)) {
return nodeType == newNetworkAddress.getNetworkAddressNodeType();
}
return true;
}
private boolean compare(ServiceInventory newServiceInventory, NodeType nodeType) {
if (Objects.nonNull(newServiceInventory)) {
return nodeType == newServiceInventory.getServiceNodeType();
return nodeType.equals(newNetworkAddress.getNetworkAddressNodeType());
}
return true;
}
......
......@@ -18,6 +18,7 @@
package org.apache.skywalking.oap.server.core.register.service;
import com.google.gson.JsonObject;
import java.util.Objects;
import org.apache.skywalking.oap.server.core.*;
import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache;
......@@ -51,7 +52,7 @@ public class ServiceInstanceInventoryRegister implements IServiceInstanceInvento
}
@Override public int getOrCreate(int serviceId, String serviceInstanceName, String uuid, long registerTime,
ServiceInstanceInventory.AgentOsInfo osInfo) {
JsonObject properties) {
if (logger.isDebugEnabled()) {
logger.debug("Get or create service instance by service instance name, service id: {}, service instance name: {},uuid: {}, registerTime: {}", serviceId, serviceInstanceName, uuid, registerTime);
}
......@@ -69,10 +70,7 @@ public class ServiceInstanceInventoryRegister implements IServiceInstanceInvento
serviceInstanceInventory.setRegisterTime(registerTime);
serviceInstanceInventory.setHeartbeatTime(registerTime);
serviceInstanceInventory.setOsName(osInfo.getOsName());
serviceInstanceInventory.setHostName(osInfo.getHostname());
serviceInstanceInventory.setProcessNo(osInfo.getProcessNo());
serviceInstanceInventory.setIpv4s(ServiceInstanceInventory.AgentOsInfo.ipv4sSerialize(osInfo.getIpv4s()));
serviceInstanceInventory.setProperties(properties);
InventoryProcess.INSTANCE.in(serviceInstanceInventory);
}
......
......@@ -22,7 +22,7 @@ import com.google.gson.JsonObject;
import java.util.Objects;
import org.apache.skywalking.oap.server.core.*;
import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache;
import org.apache.skywalking.oap.server.core.register.ServiceInventory;
import org.apache.skywalking.oap.server.core.register.*;
import org.apache.skywalking.oap.server.core.register.worker.InventoryProcess;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.util.BooleanUtils;
......@@ -91,16 +91,19 @@ public class ServiceInventoryRegister implements IServiceInventoryRegister {
return serviceId;
}
@Override public void updateProperties(int serviceId, JsonObject properties) {
@Override public void update(int serviceId, NodeType nodeType, JsonObject properties) {
ServiceInventory serviceInventory = getServiceInventoryCache().get(serviceId);
if (Objects.nonNull(serviceInventory)) {
serviceInventory = serviceInventory.getClone();
serviceInventory.setProperties(properties);
serviceInventory.setMappingLastUpdateTime(System.currentTimeMillis());
InventoryProcess.INSTANCE.in(serviceInventory);
if (properties != null || !compare(serviceInventory, nodeType)) {
serviceInventory = serviceInventory.getClone();
serviceInventory.setServiceNodeType(nodeType);
serviceInventory.setProperties(properties);
serviceInventory.setMappingLastUpdateTime(System.currentTimeMillis());
InventoryProcess.INSTANCE.in(serviceInventory);
}
} else {
logger.warn("Service {} properties update, but not found in storage.", serviceId);
logger.warn("Service {} nodeType/properties update, but not found in storage.", serviceId);
}
}
......@@ -128,4 +131,11 @@ public class ServiceInventoryRegister implements IServiceInventoryRegister {
logger.warn("Service {} mapping update, but not found in storage.", serviceId);
}
}
private boolean compare(ServiceInventory newServiceInventory, NodeType nodeType) {
if (Objects.nonNull(newServiceInventory)) {
return nodeType.equals(newServiceInventory.getServiceNodeType());
}
return true;
}
}
......@@ -18,6 +18,7 @@
package org.apache.skywalking.aop.server.receiver.mesh;
import com.google.gson.JsonObject;
import org.apache.skywalking.apm.network.common.DetectPoint;
import org.apache.skywalking.apm.network.servicemesh.ServiceMeshMetric;
import org.apache.skywalking.oap.server.core.Const;
......@@ -129,9 +130,9 @@ public class ServiceMeshMetricDataDecorator {
return newDataBuilder;
}
private ServiceInstanceInventory.AgentOsInfo getOSInfoForMesh(String instanceName) {
ServiceInstanceInventory.AgentOsInfo osInfo = new ServiceInstanceInventory.AgentOsInfo();
osInfo.setHostname(instanceName);
return osInfo;
private JsonObject getOSInfoForMesh(String instanceName) {
JsonObject properties = new JsonObject();
properties.addProperty(ServiceInstanceInventory.PropertyUtil.HOST_NAME, instanceName);
return properties;
}
}
......@@ -19,12 +19,14 @@
package org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.grpc;
import com.google.common.base.Strings;
import com.google.gson.JsonObject;
import io.grpc.stub.StreamObserver;
import java.util.Objects;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.cache.*;
import org.apache.skywalking.oap.server.core.register.*;
import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory.PropertyUtil;
import org.apache.skywalking.oap.server.core.register.service.*;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
......@@ -53,11 +55,12 @@ public class InstanceDiscoveryServiceHandler extends InstanceDiscoveryServiceGrp
public void registerInstance(ApplicationInstance request,
StreamObserver<ApplicationInstanceMapping> responseObserver) {
OSInfo osinfo = request.getOsinfo();
ServiceInstanceInventory.AgentOsInfo agentOsInfo = new ServiceInstanceInventory.AgentOsInfo();
agentOsInfo.setHostname(osinfo.getHostname());
agentOsInfo.setOsName(osinfo.getOsName());
agentOsInfo.setProcessNo(osinfo.getProcessNo());
agentOsInfo.getIpv4s().addAll(osinfo.getIpv4SList());
JsonObject instanceProperties = new JsonObject();
instanceProperties.addProperty(PropertyUtil.HOST_NAME, osinfo.getHostname());
instanceProperties.addProperty(PropertyUtil.OS_NAME, osinfo.getOsName());
instanceProperties.addProperty(PropertyUtil.PROCESS_NO, osinfo.getProcessNo() + "");
instanceProperties.addProperty(PropertyUtil.IPV4S, PropertyUtil.ipv4sSerialize(osinfo.getIpv4SList()));
ServiceInventory serviceInventory = serviceInventoryCache.get(request.getApplicationId());
......@@ -69,7 +72,7 @@ public class InstanceDiscoveryServiceHandler extends InstanceDiscoveryServiceGrp
instanceName += "@" + osinfo.getHostname();
}
int serviceInstanceId = serviceInstanceInventoryRegister.getOrCreate(request.getApplicationId(), instanceName, request.getAgentUUID(), request.getRegisterTime(), agentOsInfo);
int serviceInstanceId = serviceInstanceInventoryRegister.getOrCreate(request.getApplicationId(), instanceName, request.getAgentUUID(), request.getRegisterTime(), instanceProperties);
ApplicationInstanceMapping.Builder builder = ApplicationInstanceMapping.newBuilder();
builder.setApplicationId(request.getApplicationId());
builder.setApplicationInstanceId(serviceInstanceId);
......
......@@ -18,9 +18,9 @@
package org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest;
import com.google.common.base.Strings;
import com.google.gson.*;
import java.io.IOException;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache;
......@@ -30,6 +30,8 @@ import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.jetty.*;
import org.slf4j.*;
import static org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory.PropertyUtil.*;
/**
* @author peng-yongsheng
*/
......@@ -69,25 +71,27 @@ public class InstanceDiscoveryServletHandler extends JettyJsonHandler {
long registerTime = instance.get(REGISTER_TIME).getAsLong();
JsonObject osInfoJson = instance.get(OS_INFO).getAsJsonObject();
ServiceInstanceInventory.AgentOsInfo agentOsInfo = new ServiceInstanceInventory.AgentOsInfo();
agentOsInfo.setHostname(osInfoJson.get("hostName").getAsString());
agentOsInfo.setOsName(osInfoJson.get("osName").getAsString());
agentOsInfo.setProcessNo(osInfoJson.get("processId").getAsInt());
List<String> ipv4sList = new ArrayList<>();
JsonArray ipv4s = osInfoJson.get("ipv4s").getAsJsonArray();
ipv4s.forEach(ipv4 -> agentOsInfo.getIpv4s().add(ipv4.getAsString()));
ipv4s.forEach(ipv4 -> ipv4sList.add(ipv4.getAsString()));
ServiceInventory serviceInventory = serviceInventoryCache.get(applicationId);
JsonObject instanceProperties = new JsonObject();
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.HOST_NAME, osInfoJson.get("hostName").getAsString());
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.OS_NAME, osInfoJson.get("osName").getAsString());
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.PROCESS_NO, osInfoJson.get("processId").getAsInt() + "");
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.IPV4S, ServiceInstanceInventory.PropertyUtil.ipv4sSerialize(ipv4sList));
String instanceName = serviceInventory.getName();
if (agentOsInfo.getProcessNo() != 0) {
instanceName += "-pid:" + agentOsInfo.getProcessNo();
if (instanceProperties.has(PROCESS_NO)) {
instanceName += "-pid:" + instanceProperties.get(PROCESS_NO).getAsString();
}
if (!Strings.isNullOrEmpty(agentOsInfo.getHostname())) {
instanceName += "@" + agentOsInfo.getHostname();
if (instanceProperties.has(HOST_NAME)) {
instanceName += "@" + instanceProperties.get(HOST_NAME).getAsString();
}
int instanceId = serviceInstanceInventoryRegister.getOrCreate(applicationId, instanceName, agentUUID, registerTime, agentOsInfo);
int instanceId = serviceInstanceInventoryRegister.getOrCreate(applicationId, instanceName, agentUUID, registerTime, instanceProperties);
responseJson.addProperty(APPLICATION_ID, applicationId);
responseJson.addProperty(INSTANCE_ID, instanceId);
} catch (IOException e) {
......
......@@ -18,8 +18,9 @@
package org.apache.skywalking.oap.server.receiver.register.provider.handler.v6.grpc;
import com.google.common.base.Strings;
import com.google.gson.JsonObject;
import io.grpc.stub.StreamObserver;
import java.util.*;
import org.apache.skywalking.apm.network.common.*;
import org.apache.skywalking.apm.network.register.v2.*;
import org.apache.skywalking.apm.util.StringUtil;
......@@ -33,6 +34,8 @@ import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.grpc.InstanceDiscoveryServiceHandler;
import org.slf4j.*;
import static org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory.PropertyUtil.*;
/**
* @author wusheng
*/
......@@ -83,34 +86,39 @@ public class RegisterServiceHandler extends RegisterGrpc.RegisterImplBase implem
request.getInstancesList().forEach(instance -> {
ServiceInventory serviceInventory = serviceInventoryCache.get(instance.getServiceId());
ServiceInstanceInventory.AgentOsInfo agentOsInfo = new ServiceInstanceInventory.AgentOsInfo();
JsonObject instanceProperties = new JsonObject();
List<String> ipv4s = new ArrayList<>();
for (KeyStringValuePair property : instance.getPropertiesList()) {
String key = property.getKey();
switch (key) {
case "OSName":
agentOsInfo.setOsName(property.getValue());
case HOST_NAME:
instanceProperties.addProperty(HOST_NAME, property.getValue());
case OS_NAME:
instanceProperties.addProperty(OS_NAME, property.getValue());
break;
case "hostname":
agentOsInfo.setHostname(property.getValue());
case LANGUAGE:
instanceProperties.addProperty(LANGUAGE, property.getValue());
break;
case "ipv4":
agentOsInfo.getIpv4s().add(property.getValue());
ipv4s.add(property.getValue());
break;
case "ProcessNo":
agentOsInfo.setProcessNo(Integer.parseInt(property.getValue()));
case PROCESS_NO:
instanceProperties.addProperty(PROCESS_NO, property.getValue());
break;
}
}
instanceProperties.addProperty(IPV4S, ServiceInstanceInventory.PropertyUtil.ipv4sSerialize(ipv4s));
String instanceName = serviceInventory.getName();
if (agentOsInfo.getProcessNo() != 0) {
instanceName += "-pid:" + agentOsInfo.getProcessNo();
if (instanceProperties.has(PROCESS_NO)) {
instanceName += "-pid:" + instanceProperties.get(PROCESS_NO).getAsString();
}
if (!Strings.isNullOrEmpty(agentOsInfo.getHostname())) {
instanceName += "@" + agentOsInfo.getHostname();
if (instanceProperties.has(HOST_NAME)) {
instanceName += "@" + instanceProperties.get(HOST_NAME).getAsString();
}
int serviceInstanceId = serviceInstanceInventoryRegister.getOrCreate(instance.getServiceId(), instanceName, instance.getInstanceUUID(), instance.getTime(), agentOsInfo);
int serviceInstanceId = serviceInstanceInventoryRegister.getOrCreate(instance.getServiceId(), instanceName, instance.getInstanceUUID(), instance.getTime(), instanceProperties);
if (serviceInstanceId != Const.NONE) {
logger.info("register service instance id={} [UUID:{}]", serviceInstanceId, instance.getInstanceUUID());
......
......@@ -78,8 +78,8 @@ public class SpanIdExchanger implements IdExchanger<SpanDecorator> {
}
}
int peerId = 0;
if (standardBuilder.getPeerId() == 0 && !Strings.isNullOrEmpty(standardBuilder.getPeer())) {
int peerId = standardBuilder.getPeerId();
if (peerId == 0 && !Strings.isNullOrEmpty(standardBuilder.getPeer())) {
peerId = networkAddressInventoryRegister.getOrCreate(standardBuilder.getPeer(), buildServiceProperties(standardBuilder));
if (peerId == Const.NONE) {
......@@ -96,19 +96,23 @@ public class SpanIdExchanger implements IdExchanger<SpanDecorator> {
if (peerId != Const.NONE) {
int spanLayerValue = standardBuilder.getSpanLayerValue();
networkAddressInventoryRegister.update(peerId, NodeType.fromSpanLayerValue(spanLayerValue));
NodeType nodeType = NodeType.fromSpanLayerValue(spanLayerValue);
networkAddressInventoryRegister.update(peerId, nodeType);
/**
* In some case, conjecture node, such as Database node, could be registered by agents.
* At here, if the target service properties need to be updated,
* it will only be updated at the first time for now.
*/
JsonObject properties = null;
ServiceInventory newServiceInventory = serviceInventoryCacheDAO.get(serviceInventoryCacheDAO.getServiceId(peerId));
if (SpanLayer.Database.equals(standardBuilder.getSpanLayer())) {
ServiceInventory newServiceInventory = serviceInventoryCacheDAO.get(serviceInventoryCacheDAO.getServiceId(peerId));
if (!newServiceInventory.hasProperties()) {
serviceInventoryRegister.updateProperties(newServiceInventory.getSequence(), buildServiceProperties(standardBuilder));
properties = buildServiceProperties(standardBuilder);
}
}
serviceInventoryRegister.update(newServiceInventory.getSequence(), nodeType, properties);
}
if (standardBuilder.getOperationNameId() == Const.NONE) {
......
......@@ -18,6 +18,7 @@
package org.apache.skywalking.oap.server.receiver.zipkin;
import com.google.gson.JsonObject;
import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
/**
......@@ -25,9 +26,9 @@ import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
*/
public class ZipkinTraceOSInfoBuilder {
public static ServiceInstanceInventory.AgentOsInfo getOSInfoForZipkin(String instanceName) {
ServiceInstanceInventory.AgentOsInfo osInfo = new ServiceInstanceInventory.AgentOsInfo();
osInfo.setHostname(instanceName);
return osInfo;
public static JsonObject getOSInfoForZipkin(String instanceName) {
JsonObject properties = new JsonObject();
properties.addProperty(ServiceInstanceInventory.PropertyUtil.HOST_NAME, instanceName);
return properties;
}
}
......@@ -20,22 +20,14 @@ package org.apache.skywalking.oap.server.receiver.zipkin.transform;
import com.google.gson.JsonObject;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;
import org.apache.skywalking.apm.network.language.agent.SpanType;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference;
import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
import org.apache.skywalking.oap.server.core.register.*;
import org.apache.skywalking.oap.server.core.register.service.IServiceInstanceInventoryRegister;
import org.apache.skywalking.oap.server.core.register.service.IServiceInventoryRegister;
import org.apache.skywalking.apm.network.language.agent.v2.*;
import org.apache.skywalking.oap.server.core.register.NodeType;
import org.apache.skywalking.oap.server.core.register.service.*;
import org.apache.skywalking.oap.server.receiver.zipkin.CoreRegisterLinker;
import org.apache.skywalking.oap.server.receiver.zipkin.data.SkyWalkingTrace;
import org.apache.skywalking.oap.server.receiver.zipkin.data.ZipkinTrace;
import org.junit.Assert;
import org.junit.Test;
import org.apache.skywalking.oap.server.receiver.zipkin.data.*;
import org.junit.*;
import org.powermock.reflect.Whitebox;
import zipkin2.Span;
import zipkin2.codec.SpanBytesDecoder;
......@@ -75,7 +67,7 @@ public class SpringSleuthSegmentBuilderTest implements SegmentListener {
}
}
@Override public void updateProperties(int serviceId, JsonObject properties) {
@Override public void update(int serviceId, NodeType nodeType, JsonObject properties) {
}
@Override public void heartbeat(int serviceId, long heartBeatTime) {
......@@ -86,12 +78,11 @@ public class SpringSleuthSegmentBuilderTest implements SegmentListener {
}
};
IServiceInstanceInventoryRegister instanceIDService = new IServiceInstanceInventoryRegister() {
@Override public int getOrCreate(int serviceId, String serviceInstanceName, String uuid, long registerTime,
ServiceInstanceInventory.AgentOsInfo osInfo) {
JsonObject osInfo) {
String key = "AppCode:" + serviceId + ",UUID:" + uuid;
if (applicationInstRegister.containsKey(key)) {
return applicationInstRegister.get(key);
......
......@@ -19,6 +19,7 @@
package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query;
import com.google.common.base.Strings;
import com.google.gson.*;
import java.io.IOException;
import java.util.*;
import org.apache.skywalking.oap.server.core.query.entity.*;
......@@ -34,10 +35,13 @@ import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import static org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory.PropertyUtil.*;
/**
* @author peng-yongsheng
*/
public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
private static final Gson GSON = new Gson();
public MetadataQueryEsDAO(ElasticSearchClient client) {
super(client);
......@@ -72,7 +76,8 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
return (int)response.getHits().getTotalHits();
}
@Override public int numOfConjectural(long startTimestamp, long endTimestamp, int nodeTypeValue) throws IOException {
@Override
public int numOfConjectural(long startTimestamp, long endTimestamp, int nodeTypeValue) throws IOException {
SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
sourceBuilder.query(QueryBuilders.termQuery(ServiceInventory.NODE_TYPE, nodeTypeValue));
......@@ -186,23 +191,31 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
ServiceInstance serviceInstance = new ServiceInstance();
serviceInstance.setId(String.valueOf(sourceAsMap.get(ServiceInstanceInventory.SEQUENCE)));
serviceInstance.setName((String)sourceAsMap.get(ServiceInstanceInventory.NAME));
int languageId = ((Number)sourceAsMap.get(ServiceInstanceInventory.LANGUAGE)).intValue();
serviceInstance.setLanguage(LanguageTrans.INSTANCE.value(languageId));
String osName = (String)sourceAsMap.get(ServiceInstanceInventory.OS_NAME);
if (!Strings.isNullOrEmpty(osName)) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.OS_NAME, osName));
String propertiesString = (String)sourceAsMap.get(ServiceInstanceInventory.PROPERTIES);
if (!Strings.isNullOrEmpty(propertiesString)) {
JsonObject properties = GSON.fromJson(propertiesString, JsonObject.class);
if (properties.has(LANGUAGE)) {
serviceInstance.setLanguage(LanguageTrans.INSTANCE.value(properties.get(LANGUAGE).getAsString()));
}
if (properties.has(OS_NAME)) {
serviceInstance.getAttributes().add(new Attribute(OS_NAME, properties.get(OS_NAME).getAsString()));
}
if (properties.has(HOST_NAME)) {
serviceInstance.getAttributes().add(new Attribute(HOST_NAME, properties.get(HOST_NAME).getAsString()));
}
if (properties.has(PROCESS_NO)) {
serviceInstance.getAttributes().add(new Attribute(PROCESS_NO, properties.get(PROCESS_NO).getAsString()));
}
if (properties.has(IPV4S)) {
List<String> ipv4s = ServiceInstanceInventory.PropertyUtil.ipv4sDeserialize(properties.get(IPV4S).getAsString());
for (String ipv4 : ipv4s) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.PropertyUtil.IPV4S, ipv4));
}
}
}
String hostName = (String)sourceAsMap.get(ServiceInstanceInventory.HOST_NAME);
if (!Strings.isNullOrEmpty(hostName)) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.HOST_NAME, hostName));
}
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.PROCESS_NO, String.valueOf(((Number)sourceAsMap.get(ServiceInstanceInventory.PROCESS_NO)).intValue())));
List<String> ipv4s = ServiceInstanceInventory.AgentOsInfo.ipv4sDeserialize((String)sourceAsMap.get(ServiceInstanceInventory.IPV4S));
for (String ipv4 : ipv4s) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.IPV4S, ipv4));
}
serviceInstances.add(serviceInstance);
}
......
......@@ -19,6 +19,7 @@
package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
import com.google.common.base.Strings;
import com.google.gson.*;
import java.io.IOException;
import java.sql.*;
import java.util.*;
......@@ -29,10 +30,14 @@ import org.apache.skywalking.oap.server.core.storage.query.IMetadataQueryDAO;
import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
import org.apache.skywalking.oap.server.library.util.BooleanUtils;
import static org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory.PropertyUtil.*;
/**
* @author wusheng
*/
public class H2MetadataQueryDAO implements IMetadataQueryDAO {
private static final Gson GSON = new Gson();
private JDBCHikariCPClient h2Client;
public H2MetadataQueryDAO(JDBCHikariCPClient h2Client) {
......@@ -211,22 +216,29 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
ServiceInstance serviceInstance = new ServiceInstance();
serviceInstance.setId(resultSet.getString(ServiceInstanceInventory.SEQUENCE));
serviceInstance.setName(resultSet.getString(ServiceInstanceInventory.NAME));
int languageId = resultSet.getInt(ServiceInstanceInventory.LANGUAGE);
serviceInstance.setLanguage(LanguageTrans.INSTANCE.value(languageId));
String osName = resultSet.getString(ServiceInstanceInventory.OS_NAME);
if (!Strings.isNullOrEmpty(osName)) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.OS_NAME, osName));
}
String hostName = resultSet.getString(ServiceInstanceInventory.HOST_NAME);
if (!Strings.isNullOrEmpty(hostName)) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.HOST_NAME, hostName));
}
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.PROCESS_NO, resultSet.getString(ServiceInstanceInventory.PROCESS_NO)));
String propertiesString = resultSet.getString(ServiceInstanceInventory.PROPERTIES);
if (!Strings.isNullOrEmpty(propertiesString)) {
JsonObject properties = GSON.fromJson(propertiesString, JsonObject.class);
if (properties.has(LANGUAGE)) {
serviceInstance.setLanguage(LanguageTrans.INSTANCE.value(properties.get(LANGUAGE).getAsString()));
}
List<String> ipv4s = ServiceInstanceInventory.AgentOsInfo.ipv4sDeserialize(resultSet.getString(ServiceInstanceInventory.IPV4S));
for (String ipv4 : ipv4s) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.IPV4S, ipv4));
if (properties.has(OS_NAME)) {
serviceInstance.getAttributes().add(new Attribute(OS_NAME, properties.get(OS_NAME).getAsString()));
}
if (properties.has(HOST_NAME)) {
serviceInstance.getAttributes().add(new Attribute(HOST_NAME, properties.get(HOST_NAME).getAsString()));
}
if (properties.has(PROCESS_NO)) {
serviceInstance.getAttributes().add(new Attribute(PROCESS_NO, properties.get(PROCESS_NO).getAsString()));
}
if (properties.has(IPV4S)) {
List<String> ipv4s = ServiceInstanceInventory.PropertyUtil.ipv4sDeserialize(properties.get(IPV4S).getAsString());
for (String ipv4 : ipv4s) {
serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.PropertyUtil.IPV4S, ipv4));
}
}
}
serviceInstances.add(serviceInstance);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册