public HttpResponse labelValues()

in oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java [249:331]


    public HttpResponse labelValues(
        @Param("label_name") String labelName,
        @Param("match[]") Optional<String> match,
        @Param("start") Optional<String> start,
        @Param("end") Optional<String> end,
        @Param("limit") Optional<Integer> limit) 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);
        int limitNum = limit.orElse(100);

        //general labels
        if (LabelName.NAME.getLabel().equals(labelName)) {
            getMetricsMetadataQueryService().listMetrics("").stream().limit(limitNum).forEach(definition -> {
                response.getData().add(definition.getName());
            });
            return jsonResponse(response);
        } else if (LabelName.LAYER.getLabel().equals(labelName)) {
            for (Layer layer : Arrays.stream(Layer.values()).limit(limitNum).collect(Collectors.toList())) {
                response.getData().add(layer.name());
            }
            return jsonResponse(response);
        } else if (LabelName.SCOPE.getLabel().equals(labelName)) {
            for (Scope scope : Arrays.stream(Scope.values()).limit(limitNum).collect(Collectors.toList())) {
                response.getData().add(scope.name());
            }
            return jsonResponse(response);
        }

        if (match.isPresent()) {
            MatcherSetResult parseResult;
            try {
                parseResult = getMatcherSetResult(match.get());
            } catch (ParseCancellationException e) {
                response.setStatus(ResultStatus.ERROR);
                response.setErrorType(ErrorType.BAD_DATA);
                response.setError(e.getMessage());
                return jsonResponse(response);
            }
            String metricName = parseResult.getMetricName();
            Optional<ValueColumnMetadata.ValueColumn> valueColumn = ValueColumnMetadata.INSTANCE.readValueColumnDefinition(
                metricName);
            if (valueColumn.isPresent() && Column.ValueDataType.LABELED_VALUE == valueColumn.get().getDataType()) {
                List<MetricsValues> matchedMetrics = getMatcherMetricsValues(parseResult, duration);
                response.getData().addAll(buildLabelValuesFromQuery(matchedMetrics, labelName).stream().limit(limitNum).collect(Collectors.toList()));
            } else {
                try {
                    // 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)
                    limitNum = getLimitNum(limit, parseResult);
                    String layer = parseResult.getLabelMap().get(LabelName.LAYER.getLabel());
                    if (Objects.equals(metricName, ServiceTraffic.INDEX_NAME)) {
                        queryServiceTraffic(parseResult, layer, limitNum).forEach(service -> {
                            response.getData().add(service.getName());
                        });
                    } else if (Objects.equals(metricName, InstanceTraffic.INDEX_NAME)) {
                        String serviceName = parseResult.getLabelMap().get(LabelName.SERVICE.getLabel());
                        queryInstanceTraffic(parseResult, duration, layer, serviceName, limitNum).forEach(instance -> {
                            response.getData().add(instance.getName());
                        });
                    } else if (Objects.equals(metricName, EndpointTraffic.INDEX_NAME)) {
                        String serviceName = parseResult.getLabelMap().get(LabelName.SERVICE.getLabel());
                        String keyword = parseResult.getLabelMap().getOrDefault(LabelName.KEYWORD.getLabel(), "");
                        queryEndpointTraffic(parseResult, duration, layer, serviceName, keyword, limitNum).forEach(
                            endpoint -> {
                                response.getData().add(endpoint.getName());
                            });
                    }
                } catch (IllegalExpressionException e) {
                    response.setStatus(ResultStatus.ERROR);
                    response.setErrorType(ErrorType.BAD_DATA);
                    response.setError(e.getMessage());
                }
            }
        }

        return jsonResponse(response);
    }