in oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/rt/PromQLExprQueryVisitor.java [238:308]
public ParseResult visitMetricInstant(PromQLParser.MetricInstantContext ctx) {
ParseResult result = new ParseResult();
try {
String metricName = ctx.metricName().getText();
Optional<ValueColumnMetadata.ValueColumn> valueColumn = getValueColumn(metricName);
if (valueColumn.isEmpty()) {
result.setErrorType(ErrorType.BAD_DATA);
result.setErrorInfo("Metric: [" + metricName + "] does not exist.");
return result;
}
if (ctx.labelList() == null) {
result.setErrorType(ErrorType.BAD_DATA);
result.setErrorInfo("No labels found in the expression.");
return result;
}
Map<LabelName, String> generalLabelMap = new HashMap<>();
Map<String, String> queryLabel = new HashMap<>();
for (PromQLParser.LabelContext labelCtx : ctx.labelList().label()) {
String labelName = labelCtx.labelName().getText();
String labelValue = labelCtx.labelValue().getText();
String labelValueTrim = labelValue.substring(1, labelValue.length() - 1);
try {
if (LabelName.isLabelName(labelName)) {
generalLabelMap.put(LabelName.labelOf(labelName), labelValueTrim);
} else {
queryLabel.put(labelName, labelValueTrim);
}
} catch (IllegalArgumentException e) {
throw new IllegalExpressionException("Label:[" + labelName + "] is illegal.");
}
}
final Layer layer;
checkLabels(generalLabelMap, LabelName.LAYER);
try {
layer = Layer.valueOf(generalLabelMap.get(LabelName.LAYER));
} catch (IllegalArgumentException e) {
throw new IllegalExpressionException(
"Layer:[" + generalLabelMap.get(LabelName.LAYER) + "] is missing or illegal.");
}
ValueColumnMetadata.ValueColumn metaData = valueColumn.get();
Scope scope = Scope.Finder.valueOf(metaData.getScopeId());
Column.ValueDataType dataType = metaData.getDataType();
MetricsRangeResult matrixResult = new MetricsRangeResult();
matrixResult.setResultType(ParseResultType.METRICS_RANGE);
if (StringUtil.isNotBlank(generalLabelMap.get(LabelName.TOP_N))) {
if (Column.ValueDataType.SAMPLED_RECORD == dataType) {
queryRecords(metricName, layer, scope, generalLabelMap, matrixResult);
} else {
queryTopN(metricName, layer, scope, generalLabelMap, matrixResult);
}
} else {
if (Column.ValueDataType.COMMON_VALUE == dataType) {
metricsValuesQuery(metricName, layer, scope, generalLabelMap, matrixResult);
} else if (Column.ValueDataType.LABELED_VALUE == dataType) {
//compatible with old version query, if true support use `labels` as the query label.
boolean isMultiIntValues = valueColumn.get().isMultiIntValues();
labeledMetricsValuesQuery(metricName, layer, scope, generalLabelMap, queryLabel, matrixResult, isMultiIntValues);
}
}
return matrixResult;
} catch (IllegalExpressionException e) {
result.setErrorType(ErrorType.BAD_DATA);
result.setErrorInfo(e.getMessage());
return result;
} catch (IOException e) {
result.setErrorType(ErrorType.INTERNAL);
result.setErrorInfo("Internal IO exception.");
log.error("Query metrics error.", e);
return result;
}
}