Files
kube-prometheus/grafana-watcher/grafana/dashboard.go
2016-10-19 18:02:41 +02:00

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
}