import { DatasourceUnavailable } from '../types'; import { Datasource, DatasourceQuery } from '../connectors'; import axios from 'axios'; import * as _ from 'lodash'; // TODO: support direct queries auth // TODO: move to class and inherit from QueryService abstract class export async function queryDirect(query: DatasourceQuery, datasource: Datasource) { let axiosQuery = { url: query.url, method: query.method, }; console.log(axiosQuery) _.defaults(axiosQuery, query.schema); try { return axios(axiosQuery); } catch (e) { // TODO: seems like this error handler can be used for both Grafana and Direct queries const msg = `TSDB-kit: fail while request data: ${e.message}`; const parsedUrl = new URL(query.url); const queryUrl = `query url: ${JSON.stringify(parsedUrl.pathname)}`; console.error(`${msg} ${queryUrl}`); if(e.response !== undefined) { console.error(`Response: \ status: ${e.response.status}, \ response data: ${JSON.stringify(e.response.data)}, \ headers: ${JSON.stringify(e.response.headers)} `); if(e.response.status === 401) { throw new Error(`Unauthorized. Check credentials. ${e.message}`); } if(e.response.status === 502) { let datasourceError = new DatasourceUnavailable( `datasource ${parsedUrl.pathname} unavailable, message: ${e.message}`, datasource.type, query.url ); throw datasourceError; } } throw new Error(msg); } }