Compare commits

...

13 Commits

  1. 82
      README.md
  2. 4
      package.json
  3. BIN
      src/img/task-creation.png
  4. BIN
      src/img/task-list.png
  5. 2
      src/panels/corpglory-dataexporter-panel/components/Panel.tsx
  6. 13
      src/plugin.json
  7. 24
      src/plugin_state.ts
  8. 7
      yarn.lock

82
README.md

@ -6,85 +6,27 @@ Supported datasources:
- MySQL
- PostgreSQL
We work on expanding this list. If you would like us to support any particular datasource -- please let us know at ping@corpglory.com
## Prerequisites
- [Grafana 9.0.0+](https://grafana.com/grafana/download)
- [Grafana Data Exporter](https://code.corpglory.net/corpglory/grafana-data-exporter)
- set Grafana `app_mode` as `development`:
- find the configuration file: [https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#configuration-file-location](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#configuration-file-location)
- change `app_mode = production` to `app_mode = development`
- restart Grafana
## Plugin installation
The easiest way to install plugins is by using the `grafana-cli` tool which is bundled with Grafana. See [Using grafana-cli](#using-grafana-cli) paragraph.
If there is no `grafana-cli` tool in your system, plugins can be installed [manually](#manual-installation).
### Table of contents
- [Using grafana-cli](#using-grafana-cli)
- [Install plugin](#install-update-plugin)
- [Manual installation](#manual-installation)
- [Docker installation](#docker-installation)
### Using grafana-cli
Grafana docs about plugin installation: [https://grafana.com/docs/grafana/latest/cli/#plugins-commands](https://grafana.com/docs/grafana/latest/cli/#plugins-commands).
#### Install / update plugin
```bash
grafana-cli --pluginUrl "https://code.corpglory.net/attachments/89ae5865-2ae7-474c-a6f0-f29d19e6b1dd" plugins install corpglory-dataexporter-app
sudo systemctl restart grafana-server
```
### Manual installation
- Navigate to Grafana plugins directory:
- For Grafana installed from `.deb`/`.rpm` package:
- `/var/lib/grafana/plugins`
- For Grafana installed using Standalone Linux Binaries or source:
- `<GRAFANA_PATH>/data/plugins`
- Download corpglory-dataexporter-app
```bash
wget http://code.corpglory.net/attachments/5f1c5e28-544b-416a-a425-7cdf49fa60ac -O corpglory-dataexporter-app.tar.gz
```
- Unpack downloaded files
```bash
tar -zxvf corpglory-dataexporter-app.tar.gz
```
- Restart Grafana
- For Grafana installed from `.deb`/`.rpm` package:
- `systemctl restart grafana-server`
- For Grafana installed using Standalone Linux Binaries or source:
- Stop any running instances of grafana-server
- Start grafana-server: `cd <GRAFANA_PATH> && ./bin/grafana-server`
### Docker installation
You can install Data Exporter App to Grafana in Docker passing it as the environment variable.
```bash
docker run \
-p 3000:3000 \
-e "GF_INSTALL_PLUGINS=https://code.corpglory.net/attachments/89ae5865-2ae7-474c-a6f0-f29d19e6b1dd;corpglory-dataexporter-app" \
grafana/grafana
```
#### Useful links
- Grafana docs about Docker installation: [https://docs.grafana.org/installation/docker/#installing-plugins-from-other-sources](https://docs.grafana.org/installation/docker/#installing-plugins-from-other-sources)
## Plugin Configuration
- Make sure [Grafana Data Exporter](https://code.corpglory.net/corpglory/grafana-data-exporter) is running, and accessible from Grafana Server
- In Grafana, go to Configuration -> Plugins -> Data Exporter App
- Fill "DataExporter backend URL" field with the Data Exporter URL (Please note: the URL should be accessible by Grafana Server)
- Fill "DataExporter backend URL" field with the Data Exporter URL (Please note: the URL should be accessible from Grafana Server)
- Click Connect
- If Grafana connects to the Data Exporter successfully, you'll see this message: "Plugin is connected! You can now go to a dashboard and add the DataExporter panel there."
- After this:
- go to a dashboard you'd like to export data from
- click "Add panel"
- select Data Exporter Panel
## Plugin Usage
- go to a dashboard you'd like to export data from
- click "Add panel"
- select Data Exporter Panel
- click Add Task
- select timerange and query
- click Export
## Support and Consulting

4
package.json

@ -1,6 +1,6 @@
{
"name": "corpglory-dataexporter-app",
"version": "1.0.7",
"version": "1.0.10",
"description": "",
"scripts": {
"lint": "eslint --cache --ext .js,.jsx,.ts,.tsx --max-warnings=0 ./src",
@ -55,6 +55,7 @@
"@types/node": "^17.0.19",
"@types/react-copy-to-clipboard": "^5.0.4",
"@types/react-router-dom": "^5.3.3",
"@types/uuid": "^9.0.2",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.33.0",
"axios": "^1.2.1",
@ -84,6 +85,7 @@
"ts-node": "^10.5.0",
"tsconfig-paths": "^3.12.0",
"typescript": "^4.4.0",
"uuid": "^9.0.0",
"webpack": "^5.69.1",
"webpack-cli": "^4.9.2",
"webpack-livereload-plugin": "^3.0.2"

BIN
src/img/task-creation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
src/img/task-list.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

2
src/panels/corpglory-dataexporter-panel/components/Panel.tsx

@ -499,7 +499,7 @@ export function Panel({ width, height, timeRange, eventBus, timeZone }: Props) {
);
const mainDiv = (
<div>
<Table width={width} height={height - 40} data={tasksDataFrame as DataFrame} />
{tasksDataFrame && <Table width={width} height={height - 40} data={tasksDataFrame as DataFrame} />}
<HorizontalGroup justify="flex-end">
<Button variant="primary" icon="plus" style={{ marginTop: '8px' }} onClick={openDatasourceModal}>
Add Task

13
src/plugin.json

@ -4,7 +4,7 @@
"name": "Data Exporter App",
"id": "corpglory-dataexporter-app",
"info": {
"description": "",
"description": "Export dashboard data into CSV",
"author": {
"name": "CorpGlory Inc."
},
@ -13,7 +13,16 @@
"large": "img/logo.svg"
},
"keywords": ["export", "csv"],
"screenshots": [],
"screenshots": [
{
"name": "Task List",
"path": "img/task-list.png"
},
{
"name": "Task Creation",
"path": "img/task-creation.png"
}
],
"version": "%VERSION%",
"updated": "%TODAY%"
},

24
src/plugin_state.ts

@ -7,8 +7,12 @@ import {
import { getBackendSrv } from '@grafana/runtime';
import { v4 as uuidv4 } from 'uuid';
import axios from 'axios';
import * as _ from 'lodash';
export type UpdateGrafanaPluginSettingsProps = {
jsonData?: Partial<DataExporterPluginMetaJSONData>;
secureJsonData?: Partial<DataExporterPluginMetaSecureJSONData>;
@ -97,19 +101,25 @@ class PluginState {
static createGrafanaToken = async () => {
const baseUrl = '/api/auth/keys';
const keys = await this.grafanaBackend.get(baseUrl);
const existingKey = keys.find((key: { id: number; name: string; role: string }) => key.name === 'DataExporter');
const keys = await this.grafanaBackend.get(baseUrl, { includeExpired: true });
const existingKeys = keys.filter((key: { id: number; name: string; role: string }) =>
_.includes(key.name, 'DataExporter')
);
if (existingKey) {
// @ts-ignore
// for some reason, there is no `options` argument in Grafana's public types for BackendSrv but it exists
await this.grafanaBackend.delete(`${baseUrl}/${existingKey.id}`, undefined, { showSuccessAlert: false });
console.log('existingKeys', existingKeys);
if (!_.isEmpty(existingKeys)) {
for (let key of existingKeys) {
// @ts-ignore
// for some reason, there is no `options` argument in Grafana's public types for BackendSrv but it exists
await this.grafanaBackend.delete(`${baseUrl}/${key.id}`, undefined, { showSuccessAlert: false });
}
}
return await this.grafanaBackend.post(
baseUrl,
{
name: 'DataExporter',
name: `DataExporter_${uuidv4()}`,
role: 'Admin',
secondsToLive: null,
},

7
yarn.lock

@ -3945,6 +3945,11 @@
dependencies:
source-map "^0.6.1"
"@types/uuid@^9.0.2":
version "9.0.2"
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.2.tgz#ede1d1b1e451548d44919dc226253e32a6952c4b"
integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==
"@types/webpack-dev-server@3":
version "3.11.6"
resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz#d8888cfd2f0630203e13d3ed7833a4d11b8a34dc"
@ -12944,7 +12949,7 @@ uuid@8.3.2, uuid@^8.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
uuid@9.0.0:
uuid@9.0.0, uuid@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==

Loading…
Cancel
Save