public DatasourceQueryData query()

in hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/db/PromqlQueryExecutor.java [137:210]


    public DatasourceQueryData query(DatasourceQuery datasourceQuery) {
        DatasourceQueryData.DatasourceQueryDataBuilder queryDataBuilder = DatasourceQueryData.builder()
                .refId(datasourceQuery.getRefId()).status(200);
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setAccept(List.of(MediaType.APPLICATION_JSON));
            if (StringUtils.hasText(httpPromqlProperties.username())
                    && StringUtils.hasText(httpPromqlProperties.password())) {
                String authStr = httpPromqlProperties.username() + ":" + httpPromqlProperties.password();
                String encodedAuth = new String(Base64.encodeBase64(authStr.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
                headers.add(HttpHeaders.AUTHORIZATION, NetworkConstants.BASIC + " " + encodedAuth);
            }
            HttpEntity<Void> httpEntity = new HttpEntity<>(headers);
            URI uri;
            if (datasourceQuery.getTimeType().equals(RANGE)) {
                uri = UriComponentsBuilder.fromHttpUrl(httpPromqlProperties.url() + QUERY_RANGE_PATH)
                        .queryParam(HTTP_QUERY_PARAM, datasourceQuery.getExpr())
                        .queryParam(HTTP_START_PARAM, datasourceQuery.getStart())
                        .queryParam(HTTP_END_PARAM, datasourceQuery.getEnd())
                        .queryParam(HTTP_STEP_PARAM, datasourceQuery.getStep())
                        .build().toUri();
            } else if (datasourceQuery.getTimeType().equals(INSTANT)) {
                uri = UriComponentsBuilder.fromHttpUrl(httpPromqlProperties.url() + QUERY_PATH)
                        .queryParam(HTTP_QUERY_PARAM, datasourceQuery.getExpr())
                        .build().toUri();
            } else {
                throw new IllegalArgumentException(String.format("no such time type for query id {}.", datasourceQuery.getRefId()));
            }
            ResponseEntity<PromQlQueryContent> responseEntity = restTemplate.exchange(uri, HttpMethod.GET, httpEntity,
                    PromQlQueryContent.class);
            if (responseEntity.getStatusCode().is2xxSuccessful()) {
                log.debug("query metrics data from promql http api success. {}", uri);
                if (responseEntity.getBody() != null && responseEntity.getBody().getData() != null
                        && responseEntity.getBody().getData().getResult() != null) {
                    List<PromQlQueryContent.ContentData.Content> contents = responseEntity.getBody().getData().getResult();
                    List<DatasourceQueryData.SchemaData> schemaDataList = new LinkedList<>();
                    for (PromQlQueryContent.ContentData.Content content : contents) {
                        DatasourceQueryData.MetricSchema.MetricSchemaBuilder schemaBuilder = DatasourceQueryData.MetricSchema
                                .builder().fields(List.of(
                                        // todo: unit?
                                        DatasourceQueryData.MetricField.builder().name(INNER_KEY_TIME)
                                                .type("time").build(),
                                        DatasourceQueryData.MetricField.builder().name(INNER_KEY_VALUE)
                                                .type("number").build()
                                )).labels(content.getMetric());
                        List<Object[]> values;
                        if (datasourceQuery.getTimeType().equals(RANGE)) {
                            values = content.getValues();
                        }
                        else {
                            values = List.<Object[]>of(content.getValue());
                        }
                        values.forEach(objects -> {
                            objects[0] = TimePeriodUtil.normalizeToMilliseconds(objects[0]);
                        });
                        DatasourceQueryData.SchemaData.SchemaDataBuilder schemaData = DatasourceQueryData.SchemaData.builder()
                                .schema(schemaBuilder.build()).data(values);
                        schemaDataList.add(schemaData.build());
                    }
                    queryDataBuilder.frames(schemaDataList);
                }
            } else {
                log.error("query metrics data from victoria-metrics failed. {}", responseEntity);
                queryDataBuilder.msg("query metrics data from victoria-metrics failed. ");
                queryDataBuilder.status(responseEntity.getStatusCode().value());
            }
        } catch (Exception e) {
            log.error("query metrics data from victoria-metrics error. {}.", e.getMessage(), e);
            queryDataBuilder.msg("query metrics data from victoria-metrics error: " + e.getMessage());
            queryDataBuilder.status(400);
        }
        return queryDataBuilder.build();
    }