From 3693fad3c0d439e461fc1a268072f8fd3b44af06 Mon Sep 17 00:00:00 2001 From: ricoberger Date: Sat, 13 Nov 2021 16:06:24 +0100 Subject: [PATCH] [grafana] Add Grafana plugin The new Grafana plugin can be used to show a list of dashboards from a Grafana instance and to embed Grafana panels into kobs dashboards. --- CHANGELOG.md | 1 + app/src/index.tsx | 2 + cmd/kobs/plugins/plugins.go | 4 + docs/configuration/plugins.md | 25 +++ docs/plugins/assets/grafana.png | Bin 0 -> 146939 bytes docs/plugins/grafana.md | 165 ++++++++++++++++++ mkdocs.yml | 1 + plugins/grafana/grafana.go | 118 +++++++++++++ plugins/grafana/package.json | 24 +++ plugins/grafana/pkg/instance/instance.go | 132 ++++++++++++++ plugins/grafana/pkg/instance/structs.go | 37 ++++ plugins/grafana/src/assets/icon.png | Bin 0 -> 65075 bytes .../src/components/page/Dashboards.tsx | 84 +++++++++ .../src/components/page/DashboardsItem.tsx | 38 ++++ plugins/grafana/src/components/page/Page.tsx | 70 ++++++++ .../src/components/page/PageToolbar.tsx | 58 ++++++ .../src/components/panel/Dashboards.tsx | 90 ++++++++++ .../src/components/panel/DashboardsItem.tsx | 34 ++++ .../src/components/panel/GrafanaPanel.tsx | 41 +++++ .../grafana/src/components/panel/Panel.tsx | 74 ++++++++ plugins/grafana/src/index.ts | 16 ++ plugins/grafana/src/utils/helpers.ts | 11 ++ plugins/grafana/src/utils/interfaces.ts | 34 ++++ plugins/grafana/tsconfig.esm.json | 12 ++ plugins/grafana/tsconfig.json | 20 +++ 25 files changed, 1091 insertions(+) create mode 100644 docs/plugins/assets/grafana.png create mode 100644 docs/plugins/grafana.md create mode 100644 plugins/grafana/grafana.go create mode 100644 plugins/grafana/package.json create mode 100644 plugins/grafana/pkg/instance/instance.go create mode 100644 plugins/grafana/pkg/instance/structs.go create mode 100644 plugins/grafana/src/assets/icon.png create mode 100644 plugins/grafana/src/components/page/Dashboards.tsx create mode 100644 plugins/grafana/src/components/page/DashboardsItem.tsx create mode 100644 plugins/grafana/src/components/page/Page.tsx create mode 100644 plugins/grafana/src/components/page/PageToolbar.tsx create mode 100644 plugins/grafana/src/components/panel/Dashboards.tsx create mode 100644 plugins/grafana/src/components/panel/DashboardsItem.tsx create mode 100644 plugins/grafana/src/components/panel/GrafanaPanel.tsx create mode 100644 plugins/grafana/src/components/panel/Panel.tsx create mode 100644 plugins/grafana/src/index.ts create mode 100644 plugins/grafana/src/utils/helpers.ts create mode 100644 plugins/grafana/src/utils/interfaces.ts create mode 100644 plugins/grafana/tsconfig.esm.json create mode 100644 plugins/grafana/tsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md index b182a1275..22f2b92bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ NOTE: As semantic versioning states all 0.y.z releases can contain breaking chan - [#193](https://github.com/kobsio/kobs/pull/193): [elasticsearch] Adjust selected time range via logs chart and allow filtering via fields. - [#201](https://github.com/kobsio/kobs/pull/201): [sonarqube] Add SonarQube plugin to view projects and their measures within kobs. - [#202](https://github.com/kobsio/kobs/pull/202): [core] Add tooltip to refresh button to show selected time interval. +- [#204](https://github.com/kobsio/kobs/pull/204): [grafana] Add Grafana plugin, to show dashboards from a Grafana instance and to embed Grafana panels into kobs dashboards. ### Fixed diff --git a/app/src/index.tsx b/app/src/index.tsx index 8de625f58..56515968d 100644 --- a/app/src/index.tsx +++ b/app/src/index.tsx @@ -11,6 +11,7 @@ import applicationsPlugin from '@kobsio/plugin-applications'; import dashboardsPlugin from '@kobsio/plugin-dashboards'; import elasticsearchPlugin from '@kobsio/plugin-elasticsearch'; import fluxPlugin from '@kobsio/plugin-flux'; +import grafanaPlugin from '@kobsio/plugin-grafana'; import istioPlugin from '@kobsio/plugin-istio'; import jaegerPlugin from '@kobsio/plugin-jaeger'; import kialiPlugin from '@kobsio/plugin-kiali'; @@ -32,6 +33,7 @@ ReactDOM.render( ...dashboardsPlugin, ...elasticsearchPlugin, ...fluxPlugin, + ...grafanaPlugin, ...istioPlugin, ...jaegerPlugin, ...kialiPlugin, diff --git a/cmd/kobs/plugins/plugins.go b/cmd/kobs/plugins/plugins.go index f6b1f573b..cc36485a5 100644 --- a/cmd/kobs/plugins/plugins.go +++ b/cmd/kobs/plugins/plugins.go @@ -16,6 +16,7 @@ import ( "github.com/kobsio/kobs/plugins/dashboards" "github.com/kobsio/kobs/plugins/elasticsearch" "github.com/kobsio/kobs/plugins/flux" + "github.com/kobsio/kobs/plugins/grafana" "github.com/kobsio/kobs/plugins/istio" "github.com/kobsio/kobs/plugins/jaeger" "github.com/kobsio/kobs/plugins/kiali" @@ -37,6 +38,7 @@ type Config struct { Dashboards dashboards.Config `json:"dashboards"` Elasticsearch elasticsearch.Config `json:"elasticsearch"` Flux flux.Config `json:"flux"` + Grafana grafana.Config `json:"grafana"` Istio istio.Config `json:"istio"` Jaeger jaeger.Config `json:"jaeger"` Kiali kiali.Config `json:"kiali"` @@ -84,6 +86,7 @@ func Register(clusters *clusters.Clusters, config Config) chi.Router { jaegerRouter := jaeger.Register(clusters, router.plugins, config.Jaeger) kialiRouter := kiali.Register(clusters, router.plugins, config.Kiali) istioRouter := istio.Register(clusters, router.plugins, config.Istio, prometheusInstances, clickhouseInstances) + grafanaRouter := grafana.Register(clusters, router.plugins, config.Grafana) fluxRouter := flux.Register(clusters, router.plugins, config.Flux) opsgenieRouter := opsgenie.Register(clusters, router.plugins, config.Opsgenie) sonarqubeRouter := sonarqube.Register(clusters, router.plugins, config.Sonarqube) @@ -103,6 +106,7 @@ func Register(clusters *clusters.Clusters, config Config) chi.Router { router.Mount(jaeger.Route, jaegerRouter) router.Mount(kiali.Route, kialiRouter) router.Mount(istio.Route, istioRouter) + router.Mount(grafana.Route, grafanaRouter) router.Mount(flux.Route, fluxRouter) router.Mount(opsgenie.Route, opsgenieRouter) router.Mount(sonarqube.Route, sonarqubeRouter) diff --git a/docs/configuration/plugins.md b/docs/configuration/plugins.md index c5335e89a..cc667a9f1 100644 --- a/docs/configuration/plugins.md +++ b/docs/configuration/plugins.md @@ -7,6 +7,7 @@ Plugins can be used to extend the functions of kobs. They can be configured usin | applications | [Applications](#applications) | Configure the caching behaviour for the applications plugin. | No | | clickhouse | [[]ClickHouse](#clickhouse) | Configure multiple ClickHouse instances, which can be used within kobs. | No | | elasticsearch | [[]Elasticsearch](#elasticsearch) | Configure multiple Elasticsearch instances, which can be used within kobs. | No | +| grafana | [[]Grafana](#grafana) | Configure multiple Grafana instances, which can be used within kobs. | No | | istio | [[]Istio](#istio) | Configure multiple Istio instances, which can be used within kobs. | No | | jaeger | [[]Jaeger](#jaeger) | Configure multiple Jaeger instances, which can be used within kobs. | No | | kiali | [[]Kiali](#kiali) | Configure multiple Kiali instances, which can be used within kobs. | No | @@ -83,6 +84,30 @@ plugins: | password | string | Password to access an Elasticsearch instance via basic authentication. | No | | token | string | Token to access an Elasticsearch instance via token based authentication. | No | +## Grafana + +The following config can be used to grant kobs access to a Grafana instance running on `grafana.kobs.io`. + +```yaml +plugins: + grafana: + - name: Grafana + description: Query, visualize, alert on, and understand your data no matter where it’s stored. With Grafana you can create, explore and share all of your data through beautiful, flexible dashboards. + internalAddress: http://grafana.monitoring.svc.cluster.local:3000 + publicAddress: https://grafana.kobs.io +``` + +| Field | Type | Description | Required | +| ----- | ---- | ----------- | -------- | +| name | string | Name of the Grafana instance. | Yes | +| displayName | string | Name of the Grafana as it is shown in the UI. | Yes | +| descriptions | string | Description of the Grafana instance. | No | +| internalAddress | string | The cluster internal address of the Grafana instance. | Yes | +| publicAddress | string | The public address of the Grafana instance. | Yes | +| username | string | Username to access an Grafana instance via basic authentication. | No | +| password | string | Password to access an Grafana instance via basic authentication. | No | +| token | string | Token to access an Grafana instance via token based authentication. | No | + ## Istio The following configuration can be used to access a Istio instances using a Prometheus plugin named `prometheus` and an Clickhouse plugin named `clickhouse`. diff --git a/docs/plugins/assets/grafana.png b/docs/plugins/assets/grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..4461305a5ed863ff1fac7f64126531dc98996226 GIT binary patch literal 146939 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 z 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 `hx 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�jahZjvthy*zMtJy!!aC#zKp zdOwqhYad$prx1B9Rn69rlpA+*!*_H}1h(Vo7h9v|b?yifH#TzX5aW?G=)wrh6D+c6~Sz>LW*%#f%Dlfen*4FsSfk%>-=7sb(j8?c3*0FkzR@=L&tICrKot4G^m!`HW89Q#<>rgDS@m1YbpE} i8j}8BFNNPbyEgpbr5W&D?+__|8PAwMJ=SRD-~R{756$ub literal 0 HcmV?d00001 diff --git a/docs/plugins/grafana.md b/docs/plugins/grafana.md new file mode 100644 index 000000000..d340f1998 --- /dev/null +++ b/docs/plugins/grafana.md @@ -0,0 +1,165 @@ +# Grafana + +The Grafana plugin can be used to search through all your Grafana dashboards and to show a list of dashboards or embed a Grafana panel within a kobs dashboard. + +![Grafana](assets/grafana.png) + +## Options + +The following options can be used for a panel with the Elasticsearch plugin: + +| Field | Type | Description | Required | +| ----- | ---- | ----------- | -------- | +| type | string | The panel type. This could be `dashboards` or `panel`. | No | +| dashboards | []string | A list of dashboard ids to show, when the type is `dashboards`. | Yes | +| panel | [Panel](#panel) | The panel which should be displayed, when the type is `panel`. | Yes | + +### Panel + +| Field | Type | Description | Required | +| ----- | ---- | ----------- | -------- | +| dashboardID | string | The id of the dashboard. | Yes | +| panelID | string | The id of the panel. | Yes | +| variables | map | A map of variables, with the name of the variable as key and the value of the variable as value. | No | + +## Example + +The following dashboards shows some panels from a Grafana plugin and a list of dashboards from this instance. The dashboard also uses some variables, which are then passed to the panels from Grafana. + +```yaml +--- +apiVersion: kobs.io/v1beta1 +kind: Dashboard +metadata: + name: istio-overview + namespace: kobs +spec: + title: Istio Overview + variables: + - name: var_namespace + label: Namespace + plugin: + name: core + options: + type: static + items: + - bookinfo + - name: var_workload + label: Workload + plugin: + name: core + options: + type: static + items: + - productpage + - details + - ratings + - reviews + rows: + - size: 1 + panels: + - title: Global Request Volume + colSpan: 3 + plugin: + name: grafana + options: + type: panel + panel: + dashboardID: G8wLrJIZk + panelID: "20" + - title: Global Success Rate + colSpan: 3 + plugin: + name: grafana + options: + type: panel + panel: + dashboardID: G8wLrJIZk + panelID: "21" + - title: 4xx + colSpan: 3 + plugin: + name: grafana + options: + type: panel + panel: + dashboardID: G8wLrJIZk + panelID: "22" + - title: 5xx + colSpan: 3 + plugin: + name: grafana + options: + type: panel + panel: + dashboardID: G8wLrJIZk + panelID: "23" + + - size: 1 + panels: + - title: Incoming Request Volume + colSpan: 4 + plugin: + name: grafana + options: + type: panel + panel: + dashboardID: UbsSZTDik + panelID: "12" + variables: + var-datasource: default + var-namespace: "{% .var_namespace %}" + var-workload: "{% .var_workload %}" + var-qrep: destination + var-srcns: All + var-srcwl: All + var-dstsvc: All + - title: Incoming Success Rate + colSpan: 4 + plugin: + name: grafana + options: + type: panel + panel: + dashboardID: UbsSZTDik + panelID: "14" + variables: + var-datasource: default + var-namespace: "{% .var_namespace %}" + var-workload: "{% .var_workload %}" + var-qrep: destination + var-srcns: All + var-srcwl: All + var-dstsvc: All + - title: Request Duration + colSpan: 4 + plugin: + name: grafana + options: + type: panel + panel: + dashboardID: UbsSZTDik + panelID: "87" + variables: + var-datasource: default + var-namespace: "{% .var_namespace %}" + var-workload: "{% .var_workload %}" + var-qrep: destination + var-srcns: All + var-srcwl: All + var-dstsvc: All + + - size: 3 + panels: + - title: Dashboards + plugin: + name: grafana + options: + type: dashboards + dashboards: + - 3--MLVZZk + - G8wLrJIZk + - vu8e0VWZk + - LJ_uJAvmk + - UbsSZTDik +``` diff --git a/mkdocs.yml b/mkdocs.yml index c5ff36038..df94f8241 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -51,6 +51,7 @@ nav: - Dashboards: plugins/dashboards.md - Elasticsearch: plugins/elasticsearch.md - Flux: plugins/flux.md + - Grafana: plugins/grafana.md - Istio: plugins/istio.md - Jaeger: plugins/jaeger.md - Kiali: plugins/kiali.md diff --git a/plugins/grafana/grafana.go b/plugins/grafana/grafana.go new file mode 100644 index 000000000..60f682da5 --- /dev/null +++ b/plugins/grafana/grafana.go @@ -0,0 +1,118 @@ +package grafana + +import ( + "net/http" + + "github.com/kobsio/kobs/pkg/api/clusters" + "github.com/kobsio/kobs/pkg/api/middleware/errresponse" + "github.com/kobsio/kobs/pkg/api/plugins/plugin" + "github.com/kobsio/kobs/plugins/grafana/pkg/instance" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/render" + "github.com/sirupsen/logrus" +) + +// Route is the route under which the plugin should be registered in our router for the rest api. +const ( + Route = "/grafana" +) + +var ( + log = logrus.WithFields(logrus.Fields{"package": "grafana"}) +) + +// Config is the structure of the configuration for the grafana plugin. +type Config []instance.Config + +// Router implements the router for the resources plugin, which can be registered in the router for our rest api. +type Router struct { + *chi.Mux + clusters *clusters.Clusters + instances []*instance.Instance +} + +func (router *Router) getInstance(name string) *instance.Instance { + for _, i := range router.instances { + if i.Name == name { + return i + } + } + + return nil +} + +func (router *Router) getDashboards(w http.ResponseWriter, r *http.Request) { + name := chi.URLParam(r, "name") + query := r.URL.Query().Get("query") + uids := r.URL.Query()["uid"] + + log.WithFields(logrus.Fields{"name": name, "query": query, "uids": uids}).Tracef("getDashboards") + + i := router.getInstance(name) + if i == nil { + errresponse.Render(w, r, nil, http.StatusBadRequest, "Could not find instance name") + return + } + + if uids != nil { + var dashboards []instance.Dashboard + for _, uid := range uids { + dashboard, err := i.GetDashboard(r.Context(), uid) + if err != nil { + errresponse.Render(w, r, err, http.StatusInternalServerError, "Could not get dashboard") + return + } + + dashboards = append(dashboards, *dashboard) + } + + render.JSON(w, r, dashboards) + return + } + + dashboards, err := i.GetDashboards(r.Context(), query) + if err != nil { + errresponse.Render(w, r, err, http.StatusInternalServerError, "Could not get dashboards") + return + } + + render.JSON(w, r, dashboards) +} + +// Register returns a new router which can be used in the router for the kobs rest api. +func Register(clusters *clusters.Clusters, plugins *plugin.Plugins, config Config) chi.Router { + var instances []*instance.Instance + + for _, cfg := range config { + instance, err := instance.New(cfg) + if err != nil { + log.WithError(err).WithFields(logrus.Fields{"name": cfg.Name}).Fatalf("Could not create Grafana instance") + } + + instances = append(instances, instance) + + var options map[string]interface{} + options = make(map[string]interface{}) + options["internalAddress"] = cfg.InternalAddress + options["publicAddress"] = cfg.PublicAddress + + plugins.Append(plugin.Plugin{ + Name: cfg.Name, + DisplayName: cfg.DisplayName, + Description: cfg.Description, + Type: "grafana", + Options: options, + }) + } + + router := Router{ + chi.NewRouter(), + clusters, + instances, + } + + router.Get("/dashboards/{name}", router.getDashboards) + + return router +} diff --git a/plugins/grafana/package.json b/plugins/grafana/package.json new file mode 100644 index 000000000..8c6437810 --- /dev/null +++ b/plugins/grafana/package.json @@ -0,0 +1,24 @@ +{ + "name": "@kobsio/plugin-grafana", + "version": "0.0.0", + "license": "MIT", + "private": false, + "main": "./lib/index.js", + "module": "./lib-esm/index.js", + "types": "./lib/index.d.ts", + "scripts": { + "plugin": "tsc && tsc --build tsconfig.esm.json && cp -r src/assets lib && cp -r src/assets lib-esm" + }, + "dependencies": { + "@kobsio/plugin-core": "*", + "@patternfly/react-core": "^4.128.2", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "@types/react-router-dom": "^5.1.7", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-query": "^3.17.2", + "react-router-dom": "^5.2.0", + "typescript": "^4.3.4" + } +} diff --git a/plugins/grafana/pkg/instance/instance.go b/plugins/grafana/pkg/instance/instance.go new file mode 100644 index 000000000..f180e0423 --- /dev/null +++ b/plugins/grafana/pkg/instance/instance.go @@ -0,0 +1,132 @@ +package instance + +import ( + "context" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + + "github.com/kobsio/kobs/pkg/api/middleware/roundtripper" + + "github.com/sirupsen/logrus" +) + +var ( + log = logrus.WithFields(logrus.Fields{"package": "grafana"}) +) + +// Config is the structure of the configuration for a single Grafana instance. +type Config struct { + Name string `json:"name"` + DisplayName string `json:"displayName"` + Description string `json:"description"` + InternalAddress string `json:"internalAddress"` + PublicAddress string `json:"publicAddress"` + Username string `json:"username"` + Password string `json:"password"` + Token string `json:"token"` +} + +// Instance represents a single Grafana instance, which can be added via the configuration file. +type Instance struct { + Name string + address string + client *http.Client +} + +// doRequest is a helper function to run a request against a Grafana instance for the given path. It returns the body +// or if the request failed the error message. +func (i *Instance) doRequest(ctx context.Context, url string) ([]byte, error) { + log.WithFields(logrus.Fields{"url": i.address + url}).Tracef("request url") + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("%s%s", i.address, url), nil) + if err != nil { + return nil, err + } + + resp, err := i.client.Do(req) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + + if resp.StatusCode >= 200 && resp.StatusCode < 300 { + return ioutil.ReadAll(resp.Body) + } + + var res ResponseError + + err = json.NewDecoder(resp.Body).Decode(&res) + if err != nil { + return nil, err + } + + if res.Message != "" { + return nil, fmt.Errorf(res.Message) + } + + return nil, fmt.Errorf("an unknown error occured") +} + +// GetDashboards returns a list of dashboards for the given query. +func (i *Instance) GetDashboards(ctx context.Context, query string) ([]Dashboard, error) { + body, err := i.doRequest(ctx, fmt.Sprintf("/api/search?query=%s&limit=100", query)) + if err != nil { + return nil, err + } + + var dashboards []Dashboard + if err := json.Unmarshal(body, &dashboards); err != nil { + return nil, err + } + + return dashboards, nil +} + +// GetDashboard returns a single dashboard by it's uid. +func (i *Instance) GetDashboard(ctx context.Context, uid string) (*Dashboard, error) { + body, err := i.doRequest(ctx, fmt.Sprintf("/api/dashboards/uid/%s", uid)) + if err != nil { + return nil, err + } + + var dashboard SingleDashboardResponse + if err := json.Unmarshal(body, &dashboard); err != nil { + return nil, err + } + + return &Dashboard{ + DashboardData: dashboard.Dashboard, + DashboardMetadata: dashboard.Metadata, + }, nil +} + +// New returns a new Elasticsearch instance for the given configuration. +func New(config Config) (*Instance, error) { + roundTripper := roundtripper.DefaultRoundTripper + + if config.Username != "" && config.Password != "" { + roundTripper = roundtripper.BasicAuthTransport{ + Transport: roundTripper, + Username: config.Username, + Password: config.Password, + } + } + + if config.Token != "" { + roundTripper = roundtripper.TokenAuthTransporter{ + Transport: roundTripper, + Token: config.Token, + } + } + + return &Instance{ + Name: config.Name, + address: config.InternalAddress, + client: &http.Client{ + Transport: roundTripper, + }, + }, nil +} diff --git a/plugins/grafana/pkg/instance/structs.go b/plugins/grafana/pkg/instance/structs.go new file mode 100644 index 000000000..1a38cde3b --- /dev/null +++ b/plugins/grafana/pkg/instance/structs.go @@ -0,0 +1,37 @@ +package instance + +// ResponseError is the structure of failed Grafana API call. +type ResponseError struct { + Message string `json:"message"` +} + +// Dashboard is the structure of a single Grafana dashboard. It contains the dashboard data and metadata. If this is +// used via the search API it also contains a type field, because the API also returns folders. +type Dashboard struct { + DashboardData + DashboardMetadata + Type string `json:"type,omitempty"` +} + +// SingleDashboardResponse is the structure of the data returned by the Grafana API to get a dashboard by its uid. +type SingleDashboardResponse struct { + Dashboard DashboardData `json:"dashboard"` + Metadata DashboardMetadata `json:"meta"` +} + +// DashboardData is the structure for the dashbord data returned by the Grafana API. +type DashboardData struct { + ID int `json:"id"` + UID string `json:"uid"` + Title string `json:"title"` + Tags []string `json:"tags"` +} + +// DashboardMetadata contains the metadata of a dashboard returned by the Grafana API. +type DashboardMetadata struct { + URL string `json:"url"` + FolderID int `json:"folderId"` + FolderUID string `json:"folderUid"` + FolderTitle string `json:"folderTitle,omitempty"` + FolderURL string `json:"folderUrl,omitempty"` +} diff --git a/plugins/grafana/src/assets/icon.png b/plugins/grafana/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..24ef3263779a7abb250daf4d6c2c9ac12600c586 GIT binary patch literal 65075 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 = ({ name, query, publicAddress }: IDashboardsProps) => { + const { isError, isLoading, error, data, refetch } = useQuery( + ['grafana/dashboards', name, query], + async () => { + try { + const response = await fetch(`/api/plugins/grafana/dashboards/${name}?query=${encodeURIComponent(query)}`, { + method: 'get', + }); + const json = await response.json(); + + if (response.status >= 200 && response.status < 300) { + return json; + } else { + if (json.error) { + throw new Error(json.error); + } else { + throw new Error('An unknown error occured'); + } + } + } catch (err) { + throw err; + } + }, + ); + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (isError) { + return ( + + > => refetch()}> + Retry + + + } + > +

{error?.message}

+
+ ); + } + + if (!data || data.length === 0) { + return null; + } + + return ( + + + + {data + .filter((dashboard) => dashboard.type !== 'dash-folder') + .map((dashboard, index) => ( + + ))} + + + + ); +}; + +export default Dashboards; diff --git a/plugins/grafana/src/components/page/DashboardsItem.tsx b/plugins/grafana/src/components/page/DashboardsItem.tsx new file mode 100644 index 000000000..1ae59b74c --- /dev/null +++ b/plugins/grafana/src/components/page/DashboardsItem.tsx @@ -0,0 +1,38 @@ +import { MenuItem } from '@patternfly/react-core'; +import React from 'react'; + +import { IDashboard } from '../../utils/interfaces'; + +interface IDashboardItemProps { + dashboard: IDashboard; + publicAddress: string; +} + +const DashboardItem: React.FunctionComponent = ({ + dashboard, + publicAddress, +}: IDashboardItemProps) => { + return ( + + + Folder: + {dashboard.folderTitle || '-'} + + + Tags: + + {dashboard.tags && dashboard.tags.length > 0 ? dashboard.tags.join(', ') : '-'} + + + + } + > + {dashboard.title} + + ); +}; + +export default DashboardItem; diff --git a/plugins/grafana/src/components/page/Page.tsx b/plugins/grafana/src/components/page/Page.tsx new file mode 100644 index 000000000..c1d6d5bf8 --- /dev/null +++ b/plugins/grafana/src/components/page/Page.tsx @@ -0,0 +1,70 @@ +import { + Drawer, + DrawerContent, + DrawerContentBody, + PageSection, + PageSectionVariants, + Title, +} from '@patternfly/react-core'; +import React, { useEffect, useState } from 'react'; +import { useHistory, useLocation } from 'react-router-dom'; + +import Dashboards from './Dashboards'; +import { IOptions } from '../../utils/interfaces'; +import { IPluginPageProps } from '@kobsio/plugin-core'; +import PageToolbar from './PageToolbar'; +import { getOptionsFromSearch } from '../../utils/helpers'; + +const Page: React.FunctionComponent = ({ + name, + displayName, + description, + options, +}: IPluginPageProps) => { + const location = useLocation(); + const history = useHistory(); + const [pageOptions, setPageOptions] = useState(getOptionsFromSearch(location.search)); + + // changePageOptions is used to change the options to get a list of dashboards from Grafna. Instead of directly + // modifying the options state we change the URL parameters. + const changePageOptions = (opts: IOptions): void => { + history.push({ + pathname: location.pathname, + search: `?query=${encodeURIComponent(opts.query)}`, + }); + }; + + // useEffect is used to set the options every time the search location for the current URL changes. The URL is changed + // via the changePageOptions function. When the search location is changed we modify the options state. + useEffect(() => { + setPageOptions(getOptionsFromSearch(location.search)); + }, [location.search]); + + return ( + + + + {displayName} + +

{description}

+ +
+ + + + + + + + + + +
+ ); +}; + +export default Page; diff --git a/plugins/grafana/src/components/page/PageToolbar.tsx b/plugins/grafana/src/components/page/PageToolbar.tsx new file mode 100644 index 000000000..04257fa5e --- /dev/null +++ b/plugins/grafana/src/components/page/PageToolbar.tsx @@ -0,0 +1,58 @@ +import { + Button, + ButtonVariant, + TextInput, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem, + ToolbarToggleGroup, +} from '@patternfly/react-core'; +import { FilterIcon, SearchIcon } from '@patternfly/react-icons'; +import React, { useState } from 'react'; + +import { IOptions } from '../../utils/interfaces'; + +interface IPageToolbarProps extends IOptions { + name: string; + setOptions: (data: IOptions) => void; +} + +const PageToolbar: React.FunctionComponent = ({ name, query, setOptions }: IPageToolbarProps) => { + const [data, setData] = useState({ query: query }); + + // changeQuery changes the value of a query. + const changeQuery = (value: string): void => { + setData({ ...data, query: value }); + }; + + // onEnter is used to detect if the user pressed the "ENTER" key. If this is the case we are calling the setOptions + // function to trigger the search. + // use "SHIFT" + "ENTER". + const onEnter = (e: React.KeyboardEvent | undefined): void => { + if (e?.key === 'Enter' && !e.shiftKey) { + setOptions(data); + } + }; + + return ( + + + } breakpoint="lg"> + + + + + + + + + + + + ); +}; + +export default PageToolbar; diff --git a/plugins/grafana/src/components/panel/Dashboards.tsx b/plugins/grafana/src/components/panel/Dashboards.tsx new file mode 100644 index 000000000..e764f63bc --- /dev/null +++ b/plugins/grafana/src/components/panel/Dashboards.tsx @@ -0,0 +1,90 @@ +import { Alert, AlertActionLink, AlertVariant, Menu, MenuContent, MenuList, Spinner } from '@patternfly/react-core'; +import { QueryObserverResult, useQuery } from 'react-query'; +import React from 'react'; + +import DashboardsItem from './DashboardsItem'; +import { IDashboard } from '../../utils/interfaces'; + +interface IDashboardsProps { + name: string; + dashboardIDs: string[]; + publicAddress: string; +} + +const Dashboards: React.FunctionComponent = ({ + name, + dashboardIDs, + publicAddress, +}: IDashboardsProps) => { + const { isError, isLoading, error, data, refetch } = useQuery( + ['grafana/dashboards', name, dashboardIDs], + async () => { + try { + const uidParams = dashboardIDs.map((dashboardID) => `uid=${dashboardID}`).join('&'); + + const response = await fetch(`/api/plugins/grafana/dashboards/${name}?${uidParams}`, { + method: 'get', + }); + const json = await response.json(); + + if (response.status >= 200 && response.status < 300) { + return json; + } else { + if (json.error) { + throw new Error(json.error); + } else { + throw new Error('An unknown error occured'); + } + } + } catch (err) { + throw err; + } + }, + ); + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (isError) { + return ( + + > => refetch()}> + Retry + + + } + > +

{error?.message}

+
+ ); + } + + if (!data || data.length === 0) { + return null; + } + + return ( + + + + {data + .filter((dashboard) => dashboard.type !== 'dash-folder') + .map((dashboard, index) => ( + + ))} + + + + ); +}; + +export default Dashboards; diff --git a/plugins/grafana/src/components/panel/DashboardsItem.tsx b/plugins/grafana/src/components/panel/DashboardsItem.tsx new file mode 100644 index 000000000..5e2617001 --- /dev/null +++ b/plugins/grafana/src/components/panel/DashboardsItem.tsx @@ -0,0 +1,34 @@ +import { MenuItem } from '@patternfly/react-core'; +import React from 'react'; + +import { IDashboard } from '../../utils/interfaces'; + +interface IDashboardItemProps { + dashboard: IDashboard; + publicAddress: string; +} + +const DashboardItem: React.FunctionComponent = ({ + dashboard, + publicAddress, +}: IDashboardItemProps) => { + return ( + + + Tags: + + {dashboard.tags && dashboard.tags.length > 0 ? dashboard.tags.join(', ') : '-'} + + + + } + > + {dashboard.title} + + ); +}; + +export default DashboardItem; diff --git a/plugins/grafana/src/components/panel/GrafanaPanel.tsx b/plugins/grafana/src/components/panel/GrafanaPanel.tsx new file mode 100644 index 000000000..bc250a24b --- /dev/null +++ b/plugins/grafana/src/components/panel/GrafanaPanel.tsx @@ -0,0 +1,41 @@ +import React from 'react'; + +import { IGrafanaPanelVariables } from '../../utils/interfaces'; +import { IPluginTimes } from '@kobsio/plugin-core'; + +interface IGrafanaPanelProps { + title: string; + dashboardID: string; + panelID: string; + variables?: IGrafanaPanelVariables; + internalAddress: string; + times: IPluginTimes; +} + +const GrafanaPanel: React.FunctionComponent = ({ + title, + dashboardID, + panelID, + internalAddress, + variables, + times, +}: IGrafanaPanelProps) => { + const variableParams = variables + ? Object.keys(variables) + .map((key) => `${key}=${variables[key]}`) + .join('&') + : ''; + + return ( + + ); +}; + +export default GrafanaPanel; diff --git a/plugins/grafana/src/components/panel/Panel.tsx b/plugins/grafana/src/components/panel/Panel.tsx new file mode 100644 index 000000000..cfe2a6137 --- /dev/null +++ b/plugins/grafana/src/components/panel/Panel.tsx @@ -0,0 +1,74 @@ +import React, { memo } from 'react'; + +import { IPluginPanelProps, PluginCard, PluginOptionsMissing } from '@kobsio/plugin-core'; +import Dashboards from './Dashboards'; +import GrafanaPanel from './GrafanaPanel'; +import { IPanelOptions } from '../../utils/interfaces'; + +interface IPanelProps extends IPluginPanelProps { + options?: IPanelOptions; +} + +export const Panel: React.FunctionComponent = ({ + name, + title, + description, + times, + pluginOptions, + options, +}: IPanelProps) => { + if ( + options && + options.type === 'panel' && + options.panel && + options.panel.dashboardID && + options.panel.panelID && + times + ) { + return ( + + ); + } + + if ( + options && + options.type === 'dashboards' && + options.dashboards && + Array.isArray(options.dashboards) && + options.dashboards.length > 0 + ) { + return ( + + + + ); + } + + return ( + + ); +}; + +export default memo(Panel, (prevProps, nextProps) => { + if (JSON.stringify(prevProps) === JSON.stringify(nextProps)) { + return true; + } + + return false; +}); diff --git a/plugins/grafana/src/index.ts b/plugins/grafana/src/index.ts new file mode 100644 index 000000000..c51d429c0 --- /dev/null +++ b/plugins/grafana/src/index.ts @@ -0,0 +1,16 @@ +import { IPluginComponents } from '@kobsio/plugin-core'; + +import icon from './assets/icon.png'; + +import Page from './components/page/Page'; +import Panel from './components/panel/Panel'; + +const grafanaPlugin: IPluginComponents = { + grafana: { + icon: icon, + page: Page, + panel: Panel, + }, +}; + +export default grafanaPlugin; diff --git a/plugins/grafana/src/utils/helpers.ts b/plugins/grafana/src/utils/helpers.ts new file mode 100644 index 000000000..de741dfd7 --- /dev/null +++ b/plugins/grafana/src/utils/helpers.ts @@ -0,0 +1,11 @@ +import { IOptions } from './interfaces'; + +// getOptionsFromSearch is used to get the Jaeger options from a given search location. +export const getOptionsFromSearch = (search: string): IOptions => { + const params = new URLSearchParams(search); + const query = params.get('query'); + + return { + query: query === null ? '' : query, + }; +}; diff --git a/plugins/grafana/src/utils/interfaces.ts b/plugins/grafana/src/utils/interfaces.ts new file mode 100644 index 000000000..d9fec0501 --- /dev/null +++ b/plugins/grafana/src/utils/interfaces.ts @@ -0,0 +1,34 @@ +// IOptions is the interface for the options on the Grafana page. +export interface IOptions { + query: string; +} + +export interface IPanelOptions { + type?: string; + dashboards?: string[]; + panel?: IGrafanaPanelOptions; +} + +export interface IGrafanaPanelOptions { + dashboardID?: string; + panelID?: string; + variables?: IGrafanaPanelVariables; +} + +export interface IGrafanaPanelVariables { + [key: string]: string; +} + +// IDashboard is the interface of a single dashboard. +export interface IDashboard { + id: number; + uid: string; + title: string; + url: string; + type?: string; + tags: string[]; + folderId: number; + folderUid: string; + folderTitle?: string; + folderUrl?: string; +} diff --git a/plugins/grafana/tsconfig.esm.json b/plugins/grafana/tsconfig.esm.json new file mode 100644 index 000000000..acbc1eff8 --- /dev/null +++ b/plugins/grafana/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "compilerOptions": { + "outDir": "lib-esm", + "module": "esnext", + "target": "esnext", + "moduleResolution": "node", + "lib": ["dom", "esnext"], + "declaration": false + } +} diff --git a/plugins/grafana/tsconfig.json b/plugins/grafana/tsconfig.json new file mode 100644 index 000000000..09365d619 --- /dev/null +++ b/plugins/grafana/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.json", + "exclude": ["node_modules", "lib-esm", "lib"], + "include": ["src"], + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "outDir": "lib", + "declaration": true + } +}