85 lines
2.5 KiB
JavaScript
85 lines
2.5 KiB
JavaScript
import { omit } from 'lodash';
|
|
import createGqClient, { fetchPolicies } from '~/lib/graphql';
|
|
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
|
|
|
|
export const gqClient = createGqClient(
|
|
{},
|
|
{
|
|
fetchPolicy: fetchPolicies.NO_CACHE,
|
|
},
|
|
);
|
|
|
|
export const uniqMetricsId = metric => `${metric.metric_id}_${metric.id}`;
|
|
|
|
/**
|
|
* Project path has a leading slash that doesn't work well
|
|
* with project full path resolver here
|
|
* https://gitlab.com/gitlab-org/gitlab/blob/5cad4bd721ab91305af4505b2abc92b36a56ad6b/app/graphql/resolvers/full_path_resolver.rb#L10
|
|
*
|
|
* @param {String} str String with leading slash
|
|
* @returns {String}
|
|
*/
|
|
export const removeLeadingSlash = str => (str || '').replace(/^\/+/, '');
|
|
|
|
/**
|
|
* GraphQL environments API returns only id and name.
|
|
* For the environments dropdown we need metrics_path.
|
|
* This method parses the results and add neccessart attrs
|
|
*
|
|
* @param {Array} response Environments API result
|
|
* @param {String} projectPath Current project path
|
|
* @returns {Array}
|
|
*/
|
|
export const parseEnvironmentsResponse = (response = [], projectPath) =>
|
|
(response || []).map(env => {
|
|
const id = getIdFromGraphQLId(env.id);
|
|
return {
|
|
...env,
|
|
id,
|
|
metrics_path: `${projectPath}/environments/${id}/metrics`,
|
|
};
|
|
});
|
|
|
|
/**
|
|
* Metrics loaded from project-defined dashboards do not have a metric_id.
|
|
* This method creates a unique ID combining metric_id and id, if either is present.
|
|
* This is hopefully a temporary solution until BE processes metrics before passing to fE
|
|
* @param {Object} metric - metric
|
|
* @returns {Object} - normalized metric with a uniqueID
|
|
*/
|
|
|
|
export const normalizeMetric = (metric = {}) =>
|
|
omit(
|
|
{
|
|
...metric,
|
|
metric_id: uniqMetricsId(metric),
|
|
metricId: uniqMetricsId(metric),
|
|
},
|
|
'id',
|
|
);
|
|
|
|
export const normalizeQueryResult = timeSeries => {
|
|
let normalizedResult = {};
|
|
|
|
if (timeSeries.values) {
|
|
normalizedResult = {
|
|
...timeSeries,
|
|
values: timeSeries.values.map(([timestamp, value]) => [
|
|
new Date(timestamp * 1000).toISOString(),
|
|
Number(value),
|
|
]),
|
|
};
|
|
// Check result for empty data
|
|
normalizedResult.values = normalizedResult.values.filter(series => {
|
|
const hasValue = d => !Number.isNaN(d[1]) && (d[1] !== null || d[1] !== undefined);
|
|
return series.find(hasValue);
|
|
});
|
|
} else if (timeSeries.value) {
|
|
normalizedResult = {
|
|
...timeSeries,
|
|
value: [new Date(timeSeries.value[0] * 1000).toISOString(), Number(timeSeries.value[1])],
|
|
};
|
|
}
|
|
|
|
return normalizedResult;
|
|
};
|