You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2019/01/13 07:01:02 UTC

[incubator-skywalking] 01/01: Refactor service instance inventory to properties based entity.

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch instance-extend
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git

commit 1fccc33596834833674bbb5cada48d2d647a5e56
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Sun Jan 13 15:00:49 2019 +0800

    Refactor service instance inventory to properties based entity.
---
 .../skywalking/apm/agent/core/os/OSUtil.java       |  7 +-
 .../server/core/query/entity/LanguageTrans.java    | 33 ++-------
 .../core/register/ServiceInstanceInventory.java    | 80 ++++++++++------------
 .../service/IServiceInstanceInventoryRegister.java |  4 +-
 .../service/ServiceInstanceInventoryRegister.java  |  8 +--
 .../mesh/ServiceMeshMetricDataDecorator.java       |  9 +--
 .../v5/grpc/InstanceDiscoveryServiceHandler.java   | 15 ++--
 .../v5/rest/InstanceDiscoveryServletHandler.java   | 28 ++++----
 .../handler/v6/grpc/RegisterServiceHandler.java    | 36 ++++++----
 .../receiver/zipkin/ZipkinTraceOSInfoBuilder.java  |  9 +--
 .../transform/SpringSleuthSegmentBuilderTest.java  |  2 +-
 .../elasticsearch/query/MetadataQueryEsDAO.java    | 43 ++++++++----
 .../plugin/jdbc/h2/dao/H2MetadataQueryDAO.java     | 40 +++++++----
 13 files changed, 164 insertions(+), 150 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 0f4a1cb..8a2fde4 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<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;
     }
 }
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 f979ef4..369fb52 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 4e86974..196a674 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<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();
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 fa55825..e4eda92 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/ServiceInstanceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java
index 9a0dc76..3ea7b39 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-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 abdbb10..8e6d273 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 f481e7d..4bb5479 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<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);
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 d21b6f4..d1ba180 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<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) {
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 f31f27f..ba922f1 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<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());
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 cf929f5..451ba53 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 5539046..3457830 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
@@ -91,7 +91,7 @@ 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 9b0fcda..80ff9a7 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<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);
         }
 
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 89ecccf..301887f 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<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);