81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package grafana
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
type DashboardsInterface interface {
|
|
Search() ([]GrafanaDashboard, error)
|
|
Create(dashboardJson io.Reader) error
|
|
Delete(slug string) error
|
|
}
|
|
|
|
type DashboardsClient struct {
|
|
BaseUrl string
|
|
HTTPClient *http.Client
|
|
}
|
|
|
|
type GrafanaDashboard struct {
|
|
Id int `json:"id"`
|
|
Title string `json:"title"`
|
|
Uri string `json:"uri"`
|
|
}
|
|
|
|
func (d *GrafanaDashboard) Slug() string {
|
|
// The uri in the search result contains the slug.
|
|
// http://docs.grafana.org/v3.1/http_api/dashboard/#search-dashboards
|
|
return strings.TrimPrefix(d.Uri, "db/")
|
|
}
|
|
|
|
func NewDashboardsClient(baseUrl string, c *http.Client) DashboardsInterface {
|
|
return &DashboardsClient{
|
|
BaseUrl: baseUrl,
|
|
HTTPClient: c,
|
|
}
|
|
}
|
|
|
|
func (c *DashboardsClient) Search() ([]GrafanaDashboard, error) {
|
|
searchUrl := c.BaseUrl + "/api/search"
|
|
resp, err := c.HTTPClient.Get(searchUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
searchResult := make([]GrafanaDashboard, 0)
|
|
err = json.NewDecoder(resp.Body).Decode(&searchResult)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return searchResult, nil
|
|
}
|
|
|
|
func (c *DashboardsClient) Delete(slug string) error {
|
|
deleteUrl := c.BaseUrl + "/api/dashboards/db/" + slug
|
|
req, err := http.NewRequest("DELETE", deleteUrl, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = c.HTTPClient.Do(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *DashboardsClient) Create(dashboardJson io.Reader) error {
|
|
importDashboardUrl := c.BaseUrl + "/api/dashboards/import"
|
|
_, err := c.HTTPClient.Post(importDashboardUrl, "application/json", dashboardJson)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|