Browse Source

grafana-datasource-kit usage start

pull/1/head
rozetko 6 years ago
parent
commit
580bbfd6a3
  1. 0
      src/grafana-datasource-kit/grafana_metric_model.ts
  2. 63
      src/grafana-datasource-kit/grafana_service.ts
  3. 66
      src/grafana_api.ts
  4. 21
      src/target.ts

0
src/grafana_metric_model.ts → src/grafana-datasource-kit/grafana_metric_model.ts

63
src/grafana-datasource-kit/grafana_service.ts

@ -0,0 +1,63 @@
import { GrafanaMetric } from './grafana_metric_model';
import { getApiKey } from '../config';
import { URL } from 'url';
import axios from 'axios';
const CHUNK_SIZE = 50000;
/**
* @param metric to query to Grafana
* @returns [time, value][] array
*/
export async function queryByMetric(
metric: GrafanaMetric, panelUrl: string, from: number, to: number
): Promise<[number, number][]> {
let datasource = metric.datasource;
let origin = new URL(panelUrl).origin;
let url = `${origin}/${datasource.url}`;
let params = datasource.params
let data = [];
let chunkParams = Object.assign({}, params);
while(true) {
chunkParams.q = metric.metricQuery.getQuery(from, to, CHUNK_SIZE, data.length);
var chunk = await queryGrafana(url, chunkParams);
data = data.concat(chunk);
if(chunk.length < CHUNK_SIZE) {
// because if we get less that we could, then there is nothing more
break;
}
}
return data;
}
async function queryGrafana(url: string, params: any) {
let headers = { Authorization: `Bearer ${getApiKey(url)}` };
try {
var res = await axios.get(url, { params, headers });
} catch (e) {
if(e.response.status === 401) {
throw new Error('Unauthorized. Check the $HASTIC_API_KEY.');
}
throw new Error(e.message);
}
if (res.data.results === undefined) {
throw new Error('results field is undefined in response.');
}
// TODO: support more than 1 metric (each res.data.results item is a metric)
let results = res.data.results[0];
if (results.series === undefined) {
return [];
}
return results.series[0].values as [number, number][];
}

66
src/grafana_api.ts

@ -1,66 +0,0 @@
import { getApiKey } from './config';
import axios from 'axios';
export class GrafanaAPI {
private apiKey;
constructor(private grafanaUrl) {
getApiKey(grafanaUrl)
.then(key => {
this.apiKey = key;
console.log(this.apiKey);
});
}
private get _headers() {
return {
'Authorization': `Bearer ${this.apiKey}`,
'Accept': 'application/json',
'Content-Type': 'application/json'
};
}
private async _getDatasourceByName(name) {
return fetch(`${this.grafanaUrl}/api/datasources/name/${name}`, {
method: 'GET',
headers: this._headers
})
.then(data => data.json());
}
public async queryDatasource(datasourceName, measurement, query) {
let datasource = await this._getDatasourceByName(datasourceName);
return this._queryGrafana(`${this.grafanaUrl}/api/datasources/proxy/${datasource.id}/query`, {
q: encodeURIComponent(query),
db: datasource.database,
epoch: 'ms'
});
}
private async _queryGrafana(url: string, params: any) {
try {
var res = await axios.get(url, { params, headers: this._headers });
} catch (e) {
if(e.response.status === 401) {
throw new Error('Unauthorized. Check the $HASTIC_API_KEY.');
}
throw new Error(e.message);
}
if (res.data.results === undefined) {
throw new Error('results field is undefined in response.');
}
// TODO: support more than 1 metric (each res.data.results item is a metric)
let results = res.data.results[0];
if (results.series === undefined) {
return [];
}
return results.series[0].values as [number, number][];
}
}

21
src/target.ts

@ -1,4 +1,5 @@
import { GrafanaAPI } from './grafana_api';
import { queryByMetric } from './grafana-datasource-kit/grafana_service';
import { GrafanaDatasource } from './grafana-datasource-kit/grafana_metric_model';
import * as csv from 'fast-csv';
import * as path from 'path';
@ -13,18 +14,26 @@ export class Target {
private days: number;
private day: number;
private csvStream: any;
private grafana: GrafanaAPI;
private _datasource: GrafanaDatasource;
constructor(
private grafanaUrl: string,
panelUrl: string,
private user: string,
private datasource: string,
datasource: string,
private measurement: string,
private query: string,
private from: number,
private to: number
) {
this.grafana = new GrafanaAPI(this.grafanaUrl);
this._datasource = {
url: panelUrl,
type: type,
params: {
db: string,
q: string,
epoch: string
}
}
}
public updateStatus(status) {
@ -67,7 +76,7 @@ export class Target {
console.log(`${this.day} day: ${from}ms -> ${to}ms`);
let currentQuery = this.query.replace('$timeFilter', `time >= ${from}ms AND time <= ${to}ms`).replace('$__interval', '1s');
let metrics = await this.grafana.queryDatasource(this.datasource, this.measurement, currentQuery);
let metrics = await queryByMetric(this.datasource, currentQuery);
console.log(metrics);
if(metrics.length > 0) {

Loading…
Cancel
Save