package com.jjt.biz.service.impl; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.http.Method; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.jjt.biz.service.IPrometheusService; import com.jjt.common.utils.StringUtils; import com.jjt.common.utils.sign.Base64; import com.jjt.system.service.ISysConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.yaml.snakeyaml.util.UriEncoder; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.util.HashMap; import java.util.Map; /** * 告警记录Service业务层处理 * * @author jjt * @date 2024-08-08 */ @Service @Slf4j public class PrometheusServiceImpl implements IPrometheusService { @Resource private ISysConfigService configService; /** * 获取接口地址 * * @return 接口地址 */ private String baseUri() { return configService.selectConfigByKey("pm.url"); } /** * 即时查询 * * @param param 查询参数 * @return 结果 */ @Override public Float query(String param) { if (StringUtils.isNotEmpty(param)) { if (StringUtils.isNotEmpty(param)) { String uri = baseUri() + "/api/v1/query"; param = UriEncoder.encode(param); Map map = new HashMap<>(16); map.put("query", param); HttpRequest request = HttpUtil.createPost(uri); request.setMethod(Method.GET); String auth = configService.selectConfigByKey("pm.param"); if (StringUtils.isNotEmpty(auth)) { String baseAuth = "Basic " + Base64.encode(auth.getBytes()); request.header("Authorization", baseAuth); } request.form(map); request.setConnectionTimeout(2000); try (HttpResponse execute = request.execute()) { if (!execute.isOk()) { throw new RuntimeException("status:" + execute.getStatus() + "\tres:" + execute.body()); } String res = new String(execute.body().getBytes(), StandardCharsets.UTF_8); JSONObject object = JSONUtil.parseObj(res, true); JSONArray array = object.getJSONObject("data").getJSONArray("result"); JSONArray value = array.getJSONObject(0).getJSONArray("value"); DecimalFormat df = new DecimalFormat("#0.00"); return Float.parseFloat(df.format(value.getFloat(1))); } catch (Exception e) { log.error("调用prometheus接口失败, url=" + uri + ",param=" + param, e); return null; } } else { return null; } } else { return null; } } }