From b5eb9e304ddc0170ac559ab9607ab5d624449290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=99=9F=20Wu=20Sheng?= Date: Sun, 13 Jan 2019 22:07:52 +0800 Subject: [PATCH] Support Service Instance Inventory properties and bug fixed (#2156) * Refactor service instance inventory to properties based entity. * Fix a bug and refactor properties update. --- .../skywalking/apm/agent/core/os/OSUtil.java | 7 +- .../core/query/entity/LanguageTrans.java | 33 ++------ .../register/ServiceInstanceInventory.java | 80 +++++++++---------- .../IServiceInstanceInventoryRegister.java | 4 +- .../service/IServiceInventoryRegister.java | 3 +- .../NetworkAddressInventoryRegister.java | 18 +---- .../ServiceInstanceInventoryRegister.java | 8 +- .../service/ServiceInventoryRegister.java | 26 ++++-- .../mesh/ServiceMeshMetricDataDecorator.java | 9 ++- .../grpc/InstanceDiscoveryServiceHandler.java | 15 ++-- .../rest/InstanceDiscoveryServletHandler.java | 28 ++++--- .../v6/grpc/RegisterServiceHandler.java | 36 +++++---- .../standardization/SpanIdExchanger.java | 14 ++-- .../zipkin/ZipkinTraceOSInfoBuilder.java | 9 ++- .../SpringSleuthSegmentBuilderTest.java | 25 ++---- .../query/MetadataQueryEsDAO.java | 43 ++++++---- .../jdbc/h2/dao/H2MetadataQueryDAO.java | 40 ++++++---- 17 files changed, 201 insertions(+), 197 deletions(-) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java index 0f4a1cbf9a..8a2fde4a6d 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java @@ -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 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; } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LanguageTrans.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LanguageTrans.java index f979ef4d22..369fb52595 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LanguageTrans.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LanguageTrans.java @@ -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; diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java index 4e8697463c..196a674523 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java @@ -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 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 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 ipv4) { Gson gson = new Gson(); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInstanceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInstanceInventoryRegister.java index fa5582543a..e4eda92ba8 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInstanceInventoryRegister.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInstanceInventoryRegister.java @@ -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); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInventoryRegister.java index c4d7ef02fd..93fdc25deb 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInventoryRegister.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/IServiceInventoryRegister.java @@ -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); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java index 3910299716..68d43f6f8b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java @@ -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; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java index 9a0dc76021..3ea7b3962a 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java @@ -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); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java index 5cb6737c16..7d59776235 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java @@ -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; + } } diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java index abdbb10bea..8e6d273aed 100644 --- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java +++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java @@ -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; } } diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java index f481e7d6d1..4bb5479ecf 100644 --- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java @@ -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 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); diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java index d21b6f4ac6..d1ba1808ef 100644 --- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java @@ -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 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) { diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/RegisterServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/RegisterServiceHandler.java index f31f27faef..ba922f1ddc 100644 --- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/RegisterServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/RegisterServiceHandler.java @@ -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 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()); diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java index f9bcf9c87a..dfeeb33af2 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java @@ -78,8 +78,8 @@ public class SpanIdExchanger implements IdExchanger { } } - 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 { 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) { diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinTraceOSInfoBuilder.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinTraceOSInfoBuilder.java index cf929f5462..451ba53fca 100644 --- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinTraceOSInfoBuilder.java +++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/ZipkinTraceOSInfoBuilder.java @@ -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; } } diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java index 5539046058..9a538858d5 100644 --- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java +++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java @@ -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); diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java index 9b0fcda6e9..80ff9a737d 100644 --- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java @@ -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 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 ipv4s = ServiceInstanceInventory.AgentOsInfo.ipv4sDeserialize((String)sourceAsMap.get(ServiceInstanceInventory.IPV4S)); - for (String ipv4 : ipv4s) { - serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.IPV4S, ipv4)); - } serviceInstances.add(serviceInstance); } diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java index 89ecccf0a8..301887f0c4 100644 --- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java @@ -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 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 ipv4s = ServiceInstanceInventory.PropertyUtil.ipv4sDeserialize(properties.get(IPV4S).getAsString()); + for (String ipv4 : ipv4s) { + serviceInstance.getAttributes().add(new Attribute(ServiceInstanceInventory.PropertyUtil.IPV4S, ipv4)); + } + } } serviceInstances.add(serviceInstance); -- GitLab