import { QueryService } from './base'; import { DatasourceUnavailable } from '../../types'; import { Datasource, DatasourceQuery } from '../../connectors'; import axios, { AxiosResponse } from 'axios'; import * as _ from 'lodash'; export class DirectQueryService extends QueryService { constructor(datasource: Datasource) { super(datasource); } async query(query: DatasourceQuery): Promise> { // TODO: support auth let axiosQuery = { ...query, }; _.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}`, this._datasource.type, query.url ); throw datasourceError; } } throw new Error(msg); } } }