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

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

commit bdabe3ddb1f473ee34d5f0da64adf87944774be6
Author: Wu Sheng <wu.sh...@foxmail.com>
AuthorDate: Thu Nov 19 20:42:00 2020 +0800

    Provide `listMetrics` GraphQL query service.
---
 .../oap/server/core/query/MetricDefinition.java    | 44 ++++++++++++++++++++++
 .../core/query/MetricsMetadataQueryService.java    | 21 +++++++++++
 .../oap/server/core/source/DefaultScopeDefine.java | 28 ++++++++++++++
 .../storage/annotation/ValueColumnMetadata.java    | 16 +++++++-
 .../server/core/storage/model/StorageModels.java   | 15 ++++----
 .../core/storage/query/MetricsQueryUtilTest.java   |  3 +-
 .../oap/query/graphql/resolver/MetricsQuery.java   | 11 ++++++
 .../src/main/resources/query-protocol              |  2 +-
 8 files changed, 129 insertions(+), 11 deletions(-)

diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricDefinition.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricDefinition.java
new file mode 100644
index 0000000..ddd28b3
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricDefinition.java
@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.query.enumeration.MetricsType;
+
+/**
+ * Define the metrics provided in the OAP server.
+ *
+ * @since 8.3.0
+ */
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class MetricDefinition {
+    private String name;
+    private MetricsType type;
+    /**
+     * Catalog includes 
SERVICE_CATALOG,SERVICE_INSTANCE_CATALOG,ENDPOINT_CATALOG,
+     * 
SERVICE_RELATION_CATALOG,SERVICE_INSTANCE_RELATION_CATALOG_NAME,ENDPOINT_RELATION_CATALOG_NAME
+     */
+    private String catalog;
+}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricsMetadataQueryService.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricsMetadataQueryService.java
index 93483a1..f504c15 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricsMetadataQueryService.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricsMetadataQueryService.java
@@ -18,8 +18,12 @@
 
 package org.apache.skywalking.oap.server.core.query;
 
+import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
+import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.server.core.query.enumeration.MetricsType;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import 
org.apache.skywalking.oap.server.core.storage.annotation.ValueColumnMetadata;
 import org.apache.skywalking.oap.server.library.module.Service;
 
@@ -48,4 +52,21 @@ public class MetricsMetadataQueryService implements Service {
             return MetricsType.UNKNOWN;
         }
     }
+
+    public List<MetricDefinition> listMetrics(String regex) {
+        return ValueColumnMetadata.INSTANCE.getAllMetadata()
+                                           .entrySet()
+                                           .stream()
+                                           .filter(
+                                               metadata ->
+                                                   
StringUtil.isNotEmpty(regex) ?
+                                                       
metadata.getKey().matches(regex) : true)
+                                           .map(metadata -> new 
MetricDefinition(
+                                                    metadata.getKey(),
+                                                    
typeOfMetrics(metadata.getKey()),
+                                                    
DefaultScopeDefine.catalogOf(metadata.getValue().getScopeId())
+                                                )
+                                           )
+                                           .collect(Collectors.toList());
+    }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
index 17bf1bb..c6d91fe 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
@@ -296,6 +296,34 @@ public class DefaultScopeDefine {
     }
 
     /**
+     * Get the catalog string name of the given scope
+     *
+     * @param scope id of the source scope.
+     * @return literal string name of the catalog owning the scope.
+     */
+    public static String catalogOf(int scope) {
+        if (inServiceCatalog(scope)) {
+            return SERVICE_CATALOG_NAME;
+        }
+        if (inServiceInstanceCatalog(scope)) {
+            return SERVICE_INSTANCE_CATALOG_NAME;
+        }
+        if (inEndpointCatalog(scope)) {
+            return ENDPOINT_CATALOG_NAME;
+        }
+        if (inServiceRelationCatalog(scope)) {
+            return SERVICE_RELATION_CATALOG_NAME;
+        }
+        if (inServiceInstanceRelationCatalog(scope)) {
+            return SERVICE_INSTANCE_RELATION_CATALOG_NAME;
+        }
+        if (inEndpointRelationCatalog(scope)) {
+            return ENDPOINT_RELATION_CATALOG_NAME;
+        }
+        return "UNKNOWN";
+    }
+
+    /**
      * Get the default columns defined in Scope. All those columns will 
forward to persistent entity.
      *
      * @param scopeName of the default columns
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/ValueColumnMetadata.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/ValueColumnMetadata.java
index 76af49d..67b2318 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/ValueColumnMetadata.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/ValueColumnMetadata.java
@@ -41,8 +41,9 @@ public enum ValueColumnMetadata {
                             String valueCName,
                             Column.ValueDataType dataType,
                             Function function,
-                            int defaultValue) {
-        mapping.putIfAbsent(modelName, new ValueColumn(valueCName, dataType, 
function, defaultValue));
+                            int defaultValue,
+                            int scopeId) {
+        mapping.putIfAbsent(modelName, new ValueColumn(valueCName, dataType, 
function, defaultValue, scopeId));
     }
 
     /**
@@ -63,10 +64,20 @@ public enum ValueColumnMetadata {
         return findColumn(metricsName).defaultValue;
     }
 
+    /**
+     * @return metric metadata if found
+     */
     public Optional<ValueColumn> readValueColumnDefinition(String metricsName) 
{
         return Optional.ofNullable(mapping.get(metricsName));
     }
 
+    /**
+     * @return all metrics metadata.
+     */
+    public Map<String, ValueColumn> getAllMetadata() {
+        return mapping;
+    }
+
     private ValueColumn findColumn(String metricsName) {
         ValueColumn column = mapping.get(metricsName);
         if (column == null) {
@@ -82,5 +93,6 @@ public enum ValueColumnMetadata {
         private final Column.ValueDataType dataType;
         private final Function function;
         private final int defaultValue;
+        private final int scopeId;
     }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java
index 600dbe9..b8d3b71 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java
@@ -56,7 +56,7 @@ public class StorageModels implements IModelManager, 
ModelCreator, ModelManipula
 
         List<ModelColumn> modelColumns = new ArrayList<>();
         List<ExtraQueryIndex> extraQueryIndices = new ArrayList<>();
-        retrieval(aClass, storage.getModelName(), modelColumns, 
extraQueryIndices);
+        retrieval(aClass, storage.getModelName(), modelColumns, 
extraQueryIndices, scopeId);
 
         Model model = new Model(
             storage.getModelName(), modelColumns, extraQueryIndices, scopeId,
@@ -91,10 +91,11 @@ public class StorageModels implements IModelManager, 
ModelCreator, ModelManipula
     /**
      * Read model column metadata based on the class level definition.
      */
-    private void retrieval(Class<?> clazz,
-                           String modelName,
-                           List<ModelColumn> modelColumns,
-                           List<ExtraQueryIndex> extraQueryIndices) {
+    private void retrieval(final Class<?> clazz,
+                           final String modelName,
+                           final List<ModelColumn> modelColumns,
+                           final List<ExtraQueryIndex> extraQueryIndices,
+                           final int scopeId) {
         if (log.isDebugEnabled()) {
             log.debug("Analysis {} to generate Model.", clazz.getName());
         }
@@ -131,7 +132,7 @@ public class StorageModels implements IModelManager, 
ModelCreator, ModelManipula
                 if (column.dataType().isValue()) {
                     ValueColumnMetadata.INSTANCE.putIfAbsent(
                         modelName, column.columnName(), column.dataType(), 
column.function(),
-                        column.defaultValue()
+                        column.defaultValue(), scopeId
                     );
                 }
 
@@ -152,7 +153,7 @@ public class StorageModels implements IModelManager, 
ModelCreator, ModelManipula
         }
 
         if (Objects.nonNull(clazz.getSuperclass())) {
-            retrieval(clazz.getSuperclass(), modelName, modelColumns, 
extraQueryIndices);
+            retrieval(clazz.getSuperclass(), modelName, modelColumns, 
extraQueryIndices, scopeId);
         }
     }
 
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/query/MetricsQueryUtilTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/query/MetricsQueryUtilTest.java
index 683db20..d3e97f9 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/query/MetricsQueryUtilTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/query/MetricsQueryUtilTest.java
@@ -37,6 +37,7 @@ import org.junit.runners.Parameterized;
 
 import static com.google.common.collect.ImmutableMap.of;
 import static java.util.Arrays.asList;
+import static 
org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE;
 import static 
org.apache.skywalking.oap.server.core.storage.annotation.Column.ValueDataType.LABELED_VALUE;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
@@ -108,7 +109,7 @@ public class MetricsQueryUtilTest {
     @Before
     public void setup() {
         ValueColumnMetadata.INSTANCE.putIfAbsent(
-            MODULE_NAME, "value", LABELED_VALUE, Function.None, DEFAULT_VALUE
+            MODULE_NAME, "value", LABELED_VALUE, Function.None, DEFAULT_VALUE, 
SERVICE
         );
     }
 
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
index 3c3d40a..2ed2d0b 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.analysis.metrics.DataTable;
 import org.apache.skywalking.oap.server.core.query.AggregationQueryService;
+import org.apache.skywalking.oap.server.core.query.MetricDefinition;
 import org.apache.skywalking.oap.server.core.query.MetricsMetadataQueryService;
 import org.apache.skywalking.oap.server.core.query.MetricsQueryService;
 import org.apache.skywalking.oap.server.core.query.PointOfTime;
@@ -100,6 +101,16 @@ public class MetricsQuery implements GraphQLQueryResolver {
     }
 
     /**
+     * Get the list of all available metrics in the current OAP server.
+     *
+     * @param regex to filter the metrics by name, if existing.
+     * @return all available metrics.
+     */
+    public List<MetricDefinition> listMetrics(String regex) {
+        return getMetricsMetadataQueryService().listMetrics(regex);
+    }
+
+    /**
      * Read metrics single value in the duration of required metrics
      */
     public long readMetricsValue(MetricsCondition condition, Duration 
duration) throws IOException {
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 77afd81..d3608e8 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 77afd814040c5532e5e4a68f5ef1694a80dad0c4
+Subproject commit d3608e86f7c9aaf54aa4ad2c8d2afd09d0680dd6

Reply via email to