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