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();
}