You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wa...@apache.org on 2024/08/20 10:15:00 UTC

(skywalking) branch master updated: Fix the compatibility with Grafana 11 when using label_values query variables. (#12546)

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

wankai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new e704f9b635 Fix the compatibility with Grafana 11 when using label_values query variables. (#12546)
e704f9b635 is described below

commit e704f9b6350487e6a6920d12a94f18b76f4e3868
Author: Wan Kai <wa...@foxmail.com>
AuthorDate: Tue Aug 20 18:14:54 2024 +0800

    Fix the compatibility with Grafana 11 when using label_values query variables. (#12546)
---
 docs/en/changes/changes.md                         |  1 +
 .../oap/query/promql/handler/PromQLApiHandler.java | 60 +++++++++++++++++++---
 2 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index ad526ac833..b256b0099f 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -53,6 +53,7 @@
 * Support async query for the composite GraphQL query.
 * Get endpoint list order by timestamp desc.
 * Support sort queries on metrics generated by eBPF receiver.
+* Fix the compatibility with Grafana 11 when using label_values query variables.
 
 #### UI
 
diff --git a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
index 9e2fd47eae..8371b0df7d 100644
--- a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
+++ b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
@@ -189,6 +189,11 @@ public class PromQLApiHandler {
         @Param("start") Optional<String> start,
         @Param("end") Optional<String> end) throws IOException {
         LabelsQueryRsp response = new LabelsQueryRsp();
+        long endTS = System.currentTimeMillis();
+        if (end.isPresent()) {
+            endTS = formatTimestamp2Millis(end.get());
+        }
+        Duration duration = getDayDurationFromTimestamp(endTS);
         if (match.isPresent()) {
             MatcherSetResult parseResult;
             try {
@@ -207,7 +212,7 @@ public class PromQLApiHandler {
                 Scope scope = Scope.Finder.valueOf(metaData.getScopeId());
                 response.getData().addAll(buildLabelNames(scope, metaData));
                 if (Column.ValueDataType.LABELED_VALUE == valueColumn.get().getDataType()) {
-                    List<MetricsValues> matchedMetrics = getMatcherMetricsValues(parseResult, end);
+                    List<MetricsValues> matchedMetrics = getMatcherMetricsValues(parseResult, duration);
                     response.getData().addAll(buildLabelNamesFromQuery(matchedMetrics));
                 }
                 if (metaData.isMultiIntValues()) {
@@ -238,6 +243,12 @@ public class PromQLApiHandler {
         @Param("end") Optional<String> end) throws IOException {
         LabelValuesQueryRsp response = new LabelValuesQueryRsp();
         response.setStatus(ResultStatus.SUCCESS);
+        long endTS = System.currentTimeMillis();
+        if (end.isPresent()) {
+            endTS = formatTimestamp2Millis(end.get());
+        }
+        Duration duration = getDayDurationFromTimestamp(endTS);
+
         //general labels
         if (LabelName.NAME.getLabel().equals(labelName)) {
             getMetricsMetadataQueryService().listMetrics("").forEach(definition -> {
@@ -270,8 +281,45 @@ public class PromQLApiHandler {
             Optional<ValueColumnMetadata.ValueColumn> valueColumn = ValueColumnMetadata.INSTANCE.readValueColumnDefinition(
                 metricName);
             if (valueColumn.isPresent() && Column.ValueDataType.LABELED_VALUE == valueColumn.get().getDataType()) {
-                List<MetricsValues> matchedMetrics = getMatcherMetricsValues(parseResult, end);
+                List<MetricsValues> matchedMetrics = getMatcherMetricsValues(parseResult, duration);
                 response.getData().addAll(buildLabelValuesFromQuery(matchedMetrics, labelName));
+            } else {
+                // Make compatible with Grafana 11 when use old config variables
+                // e.g. query service list config: `label_values(service_traffic{layer='$layer'}, service)`
+                // Grafana 11 will query this API by default rather than `/api/v1/series`(< 11)
+                if (Objects.equals(metricName, ServiceTraffic.INDEX_NAME)) {
+                    String serviceName = parseResult.getLabelMap().get(LabelName.SERVICE.getLabel());
+                    if (StringUtil.isNotBlank(serviceName)) {
+                        Service service = metadataQuery.findService(serviceName).join();
+                        response.getData().add(service.getName());
+                    } else {
+                        List<Service> services = metadataQuery.listServices(
+                            parseResult.getLabelMap().get(LabelName.LAYER.getLabel())).join();
+                        services.forEach(service -> {
+                            response.getData().add(service.getName());
+                        });
+                    }
+                } else if (Objects.equals(metricName, InstanceTraffic.INDEX_NAME)) {
+                    String serviceName = parseResult.getLabelMap().get(LabelName.SERVICE.getLabel());
+                    String layer = parseResult.getLabelMap().get(LabelName.LAYER.getLabel());
+                    List<ServiceInstance> instances = metadataQuery.listInstances(
+                        duration, IDManager.ServiceID.buildId(serviceName, Layer.valueOf(layer).isNormal())).join();
+                    instances.forEach(instance -> {
+                        response.getData().add(instance.getName());
+                    });
+                } else if (Objects.equals(metricName, EndpointTraffic.INDEX_NAME)) {
+                    String serviceName = parseResult.getLabelMap().get(LabelName.SERVICE.getLabel());
+                    String layer = parseResult.getLabelMap().get(LabelName.LAYER.getLabel());
+                    String keyword = parseResult.getLabelMap().getOrDefault(LabelName.KEYWORD.getLabel(), "");
+                    String limit = parseResult.getLabelMap().getOrDefault(LabelName.LIMIT.getLabel(), "100");
+                    List<Endpoint> endpoints = metadataQuery.findEndpoint(
+                        keyword, IDManager.ServiceID.buildId(serviceName, Layer.valueOf(layer).isNormal()),
+                        Integer.parseInt(limit)
+                    ).join();
+                    endpoints.forEach(endpoint -> {
+                        response.getData().add(endpoint.getName());
+                    });
+                }
             }
         }
 
@@ -658,7 +706,7 @@ public class PromQLApiHandler {
         return visitor.visit(tree);
     }
 
-    private List<MetricsValues> getMatcherMetricsValues(MatcherSetResult parseResult,  Optional<String> end) throws IOException {
+    private List<MetricsValues> getMatcherMetricsValues(MatcherSetResult parseResult,  Duration duration) throws IOException {
         String metricName = parseResult.getMetricName();
         List<KeyValue> matchLabels = parseResult.getLabelMap().entrySet().stream().map(entry -> {
             KeyValue keyValue = new KeyValue();
@@ -666,11 +714,7 @@ public class PromQLApiHandler {
             keyValue.setValue(entry.getValue());
             return keyValue;
         }).collect(Collectors.toList());
-        long endTS = System.currentTimeMillis();
-        if (end.isPresent()) {
-            endTS = formatTimestamp2Millis(end.get());
-        }
-        Duration duration = getDayDurationFromTimestamp(endTS);
+
         return getMetricsQueryService().readLabeledMetricsValuesWithoutEntity(metricName, matchLabels, duration);
     }