libs/go-kibana-rest/kbapi/api.kibana_dashboard.go (89 lines of code) (raw):

package kbapi import ( "encoding/json" "fmt" "github.com/go-resty/resty/v2" log "github.com/sirupsen/logrus" "strings" ) const ( basePathKibanaDashboard = "/api/kibana/dashboards" // Base URL to access on Kibana dashboard ) // KibanaDashboardExport permit to export dashboard type KibanaDashboardExport func(listID []string, kibanaSpace string) (map[string]interface{}, error) // KibanaDashboardImport permit to import dashboard type KibanaDashboardImport func(data map[string]interface{}, listExcludeType []string, force bool, kibanaSpace string) error // newKibanaDashboardExportFunc permit to export Kibana dashboard by its names func newKibanaDashboardExportFunc(c *resty.Client) KibanaDashboardExport { return func(listID []string, kibanaSpace string) (map[string]interface{}, error) { if len(listID) == 0 { return nil, NewAPIError(600, "You must provide on or more dashboard ID") } log.Debug("listID: ", listID) log.Debug("kibanaSpace: ", kibanaSpace) var path string if kibanaSpace == "" || kibanaSpace == "default" { path = fmt.Sprintf("%s/export", basePathKibanaDashboard) } else { path = fmt.Sprintf("/s/%s%s/export", kibanaSpace, basePathKibanaDashboard) } log.Debugf("Url to export: %s", path) query := fmt.Sprintf("dashboard=%s", strings.Join(listID, ",")) resp, err := c.R().SetQueryString(query).Get(path) if err != nil { return nil, err } log.Debug("Response: ", resp) if resp.StatusCode() >= 300 { if resp.StatusCode() == 404 { return nil, nil } return nil, NewAPIError(resp.StatusCode(), resp.Status()) } var data map[string]interface{} err = json.Unmarshal(resp.Body(), &data) if err != nil { return nil, err } log.Debug("Data: ", data) return data, nil } } // newKibanaDashboardImportFunc permit to import kibana dashboard func newKibanaDashboardImportFunc(c *resty.Client) KibanaDashboardImport { return func(data map[string]interface{}, listExcludeType []string, force bool, kibanaSpace string) error { if data == nil { return NewAPIError(600, "You must provide one or more dashboard to import") } log.Debug("data: ", data) log.Debug("List type to exclude: ", listExcludeType) log.Debug("Force import: ", force) log.Debug("KibanaSpace: ", kibanaSpace) var path string if kibanaSpace == "" || kibanaSpace == "default" { path = fmt.Sprintf("%s/import", basePathKibanaDashboard) } else { path = fmt.Sprintf("/s/%s%s/import", kibanaSpace, basePathKibanaDashboard) } log.Debugf("URL to import %s", path) request := c.R().SetQueryString(fmt.Sprintf("force=%t", force)) if len(listExcludeType) > 0 { request = request.SetQueryString(fmt.Sprintf("exclude=%s", strings.Join(listExcludeType, ","))) } jsonData, err := json.Marshal(data) if err != nil { return err } resp, err := request.SetBody(jsonData).Post(path) if err != nil { return err } log.Debug("Response: ", resp) if resp.StatusCode() >= 300 { return NewAPIError(resp.StatusCode(), resp.Status()) } var dataResponse map[string]interface{} err = json.Unmarshal(resp.Body(), &dataResponse) if err != nil { return err } log.Debug("Data response: ", dataResponse) // Need to manage error returned in response return nil } }