Commit b5eb9e30 authored by 吴晟's avatar 吴晟 Committed by Jared Tan
Browse files

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

* Refactor service instance inventory to properties based entity.

* Fix a bug and refactor properties update.
parent 98ad680c
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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;
    }
}
+6 −27
Original line number Diff line number Diff line
@@ -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;
+37 −43
Original line number Diff line number Diff line
@@ -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();
+2 −2
Original line number Diff line number Diff line
@@ -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);

+2 −1
Original line number Diff line number Diff line
@@ -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);

Loading