访问grafana的api

发布于:2025-03-06 ⋅ 阅读:(96) ⋅ 点赞:(0)

创建 Service accounts

菜单路径:Administration -> Users and access -> Service accounts

访问封装

/**
 * https://grafana.com/docs/grafana/latest/developers/http_api/dashboard/
 *
 */
@Slf4j
public class GrafanaRequestUtils {

    public static final String TIMESERIES_PANEL_JSON_TEMPLATE = "{\"datasource\":{\"default\":true,\"type\":\"prometheus\",\"uid\":\"##datasource_uid##\"},\"fieldConfig\":{\"defaults\":{\"custom\":{\"drawStyle\":\"line\",\"lineInterpolation\":\"linear\",\"barAlignment\":0,\"barWidthFactor\":0.6,\"lineWidth\":1,\"fillOpacity\":0,\"gradientMode\":\"none\",\"spanNulls\":false,\"insertNulls\":false,\"showPoints\":\"auto\",\"pointSize\":5,\"stacking\":{\"mode\":\"none\",\"group\":\"A\"},\"axisPlacement\":\"auto\",\"axisLabel\":\"\",\"axisColorMode\":\"text\",\"axisBorderShow\":false,\"scaleDistribution\":{\"type\":\"linear\"},\"axisCenteredZero\":false,\"hideFrom\":{\"tooltip\":false,\"viz\":false,\"legend\":false},\"thresholdsStyle\":{\"mode\":\"off\"}},\"color\":{\"mode\":\"palette-classic\"},\"mappings\":[],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]}},\"overrides\":[]},\"gridPos\":{\"h\":##width##,\"w\":##height##,\"x\":##x_coordinate##,\"y\":##y_coordinate##},\"id\":null,\"options\":{\"tooltip\":{\"mode\":\"single\",\"sort\":\"none\"},\"legend\":{\"showLegend\":true,\"displayMode\":\"list\",\"placement\":\"bottom\",\"calcs\":[]}},\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"##datasource_uid##\"},\"editorMode\":\"code\",\"expr\":\"##expr##\",\"instant\":false,\"legendFormat\":\"__auto\",\"range\":true,\"refId\":\"A\"}],\"title\":\"##title##\",\"type\":\"timeseries\"}";

    public static final String TITLE = "##title##";

    public static final String DATASOURCE_UID = "##datasource_uid##";

    public static final String WIDTH = "##width##";

    public static final String HEIGHT = "##height##";

    public static final String X_COORDINATE = "##x_coordinate##";

    public static final String Y_COORDINATE = "##y_coordinate##";

    private static final String JSON_CONTENT_TYPE = "application/json";

    private static GrafanaResultVO response(OkHttpClient client, Request request) {
        // TODO 切换为异步,或者提供异步方法
        String responseBody = null;
        try (Response response = client.newCall(request).execute()) {
            GrafanaResultVO grafanaResultVO = new GrafanaResultVO();
            log.info("GrafanaRequestUtils Response code: {}, url: {}", response.code(), request.url());
            grafanaResultVO.setHttpCode(response.code());
            if (response.code() == 200 && response.body() != null) {
                responseBody = response.body().string();
            } else {
                if (response.body() != null) {
                    responseBody = response.body().toString();
                    log.error("GrafanaRequestUtils Response body: {}", responseBody);
                }
            }
            grafanaResultVO.setResponse(responseBody);
            log.info("GrafanaRequestUtils Response: {}", JSON.toJSONString(grafanaResultVO));
            return grafanaResultVO;
        } catch (Exception e) {
            log.error("GrafanaRequestUtils fail request: {}", e.getMessage(), e);
        }
        return null;
    }

    /**
     * 获取数据源
     */
    public static List<GrafanaDatasourceVO> getDataSources(String grafanaDomain, Map<String, String> headers) {
        OkHttpClient client = new OkHttpClient();
        HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(grafanaDomain + "/api/datasources")).newBuilder();
        Request.Builder rb = new Request.Builder()
                .url(urlBuilder.build())
                .get()
                .header("Content-Type", JSON_CONTENT_TYPE);
        if (CollectionUtil.isNotEmpty(headers)) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                rb.header(entry.getKey(), entry.getValue());
            }
        }
        GrafanaResultVO grafanaResultVO = response(client, rb.build());
        if (grafanaResultVO == null || grafanaResultVO.getHttpCode() != STATUS_OK) {
            return List.of();
        }
        try {
            return JSONObject.parseObject(grafanaResultVO.getResponse(), new TypeReference<List<GrafanaDatasourceVO>>() {
            });
        } catch (Exception e) {
            log.error("getDataSources fail: {}", e.getMessage(), e);
        }
        return List.of();
    }

    /**
     * 创建Dashboard
     */
    public static DashboardCreateResultVO createDashboard(String grafanaDomain, Map<String, String> headers, DashboardVO dashboard) {
        OkHttpClient client = new OkHttpClient();
        Request.Builder rb = new Request.Builder()
                .url(grafanaDomain + "/api/dashboards/db")
                .header("Content-Type", JSON_CONTENT_TYPE);
        if (CollectionUtil.isNotEmpty(headers)) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                rb.header(entry.getKey(), entry.getValue());
            }
        }
        Request request = rb
                .post(RequestBody.create(JSON.toJSONString(dashboard), MediaType.parse(JSON_CONTENT_TYPE)))
                .build();
        GrafanaResultVO grafanaResultVO = response(client, request);
        if (grafanaResultVO == null || grafanaResultVO.getHttpCode() != STATUS_OK) {
            return null;
        }
        try {
            return JSONObject.parseObject(grafanaResultVO.getResponse(), new TypeReference<DashboardCreateResultVO>() {
            });
        } catch (Exception e) {
            log.error("createDashboard fail: {}", e.getMessage(), e);
        }
        return null;
    }

    /**
     * 获取Dashboard
     */
    public static JSONObject getDashboard(String grafanaDomain, Map<String, String> headers, String dashboardUuid) {
        OkHttpClient client = new OkHttpClient();
        HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(grafanaDomain + "/api/dashboards/uid/" + dashboardUuid)).newBuilder();
        Request.Builder rb = new Request.Builder()
                .url(urlBuilder.build())
                .get()
                .header("Content-Type", JSON_CONTENT_TYPE);
        if (CollectionUtil.isNotEmpty(headers)) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                rb.header(entry.getKey(), entry.getValue());
            }
        }
        GrafanaResultVO grafanaResultVO = response(client, rb.build());
        if (grafanaResultVO == null || grafanaResultVO.getHttpCode() != STATUS_OK) {
            return null;
        }
        return JSON.parseObject(grafanaResultVO.getResponse());
    }

    /**
     * 删除Dashboard
     *
     * @param grafanaDomain
     * @param headers
     * @param dashboardUuid
     * @return
     */
    public static DashboardDeleteResultVO deleteDashboard(String grafanaDomain, Map<String, String> headers, String dashboardUuid) {
        OkHttpClient client = new OkHttpClient();
        HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(grafanaDomain + "/api/dashboards/uid/" + dashboardUuid)).newBuilder();
        Request.Builder rb = new Request.Builder()
                .url(urlBuilder.build())
                .delete()
                .header("Content-Type", JSON_CONTENT_TYPE);
        if (CollectionUtil.isNotEmpty(headers)) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                rb.header(entry.getKey(), entry.getValue());
            }
        }
        GrafanaResultVO grafanaResultVO = response(client, rb.build());
        if (grafanaResultVO == null || grafanaResultVO.getHttpCode() != STATUS_OK) {
            return null;
        }
        try {
            return JSONObject.parseObject(grafanaResultVO.getResponse(), new TypeReference<DashboardDeleteResultVO>() {
            });
        } catch (Exception e) {
            log.error("deleteDashboard fail: {}", e.getMessage(), e);
        }
        return null;
    }


    public static void main(String[] args) {
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "Bearer glsa_ywvyOPnoFlomSjC32Nl8Fw4qR8AuGmfe_05a7edf5");
//        List<GrafanaDatasourceVO> dataSources = getDataSources("http://127.0.0.1:3000", headers);
//        System.out.println(JSONObject.toJSONString(dataSources));
        
        DashboardVO dashboardVO = new DashboardVO();
        DashboardDetailVO dashboardDetailVO = new DashboardDetailVO();
        dashboardDetailVO.setId(null);
        dashboardDetailVO.setUuid(null);
        dashboardDetailVO.setTitle("api创建");
        dashboardDetailVO.setTags(List.of("imported"));
        dashboardDetailVO.setTimezone("browser");
        dashboardDetailVO.setSchemaVersion(16);
        dashboardDetailVO.setRefresh("5m");


        String panelJson = TIMESERIES_PANEL_JSON_TEMPLATE.replaceAll(TITLE, "接口创建")
                .replaceAll(DATASOURCE_UID, "fdzfnxhgqgd1cd")
                //.replaceAll(EXPR, "rate(windows_cpu_time_total{mode=\"privileged\"}[5m])")
                .replaceAll(WIDTH, "12")
                .replaceAll(HEIGHT, "8")
                .replaceAll(X_COORDINATE, "0")
                .replaceAll(Y_COORDINATE, "0");
        JSONObject panel = JSON.parseObject(panelJson);
        JSONArray targets = (JSONArray)panel.get("targets");
        JSONObject target = (JSONObject)targets.get(0);
        target.put("expr", "rate(windows_cpu_time_total{mode=\"privileged\"}[5m])");

        List<JSONObject> panels = new ArrayList<>();
        panels.add(panel);
        dashboardDetailVO.setPanels(panels);


        String panelJson2 = TIMESERIES_PANEL_JSON_TEMPLATE.replaceAll(TITLE, "接口创建")
                .replaceAll(DATASOURCE_UID, "fdzfnxhgqgd1cd")
                //.replaceAll(EXPR, "rate(windows_cpu_time_total{mode=\"privileged\"}[5m])")
                .replaceAll(WIDTH, "12")
                .replaceAll(HEIGHT, "8")
                .replaceAll(X_COORDINATE, "12")
                .replaceAll(Y_COORDINATE, "0");
        JSONObject panel2 = JSON.parseObject(panelJson2);
        JSONArray targets2 = (JSONArray)panel2.get("targets");
        JSONObject target2 = (JSONObject)targets2.get(0);
        target2.put("expr", "rate(windows_cpu_time_total{mode=\"privileged\"}[5m])");
        panels.add(panel2);

        dashboardVO.setDashboard(dashboardDetailVO);
        dashboardVO.setFolderId(0L);
        dashboardVO.setOverwrite(true);
        DashboardCreateResultVO dashboardCreateResultVO = createDashboard("http://127.0.0.1:3000", headers, dashboardVO);
        System.out.println(JSONObject.toJSONString(dashboardCreateResultVO));

//        JSONObject result = getDashboard("http://127.0.0.1:3000", headers, "beet1orans3k0b");
//        System.out.println(JSONObject.toJSONString(result));

//        DashboardDeleteResultVO dashboardDeleteResultVO = deleteDashboard("http://127.0.0.1:3000", headers, dashboardCreateResultVO.getUid());
//        System.out.println(JSONObject.toJSONString(dashboardDeleteResultVO));
    }
}

@Data
public class GrafanaResultVO implements Serializable {

    private int httpCode;

    private String response;

}
@Data
public class GrafanaDatasourceVO implements Serializable {

    private Long id;

    private String uid;

    private Long orgId;

    private String name;

    private String type;

    private String typeName;

    private String typeLogoUrl;

    private String access;

    private String url;

    private String user;

    private String database;

    private Boolean basicAuth;

    private Boolean isDefault;

    private Map<String, Object> jsonData;

    private Boolean readOnly;

}
@Data
public class DashboardCreateResultVO implements Serializable {

    private String folderUid;

    private Long id;

    private String slug;

    private String status;

    private String uid;

    private String url;

    private Integer version;

}
@Data
public class DashboardDeleteResultVO implements Serializable {

    private String message;

    private String title;

    private String uid;

}
@Data
public class DashboardVO implements Serializable {

    private DashboardDetailVO dashboard;

    // 指定仪表板应位于哪个文件夹下,默认为0即根目录
    private Long folderId;

    // 设置为true以覆盖已存在的仪表板
    private Boolean overwrite;

}
@Data
public class DashboardDetailVO implements Serializable {

    // 这里放置从导出的仪表板JSON中复制的内容
    // 注意: 确保移除或保留"uid"字段根据你的需求
    private Long id;

    private String uuid;

    private String title;

    private List<String> tags;

    private String timezone;

    private Integer schemaVersion;

    private String refresh;

    private List<JSONObject> panels;

}

网站公告

今日签到

点亮在社区的每一天
去签到