diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java index 8f5f8a545..c7ef7207f 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java @@ -19,7 +19,7 @@ package org.apache.skywalking.oap.server.core.query; import java.io.IOException; -import java.util.*; +import java.util.List; import org.apache.skywalking.apm.network.language.agent.SpanLayer; import org.apache.skywalking.oap.server.core.query.entity.*; import org.apache.skywalking.oap.server.core.storage.StorageModule; @@ -59,20 +59,22 @@ public class MetadataQueryService implements org.apache.skywalking.oap.server.li return getMetadataQueryDAO().getAllServices(startTimestamp, endTimestamp); } - public List searchServices(final long startTimestamp, final long endTimestamp, final String keyword) { - return Collections.emptyList(); + public List searchServices(final long startTimestamp, final long endTimestamp, + final String keyword) throws IOException { + return getMetadataQueryDAO().searchServices(startTimestamp, endTimestamp, keyword); } public List getServiceInstances(final long startTimestamp, final long endTimestamp, - final String id) { - return Collections.emptyList(); + final String serviceId) throws IOException { + return getMetadataQueryDAO().getServiceInstances(startTimestamp, endTimestamp, serviceId); } - public List searchEndpoint(final String keyword, final String serviceId, final int limit) { - return Collections.emptyList(); + public List searchEndpoint(final String keyword, final String serviceId, + final int limit) throws IOException { + return getMetadataQueryDAO().searchEndpoint(keyword, serviceId, limit); } - public Service searchService(final long startTimestamp, final long endTimestamp, final String serviceCode) { - return new Service(); + public Service searchService(final String serviceCode) throws IOException { + return getMetadataQueryDAO().searchService(serviceCode); } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java index 92f785267..fa211d98e 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java @@ -19,6 +19,7 @@ package org.apache.skywalking.oap.server.core.query.entity; import lombok.*; +import org.apache.skywalking.oap.server.core.source.DetectPoint; @Getter @Setter @@ -27,4 +28,5 @@ public class Call { private int target; private String callType; private String id; + private DetectPoint detectPoint; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java index d0b4b8e48..fb55fa77b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java @@ -18,6 +18,10 @@ package org.apache.skywalking.oap.server.core.query.entity; +import lombok.*; + +@Getter +@Setter public class Endpoint { private String id; private String name; 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 new file mode 100644 index 000000000..f979ef4d2 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LanguageTrans.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.oap.server.core.query.entity; + +/** + * @author peng-yongsheng + */ +public enum LanguageTrans { + INSTANCE; + + public int id(Language 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: + return Language.JAVA; + case 3: + return Language.DOTNET; + case 4: + return Language.NODEJS; + case 5: + return Language.PYTHON; + case 6: + return Language.RUBY; + default: + return Language.UNKNOWN; + } + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java index e56435fed..7286b0dd1 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java @@ -38,8 +38,8 @@ public class EndpointInventory extends RegisterSource { public static final String MODEL_NAME = "endpoint_inventory"; - private static final String SERVICE_ID = "service_id"; - private static final String NAME = "name"; + public static final String SERVICE_ID = "service_id"; + public static final String NAME = "name"; public static final String DETECT_POINT = "detect_point"; @Setter @Getter @Column(columnName = SERVICE_ID) private int serviceId; 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 529689c4c..25f11c0ba 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 @@ -42,16 +42,18 @@ public class ServiceInstanceInventory extends RegisterSource { public static final String MODEL_NAME = "service_instance_inventory"; public static final String NAME = "name"; - private static final String SERVICE_ID = "service_id"; + public static final String SERVICE_ID = "service_id"; private static final String IS_ADDRESS = "is_address"; private static final String ADDRESS_ID = "address_id"; private static final String OS_NAME = "os_name"; private static final String HOST_NAME = "host_name"; private static final String PROCESS_NO = "process_no"; private static final String IPV4S = "ipv4s"; + public static final String LANGUAGE = "language"; @Setter @Getter @Column(columnName = NAME, matchQuery = true) 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; @@ -109,9 +111,10 @@ public class ServiceInstanceInventory extends RegisterSource { RemoteData.Builder remoteBuilder = RemoteData.newBuilder(); remoteBuilder.setDataIntegers(0, getSequence()); remoteBuilder.setDataIntegers(1, serviceId); - remoteBuilder.setDataIntegers(2, isAddress); - remoteBuilder.setDataIntegers(3, addressId); - remoteBuilder.setDataIntegers(4, processNo); + remoteBuilder.setDataIntegers(2, language); + remoteBuilder.setDataIntegers(3, isAddress); + remoteBuilder.setDataIntegers(4, addressId); + remoteBuilder.setDataIntegers(5, processNo); remoteBuilder.setDataLongs(0, getRegisterTime()); remoteBuilder.setDataLongs(1, getHeartbeatTime()); @@ -126,9 +129,10 @@ public class ServiceInstanceInventory extends RegisterSource { @Override public void deserialize(RemoteData remoteData) { setSequence(remoteData.getDataIntegers(0)); setServiceId(remoteData.getDataIntegers(1)); - setIsAddress(remoteData.getDataIntegers(2)); - setAddressId(remoteData.getDataIntegers(3)); - setProcessNo(remoteData.getDataIntegers(4)); + setLanguage(remoteData.getDataIntegers(2)); + setIsAddress(remoteData.getDataIntegers(3)); + setAddressId(remoteData.getDataIntegers(4)); + setProcessNo(remoteData.getDataIntegers(5)); setRegisterTime(remoteData.getDataLongs(0)); setHeartbeatTime(remoteData.getDataLongs(1)); @@ -149,6 +153,7 @@ 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)); @@ -167,6 +172,7 @@ 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()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java index 1a9ee7385..df4a45a5a 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java @@ -34,6 +34,4 @@ public @interface Column { Function function() default Function.None; boolean matchQuery() default false; - - boolean termQuery() default true; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java index e00399540..ce6173747 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java @@ -60,7 +60,7 @@ public class StorageAnnotationListener implements AnnotationListener, IModelGett for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { Column column = field.getAnnotation(Column.class); - modelColumns.add(new ModelColumn(new ColumnName(column.columnName(), column.columnName()), field.getType())); + modelColumns.add(new ModelColumn(new ColumnName(column.columnName(), column.columnName()), field.getType(), column.matchQuery())); if (logger.isDebugEnabled()) { logger.debug("The field named {} with the {} type", column.columnName(), field.getType()); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java index b3f347895..a35aa5e11 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java @@ -24,9 +24,10 @@ import lombok.Getter; /** * @author peng-yongsheng */ +@Getter public class Model { - @Getter private final String name; - @Getter private final List columns; + private final String name; + private final List columns; public Model(String name, List columns) { this.name = name; diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelColumn.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelColumn.java index c75c862d0..763791b8a 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelColumn.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelColumn.java @@ -23,12 +23,15 @@ import lombok.Getter; /** * @author peng-yongsheng */ +@Getter public class ModelColumn { - @Getter private final ColumnName columnName; - @Getter private final Class type; + private final ColumnName columnName; + private final Class type; + private final boolean matchQuery; - public ModelColumn(ColumnName columnName, Class type) { + public ModelColumn(ColumnName columnName, Class type, boolean matchQuery) { this.columnName = columnName; this.type = type; + this.matchQuery = matchQuery; } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java index e5ae1a33a..b3808b8f5 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java @@ -42,7 +42,7 @@ public abstract class ModelInstaller { IModelGetter modelGetter = moduleManager.find(CoreModule.NAME).getService(IModelGetter.class); List models = modelGetter.getModels(); - Boolean debug = System.getProperty("debug") != null; + boolean debug = System.getProperty("debug") != null; for (Model model : models) { if (!isExists(client, model)) { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IMetadataQueryDAO.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IMetadataQueryDAO.java index 74cb303d5..e4d66b22f 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IMetadataQueryDAO.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IMetadataQueryDAO.java @@ -20,7 +20,7 @@ package org.apache.skywalking.oap.server.core.storage.query; import java.io.IOException; import java.util.List; -import org.apache.skywalking.oap.server.core.query.entity.Service; +import org.apache.skywalking.oap.server.core.query.entity.*; import org.apache.skywalking.oap.server.core.storage.DAO; /** @@ -35,4 +35,15 @@ public interface IMetadataQueryDAO extends DAO { int numOfConjectural(final long startTimestamp, final long endTimestamp, final int srcLayer) throws IOException; List getAllServices(final long startTimestamp, final long endTimestamp) throws IOException; + + List searchServices(final long startTimestamp, final long endTimestamp, + final String keyword) throws IOException; + + Service searchService(final String serviceCode) throws IOException; + + List searchEndpoint(final String keyword, final String serviceId, + final int limit) throws IOException; + + List getServiceInstances(final long startTimestamp, final long endTimestamp, + final String serviceId) throws IOException; } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java index 0c1d7e859..bcc6da09a 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java @@ -58,28 +58,28 @@ public class MetadataQuery implements GraphQLQueryResolver { return getMetadataQueryService().getAllServices(startTimestamp, endTimestamp); } - public List searchServices(final Duration duration, final String keyword) throws ParseException { + public List searchServices(final Duration duration, final String keyword) + throws IOException, ParseException { long startTimestamp = DurationUtils.INSTANCE.toTimestamp(duration.getStep(), duration.getStart()); long endTimestamp = DurationUtils.INSTANCE.toTimestamp(duration.getStep(), duration.getEnd()); return getMetadataQueryService().searchServices(startTimestamp, endTimestamp, keyword); } - public Service searchService(final Duration duration, final String serviceCode) throws ParseException { + public Service searchService(final String serviceCode) throws IOException { + return getMetadataQueryService().searchService(serviceCode); + } + + public List getServiceInstances(final Duration duration, + final String serviceId) throws IOException, ParseException { long startTimestamp = DurationUtils.INSTANCE.toTimestamp(duration.getStep(), duration.getStart()); long endTimestamp = DurationUtils.INSTANCE.toTimestamp(duration.getStep(), duration.getEnd()); - return getMetadataQueryService().searchService(startTimestamp, endTimestamp, serviceCode); + return getMetadataQueryService().getServiceInstances(startTimestamp, endTimestamp, serviceId); } - public List getServiceInstances(final Duration duration, final String id) throws ParseException { - long startTimestamp = DurationUtils.INSTANCE.toTimestamp(duration.getStep(), duration.getStart()); - long endTimestamp = DurationUtils.INSTANCE.toTimestamp(duration.getStep(), duration.getEnd()); - - return getMetadataQueryService().getServiceInstances(startTimestamp, endTimestamp, id); - } - - public List searchEndpoint(final String keyword, final String serviceId, final int limit) { + public List searchEndpoint(final String keyword, final String serviceId, + final int limit) throws IOException { return getMetadataQueryService().searchEndpoint(keyword, serviceId, limit); } } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol index 9eafa5a6c..f2e54c2cd 160000 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol @@ -1 +1 @@ -Subproject commit 9eafa5a6c5b3b9a61002391485799ed89be96b9c +Subproject commit f2e54c2cd3f7fdb2cdc975cf791e1bb1d9aab96e diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/MatchCNameBuilder.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/MatchCNameBuilder.java new file mode 100644 index 000000000..d650bf934 --- /dev/null +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/MatchCNameBuilder.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base; + +import org.apache.skywalking.oap.server.core.Const; + +/** + * @author peng-yongsheng + */ +public enum MatchCNameBuilder { + INSTANCE; + + public String build(String termCName) { + return termCName + Const.ID_SPLIT + "match"; + } +} diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java index 19e616ae7..05020e82d 100644 --- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java @@ -56,7 +56,7 @@ public class StorageEsInstaller extends ModelInstaller { } } - @Override protected void columnCheck(Client client, Model tableDefine) throws StorageException { + @Override protected void columnCheck(Client client, Model tableDefine) { } @@ -104,7 +104,7 @@ public class StorageEsInstaller extends ModelInstaller { .put("index.number_of_shards", indexShardsNumber) .put("index.number_of_replicas", indexReplicasNumber) .put("index.refresh_interval", "3s") - .put("analysis.analyzer.collector_analyzer.type", "stop") + .put("analysis.analyzer.oap_analyzer.type", "stop") .build(); } @@ -117,10 +117,24 @@ public class StorageEsInstaller extends ModelInstaller { .startObject("properties"); for (ModelColumn columnDefine : tableDefine.getColumns()) { - mappingBuilder - .startObject(columnDefine.getColumnName().getName()) - .field("type", mapping.transform(columnDefine.getType())) - .endObject(); + if (columnDefine.isMatchQuery()) { + String matchCName = MatchCNameBuilder.INSTANCE.build(columnDefine.getColumnName().getName()); + + mappingBuilder + .startObject(columnDefine.getColumnName().getName()) + .field("type", mapping.transform(columnDefine.getType())) + .field("copy_to", matchCName) + .endObject() + .startObject(matchCName) + .field("type", "text") + .field("analyzer", "oap_analyzer") + .endObject(); + } else { + mappingBuilder + .startObject(columnDefine.getColumnName().getName()) + .field("type", mapping.transform(columnDefine.getType())) + .endObject(); + } } mappingBuilder 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 78fc6460b..bfe37f3cf 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 @@ -20,13 +20,14 @@ package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query; import java.io.IOException; import java.util.*; -import org.apache.skywalking.oap.server.core.query.entity.Service; +import org.apache.skywalking.oap.server.core.query.entity.*; import org.apache.skywalking.oap.server.core.register.*; import org.apache.skywalking.oap.server.core.source.DetectPoint; import org.apache.skywalking.oap.server.core.storage.query.IMetadataQueryDAO; import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient; import org.apache.skywalking.oap.server.library.util.BooleanUtils; -import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.EsDAO; +import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.*; +import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.*; import org.elasticsearch.search.SearchHit; @@ -45,20 +46,7 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO { SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - - BoolQueryBuilder boolQuery1 = QueryBuilders.boolQuery(); - boolQuery1.must().add(QueryBuilders.rangeQuery(ServiceInventory.HEARTBEAT_TIME).gte(endTimestamp)); - boolQuery1.must().add(QueryBuilders.rangeQuery(ServiceInventory.REGISTER_TIME).lte(endTimestamp)); - - BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery(); - boolQuery2.must().add(QueryBuilders.rangeQuery(ServiceInventory.REGISTER_TIME).lte(endTimestamp)); - boolQuery2.must().add(QueryBuilders.rangeQuery(ServiceInventory.HEARTBEAT_TIME).gte(startTimestamp)); - - BoolQueryBuilder timeBoolQuery = QueryBuilders.boolQuery(); - timeBoolQuery.should().add(boolQuery1); - timeBoolQuery.should().add(boolQuery2); - - boolQueryBuilder.must().add(timeBoolQuery); + boolQueryBuilder.must().add(timeRangeQueryBuild(startTimestamp, endTimestamp)); boolQueryBuilder.must().add(QueryBuilders.termQuery(ServiceInventory.IS_ADDRESS, BooleanUtils.FALSE)); @@ -73,20 +61,7 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO { SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - - BoolQueryBuilder boolQuery1 = QueryBuilders.boolQuery(); - boolQuery1.must().add(QueryBuilders.rangeQuery(EndpointInventory.HEARTBEAT_TIME).gte(endTimestamp)); - boolQuery1.must().add(QueryBuilders.rangeQuery(EndpointInventory.REGISTER_TIME).lte(endTimestamp)); - - BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery(); - boolQuery2.must().add(QueryBuilders.rangeQuery(EndpointInventory.REGISTER_TIME).lte(endTimestamp)); - boolQuery2.must().add(QueryBuilders.rangeQuery(EndpointInventory.HEARTBEAT_TIME).gte(startTimestamp)); - - BoolQueryBuilder timeBoolQuery = QueryBuilders.boolQuery(); - timeBoolQuery.should().add(boolQuery1); - timeBoolQuery.should().add(boolQuery2); - - boolQueryBuilder.must().add(timeBoolQuery); + boolQueryBuilder.must().add(timeRangeQueryBuild(startTimestamp, endTimestamp)); boolQueryBuilder.must().add(QueryBuilders.termQuery(EndpointInventory.DETECT_POINT, DetectPoint.SERVER.ordinal())); @@ -101,20 +76,7 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO { SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - - BoolQueryBuilder boolQuery1 = QueryBuilders.boolQuery(); - boolQuery1.must().add(QueryBuilders.rangeQuery(NetworkAddressInventory.HEARTBEAT_TIME).gte(endTimestamp)); - boolQuery1.must().add(QueryBuilders.rangeQuery(NetworkAddressInventory.REGISTER_TIME).lte(endTimestamp)); - - BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery(); - boolQuery2.must().add(QueryBuilders.rangeQuery(NetworkAddressInventory.REGISTER_TIME).lte(endTimestamp)); - boolQuery2.must().add(QueryBuilders.rangeQuery(NetworkAddressInventory.HEARTBEAT_TIME).gte(startTimestamp)); - - BoolQueryBuilder timeBoolQuery = QueryBuilders.boolQuery(); - timeBoolQuery.should().add(boolQuery1); - timeBoolQuery.should().add(boolQuery2); - - boolQueryBuilder.must().add(timeBoolQuery); + boolQueryBuilder.must().add(timeRangeQueryBuild(startTimestamp, endTimestamp)); boolQueryBuilder.must().add(QueryBuilders.termQuery(NetworkAddressInventory.SRC_LAYER, srcLayer)); @@ -131,20 +93,7 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO { SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - - BoolQueryBuilder boolQuery1 = QueryBuilders.boolQuery(); - boolQuery1.must().add(QueryBuilders.rangeQuery(ServiceInventory.HEARTBEAT_TIME).gte(endTimestamp)); - boolQuery1.must().add(QueryBuilders.rangeQuery(ServiceInventory.REGISTER_TIME).lte(endTimestamp)); - - BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery(); - boolQuery2.must().add(QueryBuilders.rangeQuery(ServiceInventory.REGISTER_TIME).lte(endTimestamp)); - boolQuery2.must().add(QueryBuilders.rangeQuery(ServiceInventory.HEARTBEAT_TIME).gte(startTimestamp)); - - BoolQueryBuilder timeBoolQuery = QueryBuilders.boolQuery(); - timeBoolQuery.should().add(boolQuery1); - timeBoolQuery.should().add(boolQuery2); - - boolQueryBuilder.must().add(timeBoolQuery); + boolQueryBuilder.must().add(timeRangeQueryBuild(startTimestamp, endTimestamp)); boolQueryBuilder.must().add(QueryBuilders.termQuery(ServiceInventory.IS_ADDRESS, BooleanUtils.FALSE)); @@ -153,6 +102,97 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO { SearchResponse response = getClient().search(ServiceInventory.MODEL_NAME, sourceBuilder); + return buildServices(response); + } + + @Override public List searchServices(long startTimestamp, long endTimestamp, + String keyword) throws IOException { + SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must().add(timeRangeQueryBuild(startTimestamp, endTimestamp)); + + String matchCName = MatchCNameBuilder.INSTANCE.build(ServiceInventory.NAME); + boolQueryBuilder.must().add(QueryBuilders.matchQuery(matchCName, keyword)); + + sourceBuilder.query(boolQueryBuilder); + sourceBuilder.size(100); + + SearchResponse response = getClient().search(ServiceInventory.MODEL_NAME, sourceBuilder); + return buildServices(response); + } + + @Override + public Service searchService(String serviceCode) throws IOException { + GetResponse response = getClient().get(ServiceInventory.MODEL_NAME, ServiceInventory.buildId(serviceCode)); + if (response.isExists()) { + Service service = new Service(); + service.setId(String.valueOf(response.getSource().get(ServiceInventory.SEQUENCE))); + service.setName((String)response.getSource().get(ServiceInventory.NAME)); + return service; + } else { + return null; + } + } + + @Override public List searchEndpoint(String keyword, String serviceId, + int limit) throws IOException { + SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must().add(QueryBuilders.termQuery(EndpointInventory.SERVICE_ID, serviceId)); + + String matchCName = MatchCNameBuilder.INSTANCE.build(EndpointInventory.NAME); + boolQueryBuilder.must().add(QueryBuilders.matchQuery(matchCName, keyword)); + + sourceBuilder.query(boolQueryBuilder); + sourceBuilder.size(limit); + + SearchResponse response = getClient().search(EndpointInventory.MODEL_NAME, sourceBuilder); + + List endpoints = new ArrayList<>(); + for (SearchHit searchHit : response.getHits()) { + Map sourceAsMap = searchHit.getSourceAsMap(); + + Endpoint endpoint = new Endpoint(); + endpoint.setId(String.valueOf(sourceAsMap.get(EndpointInventory.SEQUENCE))); + endpoint.setName((String)sourceAsMap.get(EndpointInventory.NAME)); + endpoints.add(endpoint); + } + + return endpoints; + } + + @Override public List getServiceInstances(long startTimestamp, long endTimestamp, + String serviceId) throws IOException { + SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource(); + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must().add(timeRangeQueryBuild(startTimestamp, endTimestamp)); + + boolQueryBuilder.must().add(QueryBuilders.termQuery(ServiceInstanceInventory.SERVICE_ID, serviceId)); + + sourceBuilder.query(boolQueryBuilder); + sourceBuilder.size(100); + + SearchResponse response = getClient().search(ServiceInstanceInventory.MODEL_NAME, sourceBuilder); + + List serviceInstances = new ArrayList<>(); + for (SearchHit searchHit : response.getHits()) { + Map sourceAsMap = searchHit.getSourceAsMap(); + + 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)); + serviceInstances.add(serviceInstance); + } + + return serviceInstances; + } + + private List buildServices(SearchResponse response) { List services = new ArrayList<>(); for (SearchHit searchHit : response.getHits()) { Map sourceAsMap = searchHit.getSourceAsMap(); @@ -165,4 +205,20 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO { return services; } + + private BoolQueryBuilder timeRangeQueryBuild(long startTimestamp, long endTimestamp) { + BoolQueryBuilder boolQuery1 = QueryBuilders.boolQuery(); + boolQuery1.must().add(QueryBuilders.rangeQuery(RegisterSource.HEARTBEAT_TIME).gte(endTimestamp)); + boolQuery1.must().add(QueryBuilders.rangeQuery(RegisterSource.REGISTER_TIME).lte(endTimestamp)); + + BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery(); + boolQuery2.must().add(QueryBuilders.rangeQuery(RegisterSource.REGISTER_TIME).lte(endTimestamp)); + boolQuery2.must().add(QueryBuilders.rangeQuery(RegisterSource.HEARTBEAT_TIME).gte(startTimestamp)); + + BoolQueryBuilder timeBoolQuery = QueryBuilders.boolQuery(); + timeBoolQuery.should().add(boolQuery1); + timeBoolQuery.should().add(boolQuery2); + + return timeBoolQuery; + } }