diff options
Diffstat (limited to 'app/assets/javascripts/monitoring/requests/index.js')
-rw-r--r-- | app/assets/javascripts/monitoring/requests/index.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/app/assets/javascripts/monitoring/requests/index.js b/app/assets/javascripts/monitoring/requests/index.js new file mode 100644 index 00000000000..28064361768 --- /dev/null +++ b/app/assets/javascripts/monitoring/requests/index.js @@ -0,0 +1,46 @@ +import axios from '~/lib/utils/axios_utils'; +import statusCodes from '~/lib/utils/http_status'; +import { backOff } from '~/lib/utils/common_utils'; +import { PROMETHEUS_TIMEOUT } from '../constants'; + +const cancellableBackOffRequest = makeRequestCallback => + backOff((next, stop) => { + makeRequestCallback() + .then(resp => { + if (resp.status === statusCodes.NO_CONTENT) { + next(); + } else { + stop(resp); + } + }) + // If the request is cancelled by axios + // then consider it as noop so that its not + // caught by subsequent catches + .catch(thrown => (axios.isCancel(thrown) ? undefined : stop(thrown))); + }, PROMETHEUS_TIMEOUT); + +export const getDashboard = (dashboardEndpoint, params) => + cancellableBackOffRequest(() => axios.get(dashboardEndpoint, { params })).then( + axiosResponse => axiosResponse.data, + ); + +export const getPrometheusQueryData = (prometheusEndpoint, params, opts) => + cancellableBackOffRequest(() => axios.get(prometheusEndpoint, { params, ...opts })) + .then(axiosResponse => axiosResponse.data) + .then(prometheusResponse => prometheusResponse.data) + .catch(error => { + // Prometheus returns errors in specific cases + // https://prometheus.io/docs/prometheus/latest/querying/api/#format-overview + const { response = {} } = error; + if ( + response.status === statusCodes.BAD_REQUEST || + response.status === statusCodes.UNPROCESSABLE_ENTITY || + response.status === statusCodes.SERVICE_UNAVAILABLE + ) { + const { data } = response; + if (data?.status === 'error' && data?.error) { + throw new Error(data.error); + } + } + throw error; + }); |