创建 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;}